Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoQml0bWFwLmNjCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA5LCAyMDEwIEFsYmVydCBBc3RhbHMgQ2lkIDxhYWNpZEBrZGUub3JnPgovLyBDb3B5cmlnaHQgKEMpIDIwMDcgSWxtYXJpIEhlaWtraW5lbiA8aWxtYXJpLmhlaWtraW5lbkBnbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAwOSBTaGVuIExpYW5nIDxzaGVuemh1eGlAZ21haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDkgU3RlZmFuIFRob21hcyA8dGhvbWFzQGVsb2FkMjQuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgQWRyaWFuIEpvaG5zb24gPGFqb2huc29uQHJlZG5lb24uY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgSGFycnkgUm9iZXJ0cyA8aGFycnkucm9iZXJ0c0BtaWRuaWdodC1sYWJzLm9yZz4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIENocmlzdGlhbiBGZXVlcnPkbmdlciA8Y2ZldWVyc2FlbmdlckBnb29nbGVtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIFdpbGxpYW0gQmFkZXIgPHdpbGxpYW1iYWRlckBob3RtYWlsLmNvbT4KLy8KLy8gVG8gc2VlIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNoYW5nZXMgcGxlYXNlIHNlZSB0aGUgQ2hhbmdlbG9nIGZpbGUgdGhhdAovLyBjYW1lIHdpdGggeW91ciB0YXJiYWxsIG9yIHR5cGUgbWFrZSBDaGFuZ2VMb2cgaWYgeW91IGFyZSBidWlsZGluZyBmcm9tIGdpdAovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2luY2x1ZGUgPGNvbmZpZy5oPgoKI2lmZGVmIFVTRV9HQ0NfUFJBR01BUwojcHJhZ21hIGltcGxlbWVudGF0aW9uCiNlbmRpZgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSAiZ29vL2dtZW0uaCIKI2luY2x1ZGUgIlNwbGFzaEVycm9yQ29kZXMuaCIKI2luY2x1ZGUgIlNwbGFzaEJpdG1hcC5oIgojaW5jbHVkZSAicG9wcGxlci9FcnJvci5oIgojaW5jbHVkZSAiZ29vL0pwZWdXcml0ZXIuaCIKI2luY2x1ZGUgImdvby9QTkdXcml0ZXIuaCIKI2luY2x1ZGUgImdvby9UaWZmV3JpdGVyLmgiCiNpbmNsdWRlICJnb28vSW1nV3JpdGVyLmgiCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTcGxhc2hCaXRtYXAKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClNwbGFzaEJpdG1hcDo6U3BsYXNoQml0bWFwKGludCB3aWR0aEEsIGludCBoZWlnaHRBLCBpbnQgcm93UGFkQSwKCQkJICAgU3BsYXNoQ29sb3JNb2RlIG1vZGVBLCBHQm9vbCBhbHBoYUEsCgkJCSAgIEdCb29sIHRvcERvd24pIHsKICB3aWR0aCA9IHdpZHRoQTsKICBoZWlnaHQgPSBoZWlnaHRBOwogIG1vZGUgPSBtb2RlQTsKICByb3dQYWQgPSByb3dQYWRBOwogIHN3aXRjaCAobW9kZSkgewogIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgaWYgKHdpZHRoID4gMCkgewogICAgICByb3dTaXplID0gKHdpZHRoICsgNykgPj4gMzsKICAgIH0gZWxzZSB7CiAgICAgIHJvd1NpemUgPSAtMTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZU1vbm84OgogICAgaWYgKHdpZHRoID4gMCkgewogICAgICByb3dTaXplID0gd2lkdGg7CiAgICB9IGVsc2UgewogICAgICByb3dTaXplID0gLTE7CiAgICB9CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVSR0I4OgogIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICBpZiAod2lkdGggPiAwICYmIHdpZHRoIDw9IElOVF9NQVggLyAzKSB7CiAgICAgIHJvd1NpemUgPSB3aWR0aCAqIDM7CiAgICB9IGVsc2UgewogICAgICByb3dTaXplID0gLTE7CiAgICB9CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgIGlmICh3aWR0aCA+IDAgJiYgd2lkdGggPD0gSU5UX01BWCAvIDQpIHsKICAgICAgcm93U2l6ZSA9IHdpZHRoICogNDsKICAgIH0gZWxzZSB7CiAgICAgIHJvd1NpemUgPSAtMTsKICAgIH0KICAgIGJyZWFrOwojaWYgU1BMQVNIX0NNWUsKICBjYXNlIHNwbGFzaE1vZGVDTVlLODoKICAgIGlmICh3aWR0aCA+IDAgJiYgd2lkdGggPD0gSU5UX01BWCAvIDQpIHsKICAgICAgcm93U2l6ZSA9IHdpZHRoICogNDsKICAgIH0gZWxzZSB7CiAgICAgIHJvd1NpemUgPSAtMTsKICAgIH0KICAgIGJyZWFrOwojZW5kaWYKICB9CiAgaWYgKHJvd1NpemUgPiAwKSB7CiAgICByb3dTaXplICs9IHJvd1BhZCAtIDE7CiAgICByb3dTaXplIC09IHJvd1NpemUgJSByb3dQYWQ7CiAgfQogIGRhdGEgPSAoU3BsYXNoQ29sb3JQdHIpZ21hbGxvY24ocm93U2l6ZSwgaGVpZ2h0KTsKICBpZiAoIXRvcERvd24pIHsKICAgIGRhdGEgKz0gKGhlaWdodCAtIDEpICogcm93U2l6ZTsKICAgIHJvd1NpemUgPSAtcm93U2l6ZTsKICB9CiAgaWYgKGFscGhhQSkgewogICAgYWxwaGEgPSAoR3VjaGFyICopZ21hbGxvY24od2lkdGgsIGhlaWdodCk7CiAgfSBlbHNlIHsKICAgIGFscGhhID0gTlVMTDsKICB9Cn0KCgpTcGxhc2hCaXRtYXA6On5TcGxhc2hCaXRtYXAoKSB7CiAgaWYgKHJvd1NpemUgPCAwKSB7CiAgICBnZnJlZShkYXRhICsgKGhlaWdodCAtIDEpICogcm93U2l6ZSk7CiAgfSBlbHNlIHsKICAgIGdmcmVlKGRhdGEpOwogIH0KICBnZnJlZShhbHBoYSk7Cn0KCgpTcGxhc2hFcnJvciBTcGxhc2hCaXRtYXA6OndyaXRlUE5NRmlsZShjaGFyICpmaWxlTmFtZSkgewogIEZJTEUgKmY7CiAgU3BsYXNoRXJyb3IgZTsKCiAgaWYgKCEoZiA9IGZvcGVuKGZpbGVOYW1lLCAid2IiKSkpIHsKICAgIHJldHVybiBzcGxhc2hFcnJPcGVuRmlsZTsKICB9CgogIGUgPSB0aGlzLT53cml0ZVBOTUZpbGUoZik7CiAgCiAgZmNsb3NlKGYpOwogIHJldHVybiBlOwp9CgoKU3BsYXNoRXJyb3IgU3BsYXNoQml0bWFwOjp3cml0ZVBOTUZpbGUoRklMRSAqZikgewogIFNwbGFzaENvbG9yUHRyIHJvdywgcDsKICBpbnQgeCwgeTsKCiAgc3dpdGNoIChtb2RlKSB7CgogIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgZnByaW50ZihmLCAiUDRcbiVkICVkXG4iLCB3aWR0aCwgaGVpZ2h0KTsKICAgIHJvdyA9IGRhdGE7CiAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgcCA9IHJvdzsKICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDgpIHsKCWZwdXRjKCpwIF4gMHhmZiwgZik7CgkrK3A7CiAgICAgIH0KICAgICAgcm93ICs9IHJvd1NpemU7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBzcGxhc2hNb2RlTW9ubzg6CiAgICBmcHJpbnRmKGYsICJQNVxuJWQgJWRcbjI1NVxuIiwgd2lkdGgsIGhlaWdodCk7CiAgICByb3cgPSBkYXRhOwogICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgIHAgPSByb3c7CiAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CglmcHV0YygqcCwgZik7CgkrK3A7CiAgICAgIH0KICAgICAgcm93ICs9IHJvd1NpemU7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICAgIGZwcmludGYoZiwgIlA2XG4lZCAlZFxuMjU1XG4iLCB3aWR0aCwgaGVpZ2h0KTsKICAgIHJvdyA9IGRhdGE7CiAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgcCA9IHJvdzsKICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKCWZwdXRjKHNwbGFzaFJHQjhSKHApLCBmKTsKCWZwdXRjKHNwbGFzaFJHQjhHKHApLCBmKTsKCWZwdXRjKHNwbGFzaFJHQjhCKHApLCBmKTsKCXAgKz0gMzsKICAgICAgfQogICAgICByb3cgKz0gcm93U2l6ZTsKICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgIGZwcmludGYoZiwgIlA2XG4lZCAlZFxuMjU1XG4iLCB3aWR0aCwgaGVpZ2h0KTsKICAgIHJvdyA9IGRhdGE7CiAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgcCA9IHJvdzsKICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKCWZwdXRjKHNwbGFzaEJHUjhSKHApLCBmKTsKCWZwdXRjKHNwbGFzaEJHUjhHKHApLCBmKTsKCWZwdXRjKHNwbGFzaEJHUjhCKHApLCBmKTsKCXAgKz0gNDsKICAgICAgfQogICAgICByb3cgKz0gcm93U2l6ZTsKICAgIH0KICAgIGJyZWFrOwoKCiAgY2FzZSBzcGxhc2hNb2RlQkdSODoKICAgIGZwcmludGYoZiwgIlA2XG4lZCAlZFxuMjU1XG4iLCB3aWR0aCwgaGVpZ2h0KTsKICAgIHJvdyA9IGRhdGE7CiAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgcCA9IHJvdzsKICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKCWZwdXRjKHNwbGFzaEJHUjhSKHApLCBmKTsKCWZwdXRjKHNwbGFzaEJHUjhHKHApLCBmKTsKCWZwdXRjKHNwbGFzaEJHUjhCKHApLCBmKTsKCXAgKz0gMzsKICAgICAgfQogICAgICByb3cgKz0gcm93U2l6ZTsKICAgIH0KICAgIGJyZWFrOwoKI2lmIFNQTEFTSF9DTVlLCiAgY2FzZSBzcGxhc2hNb2RlQ01ZSzg6CiAgICAvLyBQTk0gZG9lc24ndCBzdXBwb3J0IENNWUsKICAgIGVycm9yKC0xLCAidW5zdXBwb3J0ZWQgU3BsYXNoQml0bWFwIG1vZGUiKTsKICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogICAgYnJlYWs7CiNlbmRpZgogIH0KICByZXR1cm4gc3BsYXNoT2s7Cn0KCgp2b2lkIFNwbGFzaEJpdG1hcDo6Z2V0UGl4ZWwoaW50IHgsIGludCB5LCBTcGxhc2hDb2xvclB0ciBwaXhlbCkgewogIFNwbGFzaENvbG9yUHRyIHA7CgogIGlmICh5IDwgMCB8fCB5ID49IGhlaWdodCB8fCB4IDwgMCB8fCB4ID49IHdpZHRoKSB7CiAgICByZXR1cm47CiAgfQogIHN3aXRjaCAobW9kZSkgewogIGNhc2Ugc3BsYXNoTW9kZU1vbm8xOgogICAgcCA9ICZkYXRhW3kgKiByb3dTaXplICsgKHggPj4gMyldOwogICAgcGl4ZWxbMF0gPSAocFswXSAmICgweDgwID4+ICh4ICYgNykpKSA/IDB4ZmYgOiAweDAwOwogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzg6CiAgICBwID0gJmRhdGFbeSAqIHJvd1NpemUgKyB4XTsKICAgIHBpeGVsWzBdID0gcFswXTsKICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgICBwID0gJmRhdGFbeSAqIHJvd1NpemUgKyAzICogeF07CiAgICBwaXhlbFswXSA9IHBbMF07CiAgICBwaXhlbFsxXSA9IHBbMV07CiAgICBwaXhlbFsyXSA9IHBbMl07CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgIHAgPSAmZGF0YVt5ICogcm93U2l6ZSArIDQgKiB4XTsKICAgIHBpeGVsWzBdID0gcFsyXTsKICAgIHBpeGVsWzFdID0gcFsxXTsKICAgIHBpeGVsWzJdID0gcFswXTsKICAgIHBpeGVsWzNdID0gcFszXTsKICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZUJHUjg6CiAgICBwID0gJmRhdGFbeSAqIHJvd1NpemUgKyAzICogeF07CiAgICBwaXhlbFswXSA9IHBbMl07CiAgICBwaXhlbFsxXSA9IHBbMV07CiAgICBwaXhlbFsyXSA9IHBbMF07CiAgICBicmVhazsKI2lmIFNQTEFTSF9DTVlLCiAgY2FzZSBzcGxhc2hNb2RlQ01ZSzg6CiAgICBwID0gJmRhdGFbeSAqIHJvd1NpemUgKyA0ICogeF07CiAgICBwaXhlbFswXSA9IHBbMF07CiAgICBwaXhlbFsxXSA9IHBbMV07CiAgICBwaXhlbFsyXSA9IHBbMl07CiAgICBwaXhlbFszXSA9IHBbM107CiAgICBicmVhazsKI2VuZGlmCiAgfQp9CgpHdWNoYXIgU3BsYXNoQml0bWFwOjpnZXRBbHBoYShpbnQgeCwgaW50IHkpIHsKICByZXR1cm4gYWxwaGFbeSAqIHdpZHRoICsgeF07Cn0KClNwbGFzaEVycm9yIFNwbGFzaEJpdG1hcDo6d3JpdGVJbWdGaWxlKFNwbGFzaEltYWdlRmlsZUZvcm1hdCBmb3JtYXQsIGNoYXIgKmZpbGVOYW1lLCBpbnQgaERQSSwgaW50IHZEUEksIGNvbnN0IGNoYXIgKmNvbXByZXNzaW9uU3RyaW5nKSB7CiAgRklMRSAqZjsKICBTcGxhc2hFcnJvciBlOwoKICBpZiAoIShmID0gZm9wZW4oZmlsZU5hbWUsICJ3YiIpKSkgewogICAgcmV0dXJuIHNwbGFzaEVyck9wZW5GaWxlOwogIH0KCiAgZSA9IHdyaXRlSW1nRmlsZShmb3JtYXQsIGYsIGhEUEksIHZEUEksIGNvbXByZXNzaW9uU3RyaW5nKTsKICAKICBmY2xvc2UoZik7CiAgcmV0dXJuIGU7Cn0KClNwbGFzaEVycm9yIFNwbGFzaEJpdG1hcDo6d3JpdGVJbWdGaWxlKFNwbGFzaEltYWdlRmlsZUZvcm1hdCBmb3JtYXQsIEZJTEUgKmYsIGludCBoRFBJLCBpbnQgdkRQSSwgY29uc3QgY2hhciAqY29tcHJlc3Npb25TdHJpbmcpIHsKICBJbWdXcml0ZXIgKndyaXRlcjsKCVNwbGFzaEVycm9yIGU7CiAgCiAgc3dpdGNoIChmb3JtYXQpIHsKICAgICNpZmRlZiBFTkFCTEVfTElCUE5HCiAgICBjYXNlIHNwbGFzaEZvcm1hdFBuZzoKCSAgd3JpdGVyID0gbmV3IFBOR1dyaXRlcigpOwogICAgICBicmVhazsKICAgICNlbmRpZgoKICAgICNpZmRlZiBFTkFCTEVfTElCSlBFRwogICAgY2FzZSBzcGxhc2hGb3JtYXRKcGVnOgogICAgICB3cml0ZXIgPSBuZXcgSnBlZ1dyaXRlcigpOwogICAgICBicmVhazsKICAgICNlbmRpZgoJCiAgICAjaWZkZWYgRU5BQkxFX0xJQlRJRkYKICAgIGNhc2Ugc3BsYXNoRm9ybWF0VGlmZjoKICAgICAgd3JpdGVyID0gbmV3IFRpZmZXcml0ZXIoKTsKICAgICAgaWYgKHdyaXRlcikgewogICAgICAgICgoVGlmZldyaXRlciAqKXdyaXRlciktPnNldENvbXByZXNzaW9uU3RyaW5nKGNvbXByZXNzaW9uU3RyaW5nKTsKICAgICAgICAoKFRpZmZXcml0ZXIgKil3cml0ZXIpLT5zZXRTcGxhc2hNb2RlKG1vZGUpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgI2VuZGlmCgogICAgZGVmYXVsdDoKICAgICAgLy8gTm90IHRoZSBncmVhdGVzdCBlcnJvciBtZXNzYWdlLCBidXQgdXNlcnMgb2YgdGhpcyBmdW5jdGlvbiBzaG91bGQKICAgICAgLy8gaGF2ZSBhbHJlYWR5IGNoZWNrZWQgd2hldGhlciB0aGVpciBkZXNpcmVkIGZvcm1hdCBpcyBjb21waWxlZCBpbi4KICAgICAgZXJyb3IoLTEsICJTdXBwb3J0IGZvciB0aGlzIGltYWdlIHR5cGUgbm90IGNvbXBpbGVkIGluIik7CiAgICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogIH0KCgllID0gd3JpdGVJbWdGaWxlKHdyaXRlciwgZiwgaERQSSwgdkRQSSk7CglkZWxldGUgd3JpdGVyOwoJcmV0dXJuIGU7Cn0KClNwbGFzaEVycm9yIFNwbGFzaEJpdG1hcDo6d3JpdGVJbWdGaWxlKEltZ1dyaXRlciAqd3JpdGVyLCBGSUxFICpmLCBpbnQgaERQSSwgaW50IHZEUEkpIHsKICBpZiAobW9kZSAhPSBzcGxhc2hNb2RlUkdCOCAmJiBtb2RlICE9IHNwbGFzaE1vZGVNb25vOCAmJiBtb2RlICE9IHNwbGFzaE1vZGVNb25vMSAmJiBtb2RlICE9IHNwbGFzaE1vZGVYQkdSOCkgewogICAgZXJyb3IoLTEsICJ1bnN1cHBvcnRlZCBTcGxhc2hCaXRtYXAgbW9kZSIpOwogICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgfQoKICBpZiAoIXdyaXRlci0+aW5pdChmLCB3aWR0aCwgaGVpZ2h0LCBoRFBJLCB2RFBJKSkgewogICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgfQoKICBzd2l0Y2ggKG1vZGUpIHsKICAgIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgICB7CiAgICAgIFNwbGFzaENvbG9yUHRyIHJvdzsKICAgICAgdW5zaWduZWQgY2hhciAqKnJvd19wb2ludGVycyA9IG5ldyB1bnNpZ25lZCBjaGFyKltoZWlnaHRdOwogICAgICByb3cgPSBkYXRhOwoKICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewogICAgICAgIHJvd19wb2ludGVyc1t5XSA9IHJvdzsKICAgICAgICByb3cgKz0gcm93U2l6ZTsKICAgICAgfQogICAgICBpZiAoIXdyaXRlci0+d3JpdGVQb2ludGVycyhyb3dfcG9pbnRlcnMsIGhlaWdodCkpIHsKICAgICAgICBkZWxldGVbXSByb3dfcG9pbnRlcnM7CiAgICAgICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgICAgIH0KICAgICAgZGVsZXRlW10gcm93X3BvaW50ZXJzOwogICAgfQogICAgYnJlYWs7CiAgICAKICAgIGNhc2Ugc3BsYXNoTW9kZVhCR1I4OgogICAgewogICAgICB1bnNpZ25lZCBjaGFyICpyb3cgPSBuZXcgdW5zaWduZWQgY2hhclszICogd2lkdGhdOwogICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CiAgICAgICAgLy8gQ29udmVydCBpbnRvIGEgUE5HIHJvdwogICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICAgICAgcm93WzMqeF0gPSBkYXRhW3kgKiByb3dTaXplICsgeCAqIDQgKyAyXTsKICAgICAgICAgIHJvd1szKngrMV0gPSBkYXRhW3kgKiByb3dTaXplICsgeCAqIDQgKyAxXTsKICAgICAgICAgIHJvd1szKngrMl0gPSBkYXRhW3kgKiByb3dTaXplICsgeCAqIDRdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCF3cml0ZXItPndyaXRlUm93KCZyb3cpKSB7CiAgICAgICAgICBkZWxldGVbXSByb3c7CiAgICAgICAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICAgICAgICB9CiAgICAgIH0KICAgICAgZGVsZXRlW10gcm93OwogICAgfQogICAgYnJlYWs7CiAgICAKICAgIGNhc2Ugc3BsYXNoTW9kZU1vbm84OgogICAgewogICAgICB1bnNpZ25lZCBjaGFyICpyb3cgPSBuZXcgdW5zaWduZWQgY2hhclszICogd2lkdGhdOwogICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CiAgICAgICAgLy8gQ29udmVydCBpbnRvIGEgUE5HIHJvdwogICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICAgICAgcm93WzMqeF0gPSBkYXRhW3kgKiByb3dTaXplICsgeF07CiAgICAgICAgICByb3dbMyp4KzFdID0gZGF0YVt5ICogcm93U2l6ZSArIHhdOwogICAgICAgICAgcm93WzMqeCsyXSA9IGRhdGFbeSAqIHJvd1NpemUgKyB4XTsKICAgICAgICB9CgogICAgICAgIGlmICghd3JpdGVyLT53cml0ZVJvdygmcm93KSkgewogICAgICAgICAgZGVsZXRlW10gcm93OwogICAgICAgICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgICAgICAgfQogICAgICB9CiAgICAgIGRlbGV0ZVtdIHJvdzsKICAgIH0KICAgIGJyZWFrOwogICAgCiAgICBjYXNlIHNwbGFzaE1vZGVNb25vMToKICAgIHsKICAgICAgdW5zaWduZWQgY2hhciAqcm93ID0gbmV3IHVuc2lnbmVkIGNoYXJbMyAqIHdpZHRoXTsKICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewogICAgICAgIC8vIENvbnZlcnQgaW50byBhIFBORyByb3cKICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKICAgICAgICAgIGdldFBpeGVsKHgsIHksICZyb3dbMyp4XSk7CiAgICAgICAgICByb3dbMyp4KzFdID0gcm93WzMqeF07CiAgICAgICAgICByb3dbMyp4KzJdID0gcm93WzMqeF07CiAgICAgICAgfQoKICAgICAgICBpZiAoIXdyaXRlci0+d3JpdGVSb3coJnJvdykpIHsKICAgICAgICAgIGRlbGV0ZVtdIHJvdzsKICAgICAgICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogICAgICAgIH0KICAgICAgfQogICAgICBkZWxldGVbXSByb3c7CiAgICB9CiAgICBicmVhazsKICAgIAogICAgZGVmYXVsdDoKICAgIC8vIGNhbid0IGhhcHBlbgogICAgYnJlYWs7CiAgfQogIAogIGlmICh3cml0ZXItPmNsb3NlKCkpIHsKICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogIH0KCiAgcmV0dXJuIHNwbGFzaE9rOwp9Cg==