Ly89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NLy8NLy8gysrKysrKysrKysrKysrKysrKyspUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0vLw0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLg0vLw0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0NLy8gPGZ1bmN0aW9uYWw+DQ0vLyByZWZlcmVuY2Vfd3JhcHBlcg0NLy8gdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ1R5cGVzPiANLy8gICByZXF1aXJlcyBDYWxsYWJsZTxULCBBcmdUeXBlcyYmLi4uPiANLy8gICBDYWxsYWJsZTxULCBBcmdUeXBlcyYmLi4uPjo6cmVzdWx0X3R5cGUgDS8vICAgb3BlcmF0b3IoKShBcmdUeXBlcyYmLi4uIGFyZ3MpIGNvbnN0Ow0NI2luY2x1ZGUgPGZ1bmN0aW9uYWw+DSNpbmNsdWRlIDxjYXNzZXJ0Pg0NaW50IGNvdW50ID0gMDsNDS8vIDEgYXJnLCByZXR1cm4gdm9pZA0Ndm9pZCBmX3ZvaWRfMShpbnQgaSkNew0gICAgY291bnQgKz0gaTsNfQ0Nc3RydWN0IEFfdm9pZF8xDXsNICAgIHZvaWQgb3BlcmF0b3IoKShpbnQgaSkNICAgIHsNICAgICAgICBjb3VudCArPSBpOw0gICAgfQ0NICAgIHZvaWQgbWVtMSgpIHsrK2NvdW50O30NICAgIHZvaWQgbWVtMigpIGNvbnN0IHsrK2NvdW50O30NfTsNDXZvaWQNdGVzdF92b2lkXzEoKQ17DSAgICBpbnQgc2F2ZV9jb3VudCA9IGNvdW50Ow0gICAgLy8gZnVuY3Rpb24NICAgIHsNICAgIHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8dm9pZCAoaW50KT4gcjEoZl92b2lkXzEpOw0gICAgaW50IGkgPSAyOw0gICAgcjEoaSk7DSAgICBhc3NlcnQoY291bnQgPT0gc2F2ZV9jb3VudCsyKTsNICAgIHNhdmVfY291bnQgPSBjb3VudDsNICAgIH0NICAgIC8vIGZ1bmN0aW9uIHBvaW50ZXINICAgIHsNICAgIHZvaWQgKCpmcCkoaW50KSA9IGZfdm9pZF8xOw0gICAgc3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjx2b2lkICgqKShpbnQpPiByMShmcCk7DSAgICBpbnQgaSA9IDM7DSAgICByMShpKTsNICAgIGFzc2VydChjb3VudCA9PSBzYXZlX2NvdW50KzMpOw0gICAgc2F2ZV9jb3VudCA9IGNvdW50Ow0gICAgfQ0gICAgLy8gZnVuY3Rvcg0gICAgew0gICAgQV92b2lkXzEgYTA7DSAgICBzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEFfdm9pZF8xPiByMShhMCk7DSAgICBpbnQgaSA9IDQ7DSAgICByMShpKTsNICAgIGFzc2VydChjb3VudCA9PSBzYXZlX2NvdW50KzQpOw0gICAgc2F2ZV9jb3VudCA9IGNvdW50Ow0gICAgfQ0gICAgLy8gbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXINICAgIHsNICAgIHZvaWQgKEFfdm9pZF8xOjoqZnApKCkgPSAmQV92b2lkXzE6Om1lbTE7DSAgICBzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPHZvaWQgKEFfdm9pZF8xOjoqKSgpPiByMShmcCk7DSAgICBBX3ZvaWRfMSBhOw0gICAgcjEoYSk7DSAgICBhc3NlcnQoY291bnQgPT0gc2F2ZV9jb3VudCsxKTsNICAgIHNhdmVfY291bnQgPSBjb3VudDsNICAgIEFfdm9pZF8xKiBhcCA9ICZhOw0gICAgcjEoYXApOw0gICAgYXNzZXJ0KGNvdW50ID09IHNhdmVfY291bnQrMSk7DSAgICBzYXZlX2NvdW50ID0gY291bnQ7DSAgICB9DSAgICAvLyBjb25zdCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcg0gICAgew0gICAgdm9pZCAoQV92b2lkXzE6OipmcCkoKSBjb25zdCA9ICZBX3ZvaWRfMTo6bWVtMjsNICAgIHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8dm9pZCAoQV92b2lkXzE6OiopKCkgY29uc3Q+IHIxKGZwKTsNICAgIEFfdm9pZF8xIGE7DSAgICByMShhKTsNICAgIGFzc2VydChjb3VudCA9PSBzYXZlX2NvdW50KzEpOw0gICAgc2F2ZV9jb3VudCA9IGNvdW50Ow0gICAgQV92b2lkXzEqIGFwID0gJmE7DSAgICByMShhcCk7DSAgICBhc3NlcnQoY291bnQgPT0gc2F2ZV9jb3VudCsxKTsNICAgIHNhdmVfY291bnQgPSBjb3VudDsNICAgIH0NfQ0NLy8gMSBhcmcsIHJldHVybiBpbnQNDWludCBmX2ludF8xKGludCBpKQ17DSAgICByZXR1cm4gaSArIDE7DX0NDXN0cnVjdCBBX2ludF8xDXsNICAgIEFfaW50XzEoKSA6IGRhdGFfKDUpIHt9DSAgICBpbnQgb3BlcmF0b3IoKShpbnQgaSkNICAgIHsNICAgICAgICByZXR1cm4gaSAtIDE7DSAgICB9DQ0gICAgaW50IG1lbTEoKSB7cmV0dXJuIDM7fQ0gICAgaW50IG1lbTIoKSBjb25zdCB7cmV0dXJuIDQ7fQ0gICAgaW50IGRhdGFfOw19Ow0Ndm9pZA10ZXN0X2ludF8xKCkNew0gICAgLy8gZnVuY3Rpb24NICAgIHsNICAgIHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8aW50IChpbnQpPiByMShmX2ludF8xKTsNICAgIGludCBpID0gMjsNICAgIGFzc2VydChyMShpKSA9PSAzKTsNICAgIH0NICAgIC8vIGZ1bmN0aW9uIHBvaW50ZXINICAgIHsNICAgIGludCAoKmZwKShpbnQpID0gZl9pbnRfMTsNICAgIHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8aW50ICgqKShpbnQpPiByMShmcCk7DSAgICBpbnQgaSA9IDM7DSAgICBhc3NlcnQocjEoaSkgPT0gNCk7DSAgICB9DSAgICAvLyBmdW5jdG9yDSAgICB7DSAgICBBX2ludF8xIGEwOw0gICAgc3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxBX2ludF8xPiByMShhMCk7DSAgICBpbnQgaSA9IDQ7DSAgICBhc3NlcnQocjEoaSkgPT0gMyk7DSAgICB9DSAgICAvLyBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcg0gICAgew0gICAgaW50IChBX2ludF8xOjoqZnApKCkgPSAmQV9pbnRfMTo6bWVtMTsNICAgIHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8aW50IChBX2ludF8xOjoqKSgpPiByMShmcCk7DSAgICBBX2ludF8xIGE7DSAgICBhc3NlcnQocjEoYSkgPT0gMyk7DSAgICBBX2ludF8xKiBhcCA9ICZhOw0gICAgYXNzZXJ0KHIxKGFwKSA9PSAzKTsNICAgIH0NICAgIC8vIGNvbnN0IG1lbWJlciBmdW5jdGlvbiBwb2ludGVyDSAgICB7DSAgICBpbnQgKEFfaW50XzE6OipmcCkoKSBjb25zdCA9ICZBX2ludF8xOjptZW0yOw0gICAgc3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxpbnQgKEFfaW50XzE6OiopKCkgY29uc3Q+IHIxKGZwKTsNICAgIEFfaW50XzEgYTsNICAgIGFzc2VydChyMShhKSA9PSA0KTsNICAgIEFfaW50XzEqIGFwID0gJmE7DSAgICBhc3NlcnQocjEoYXApID09IDQpOw0gICAgfQ0gICAgLy8gbWVtYmVyIGRhdGEgcG9pbnRlcg0gICAgew0gICAgaW50IEFfaW50XzE6OipmcCA9ICZBX2ludF8xOjpkYXRhXzsNICAgIHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8aW50IEFfaW50XzE6Oio+IHIxKGZwKTsNICAgIEFfaW50XzEgYTsNICAgIGFzc2VydChyMShhKSA9PSA1KTsNICAgIHIxKGEpID0gNjsNICAgIGFzc2VydChyMShhKSA9PSA2KTsNICAgIEFfaW50XzEqIGFwID0gJmE7DSAgICBhc3NlcnQocjEoYXApID09IDYpOw0gICAgcjEoYXApID0gNzsNICAgIGFzc2VydChyMShhcCkgPT0gNyk7DSAgICB9DX0NDS8vIDIgYXJnLCByZXR1cm4gdm9pZA0Ndm9pZCBmX3ZvaWRfMihpbnQgaSwgaW50IGopDXsNICAgIGNvdW50ICs9IGkrajsNfQ0Nc3RydWN0IEFfdm9pZF8yDXsNICAgIHZvaWQgb3BlcmF0b3IoKShpbnQgaSwgaW50IGopDSAgICB7DSAgICAgICAgY291bnQgKz0gaStqOw0gICAgfQ0NICAgIHZvaWQgbWVtMShpbnQgaSkge2NvdW50ICs9IGk7fQ0gICAgdm9pZCBtZW0yKGludCBpKSBjb25zdCB7Y291bnQgKz0gaTt9DX07DQ12b2lkDXRlc3Rfdm9pZF8yKCkNew0gICAgaW50IHNhdmVfY291bnQgPSBjb3VudDsNICAgIC8vIGZ1bmN0aW9uDSAgICB7DSAgICBzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPHZvaWQgKGludCwgaW50KT4gcjEoZl92b2lkXzIpOw0gICAgaW50IGkgPSAyOw0gICAgaW50IGogPSAzOw0gICAgcjEoaSwgaik7DSAgICBhc3NlcnQoY291bnQgPT0gc2F2ZV9jb3VudCs1KTsNICAgIHNhdmVfY291bnQgPSBjb3VudDsNICAgIH0NICAgIC8vIGZ1bmN0aW9uIHBvaW50ZXINICAgIHsNICAgIHZvaWQgKCpmcCkoaW50LCBpbnQpID0gZl92b2lkXzI7DSAgICBzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPHZvaWQgKCopKGludCwgaW50KT4gcjEoZnApOw0gICAgaW50IGkgPSAzOw0gICAgaW50IGogPSA0Ow0gICAgcjEoaSwgaik7DSAgICBhc3NlcnQoY291bnQgPT0gc2F2ZV9jb3VudCs3KTsNICAgIHNhdmVfY291bnQgPSBjb3VudDsNICAgIH0NICAgIC8vIGZ1bmN0b3INICAgIHsNICAgIEFfdm9pZF8yIGEwOw0gICAgc3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxBX3ZvaWRfMj4gcjEoYTApOw0gICAgaW50IGkgPSA0Ow0gICAgaW50IGogPSA1Ow0gICAgcjEoaSwgaik7DSAgICBhc3NlcnQoY291bnQgPT0gc2F2ZV9jb3VudCs5KTsNICAgIHNhdmVfY291bnQgPSBjb3VudDsNICAgIH0NICAgIC8vIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyDSAgICB7DSAgICB2b2lkIChBX3ZvaWRfMjo6KmZwKShpbnQpID0gJkFfdm9pZF8yOjptZW0xOw0gICAgc3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjx2b2lkIChBX3ZvaWRfMjo6KikoaW50KT4gcjEoZnApOw0gICAgQV92b2lkXzIgYTsNICAgIGludCBpID0gMzsNICAgIHIxKGEsIGkpOw0gICAgYXNzZXJ0KGNvdW50ID09IHNhdmVfY291bnQrMyk7DSAgICBzYXZlX2NvdW50ID0gY291bnQ7DSAgICBBX3ZvaWRfMiogYXAgPSAmYTsNICAgIHIxKGFwLCBpKTsNICAgIGFzc2VydChjb3VudCA9PSBzYXZlX2NvdW50KzMpOw0gICAgc2F2ZV9jb3VudCA9IGNvdW50Ow0gICAgfQ0gICAgLy8gY29uc3QgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXINICAgIHsNICAgIHZvaWQgKEFfdm9pZF8yOjoqZnApKGludCkgY29uc3QgPSAmQV92b2lkXzI6Om1lbTI7DSAgICBzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPHZvaWQgKEFfdm9pZF8yOjoqKShpbnQpIGNvbnN0PiByMShmcCk7DSAgICBBX3ZvaWRfMiBhOw0gICAgaW50IGkgPSA0Ow0gICAgcjEoYSwgaSk7DSAgICBhc3NlcnQoY291bnQgPT0gc2F2ZV9jb3VudCs0KTsNICAgIHNhdmVfY291bnQgPSBjb3VudDsNICAgIEFfdm9pZF8yKiBhcCA9ICZhOw0gICAgcjEoYXAsIGkpOw0gICAgYXNzZXJ0KGNvdW50ID09IHNhdmVfY291bnQrNCk7DSAgICBzYXZlX2NvdW50ID0gY291bnQ7DSAgICB9DX0NDS8vIDIgYXJnLCByZXR1cm4gaW50DQ1pbnQgZl9pbnRfMihpbnQgaSwgaW50IGopDXsNICAgIHJldHVybiBpK2o7DX0NDXN0cnVjdCBBX2ludF8yDXsNICAgIGludCBvcGVyYXRvcigpKGludCBpLCBpbnQgaikNICAgIHsNICAgICAgICByZXR1cm4gaStqOw0gICAgfQ0NICAgIGludCBtZW0xKGludCBpKSB7cmV0dXJuIGkrMTt9DSAgICBpbnQgbWVtMihpbnQgaSkgY29uc3Qge3JldHVybiBpKzI7fQ19Ow0Ndm9pZA10ZXN0aW50XzIoKQ17DSAgICAvLyBmdW5jdGlvbg0gICAgew0gICAgc3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxpbnQgKGludCwgaW50KT4gcjEoZl9pbnRfMik7DSAgICBpbnQgaSA9IDI7DSAgICBpbnQgaiA9IDM7DSAgICBhc3NlcnQocjEoaSwgaikgPT0gaStqKTsNICAgIH0NICAgIC8vIGZ1bmN0aW9uIHBvaW50ZXINICAgIHsNICAgIGludCAoKmZwKShpbnQsIGludCkgPSBmX2ludF8yOw0gICAgc3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxpbnQgKCopKGludCwgaW50KT4gcjEoZnApOw0gICAgaW50IGkgPSAzOw0gICAgaW50IGogPSA0Ow0gICAgYXNzZXJ0KHIxKGksIGopID09IGkraik7DSAgICB9DSAgICAvLyBmdW5jdG9yDSAgICB7DSAgICBBX2ludF8yIGEwOw0gICAgc3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxBX2ludF8yPiByMShhMCk7DSAgICBpbnQgaSA9IDQ7DSAgICBpbnQgaiA9IDU7DSAgICBhc3NlcnQocjEoaSwgaikgPT0gaStqKTsNICAgIH0NICAgIC8vIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyDSAgICB7DSAgICBpbnQoQV9pbnRfMjo6KmZwKShpbnQpID0gJkFfaW50XzI6Om1lbTE7DSAgICBzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPGludCAoQV9pbnRfMjo6KikoaW50KT4gcjEoZnApOw0gICAgQV9pbnRfMiBhOw0gICAgaW50IGkgPSAzOw0gICAgYXNzZXJ0KHIxKGEsIGkpID09IGkrMSk7DSAgICBBX2ludF8yKiBhcCA9ICZhOw0gICAgYXNzZXJ0KHIxKGFwLCBpKSA9PSBpKzEpOw0gICAgfQ0gICAgLy8gY29uc3QgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXINICAgIHsNICAgIGludCAoQV9pbnRfMjo6KmZwKShpbnQpIGNvbnN0ID0gJkFfaW50XzI6Om1lbTI7DSAgICBzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPGludCAoQV9pbnRfMjo6KikoaW50KSBjb25zdD4gcjEoZnApOw0gICAgQV9pbnRfMiBhOw0gICAgaW50IGkgPSA0Ow0gICAgYXNzZXJ0KHIxKGEsIGkpID09IGkrMik7DSAgICBBX2ludF8yKiBhcCA9ICZhOw0gICAgYXNzZXJ0KHIxKGFwLCBpKSA9PSBpKzIpOw0gICAgfQ19DQ1pbnQgbWFpbigpDXsNICAgIHRlc3Rfdm9pZF8xKCk7DSAgICB0ZXN0X2ludF8xKCk7DSAgICB0ZXN0X3ZvaWRfMigpOw0gICAgdGVzdGludF8yKCk7DX0N