I2luY2x1ZGUgInJhci5ocHAiCgovLyBXZSB1c2VkICJTY3JlYW1pbmcgRmFzdCBHYWxvaXMgRmllbGQgQXJpdGhtZXRpYyBVc2luZyBJbnRlbCBTSU1ECi8vIEluc3RydWN0aW9ucyIgcGFwZXIgYnkgSmFtZXMgUy4gUGxhbmssIEtldmluIE0uIEdyZWVuYW4KLy8gYW5kIEV0aGFuIEwuIE1pbGxlciBmb3IgZmFzdCBTU0UgYmFzZWQgbXVsdGlwbGljYXRpb24uCi8vIEFsc28gd2UgYXJlIGdyYXRlZnVsIHRvIEFydGVtIERyb2Jhbm92IGFuZCBCdWxhdCBaaWdhbnNoaW4KLy8gZm9yIHNhbXBsZXMgYW5kIGlkZWFzIGFsbG93ZWQgdG8gbWFrZSBSZWVkLVNvbG9tb24gY29kZWMgbW9yZSBlZmZpY2llbnQuCgpSU0NvZGVyMTY6OlJTQ29kZXIxNigpCnsKICBEZWNvZGluZz1mYWxzZTsKICBORD1OUj1ORT0wOwogIFZhbGlkRmxhZ3M9TlVMTDsKICBNWD1OVUxMOwogIERhdGFMb2c9TlVMTDsKICBEYXRhTG9nU2l6ZT0wOwoKICBnZkluaXQoKTsKfQoKClJTQ29kZXIxNjo6flJTQ29kZXIxNigpCnsKICBkZWxldGVbXSBnZkV4cDsKICBkZWxldGVbXSBnZkxvZzsKICBkZWxldGVbXSBEYXRhTG9nOwogIGRlbGV0ZVtdIE1YOwogIGRlbGV0ZVtdIFZhbGlkRmxhZ3M7Cn0KCgovLyBJbml0aWFsaXplIGxvZ2FyaXRobXMgYW5kIGV4cG9uZW50cyBHYWxvaXMgZmllbGQgdGFibGVzLgp2b2lkIFJTQ29kZXIxNjo6Z2ZJbml0KCkKewogIGdmRXhwPW5ldyB1aW50WzQqZ2ZTaXplKzFdOwogIGdmTG9nPW5ldyB1aW50W2dmU2l6ZSsxXTsKCiAgZm9yICh1aW50IEw9MCxFPTE7TDxnZlNpemU7TCsrKQogIHsKICAgIGdmTG9nW0VdPUw7CiAgICBnZkV4cFtMXT1FOwogICAgZ2ZFeHBbTCtnZlNpemVdPUU7ICAvLyBEdXBsaWNhdGUgdGhlIHRhYmxlIHRvIGF2b2lkIGdmRXhwIG92ZXJmbG93IGNoZWNrLgogICAgRTw8PTE7CiAgICBpZiAoRT5nZlNpemUpCiAgICAgIEVePTB4MTEwMEI7IC8vIElycmVkdWNpYmxlIGZpZWxkLWdlbmVyYXRvciBwb2x5bm9taWFsLgogIH0KCiAgLy8gbG9nKDApK2xvZyh4KSBtdXN0IGJlIG91dHNpZGUgb2YgdXN1YWwgbG9nIHRhYmxlLCBzbyB3ZSBjYW4gc2V0IGl0CiAgLy8gdG8gMCBhbmQgYXZvaWQgY2hlY2sgZm9yIDAgaW4gbXVsdGlwbGljYXRpb24gcGFyYW1ldGVycy4KICBnZkxvZ1swXT0gMipnZlNpemU7CiAgZm9yICh1aW50IEk9MipnZlNpemU7STw9NCpnZlNpemU7SSsrKSAvLyBSZXN1bHRzIGZvciBsb2coMCkrbG9nKHgpLgogICAgZ2ZFeHBbSV09MDsKfQoKCnVpbnQgUlNDb2RlcjE2OjpnZkFkZCh1aW50IGEsdWludCBiKSAvLyBBZGRpdGlvbiBpbiBHYWxvaXMgZmllbGQuCnsKICByZXR1cm4gYV5iOwp9CgoKdWludCBSU0NvZGVyMTY6OmdmTXVsKHVpbnQgYSx1aW50IGIpIC8vIE11bHRpcGxpY2F0aW9uIGluIEdhbG9pcyBmaWVsZC4KewogIHJldHVybiBnZkV4cFtnZkxvZ1thXStnZkxvZ1tiXV07Cn0KCgp1aW50IFJTQ29kZXIxNjo6Z2ZJbnYodWludCBhKSAvLyBJbnZlcnNlIGVsZW1lbnQgaW4gR2Fsb2lzIGZpZWxkLgp7CiAgcmV0dXJuIGE9PTAgPyAwOmdmRXhwW2dmU2l6ZS1nZkxvZ1thXV07Cn0KCgpib29sIFJTQ29kZXIxNjo6SW5pdCh1aW50IERhdGFDb3VudCwgdWludCBSZWNDb3VudCwgYm9vbCAqVmFsaWRpdHlGbGFncykKewogIE5EID0gRGF0YUNvdW50OwogIE5SID0gUmVjQ291bnQ7CiAgTkUgPSAwOwoKICBEZWNvZGluZz1WYWxpZGl0eUZsYWdzIT1OVUxMOwogIGlmIChEZWNvZGluZykKICB7CiAgICBkZWxldGVbXSBWYWxpZEZsYWdzOwogICAgVmFsaWRGbGFncz1uZXcgYm9vbFtORCArIE5SXTsKCiAgICBmb3IgKHVpbnQgSSA9IDA7IEkgPCBORCArIE5SOyBJKyspCiAgICAgIFZhbGlkRmxhZ3NbSV09VmFsaWRpdHlGbGFnc1tJXTsKICAgIGZvciAodWludCBJID0gMDsgSSA8IE5EOyBJKyspCiAgICAgIGlmICghVmFsaWRGbGFnc1tJXSkKICAgICAgICBORSsrOwogICAgdWludCBWYWxpZEVDQz0wOwogICAgZm9yICh1aW50IEkgPSBORDsgSSA8IE5EICsgTlI7IEkrKykKICAgICAgaWYgKFZhbGlkRmxhZ3NbSV0pCiAgICAgICAgVmFsaWRFQ0MrKzsKICAgIGlmIChORSA+IFZhbGlkRUNDIHx8IE5FID09IDAgfHwgVmFsaWRFQ0MgPT0gMCkKICAgICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZiAoTkQgKyBOUiA+IGdmU2l6ZSB8fCBOUiA+IE5EIHx8IE5EID09IDAgfHwgTlIgPT0gMCkKICAgIHJldHVybiBmYWxzZTsKCiAgZGVsZXRlW10gTVg7CiAgaWYgKERlY29kaW5nKQogIHsKICAgIE1YPW5ldyB1aW50W05FICogTkRdOwogICAgTWFrZURlY29kZXJNYXRyaXgoKTsKICAgIEludmVydERlY29kZXJNYXRyaXgoKTsKICB9CiAgZWxzZQogIHsKICAgIE1YPW5ldyB1aW50W05SICogTkRdOwogICAgTWFrZUVuY29kZXJNYXRyaXgoKTsKICB9CiAgcmV0dXJuIHRydWU7Cn0KCgp2b2lkIFJTQ29kZXIxNjo6TWFrZUVuY29kZXJNYXRyaXgoKQp7CiAgLy8gQ3JlYXRlIENhdWNoeSBlbmNvZGVyIGdlbmVyYXRvciBtYXRyaXguIFNraXAgdHJpdmlhbCAiMSIgZGlhZ29uYWwgcm93cywKICAvLyB3aGljaCB3b3VsZCBqdXN0IGNvcHkgc291cmNlIGRhdGEgdG8gZGVzdGluYXRpb24uCiAgZm9yICh1aW50IEkgPSAwOyBJIDwgTlI7IEkrKykKICAgIGZvciAodWludCBKID0gMDsgSiA8IE5EOyBKKyspCiAgICAgIE1YW0kgKiBORCArIEpdID0gZ2ZJbnYoIGdmQWRkKCAoSStORCksIEopICk7Cn0KCgp2b2lkIFJTQ29kZXIxNjo6TWFrZURlY29kZXJNYXRyaXgoKQp7CiAgLy8gQ3JlYXRlIENhdWNoeSBkZWNvZGVyIG1hdHJpeC4gU2tpcCB0cml2aWFsIHJvd3MgbWF0Y2hpbmcgdmFsaWQgZGF0YQogIC8vIHVuaXRzIGFuZCBjb250YWluaW5nICIxIiBvbiBtYWluIGRpYWdvbmFsLiBTdWNoIHJvd3Mgd291bGQganVzdCBjb3B5CiAgLy8gc291cmNlIGRhdGEgdG8gZGVzdGluYXRpb24gYW5kIHRoZXkgaGF2ZSBubyByZWFsIHZhbHVlIGZvciB1cy4KICAvLyBJbmNsdWRlIHJvd3Mgb25seSBmb3IgYnJva2VuIGRhdGEgdW5pdHMgYW5kIHJlcGxhY2UgdGhlbSBieSBmaXJzdAogIC8vIGF2YWlsYWJsZSB2YWxpZCByZWNvdmVyeSBjb2RlIHJvd3MuCiAgZm9yICh1aW50IEZsYWc9MCwgUj1ORCwgRGVzdD0wOyBGbGFnIDwgTkQ7IEZsYWcrKykKICAgIGlmICghVmFsaWRGbGFnc1tGbGFnXSkgLy8gRm9yIGV2ZXJ5IGJyb2tlbiBkYXRhIHVuaXQuCiAgICB7CiAgICAgIHdoaWxlICghVmFsaWRGbGFnc1tSXSkgLy8gRmluZCBhIHZhbGlkIHJlY292ZXJ5IHVuaXQuCiAgICAgICAgUisrOwogICAgICBmb3IgKHVpbnQgSiA9IDA7IEogPCBORDsgSisrKSAvLyBBbmQgcGxhY2UgaXRzIHJvdyB0byBtYXRyaXguCiAgICAgICAgTVhbRGVzdCpORCArIEpdID0gZ2ZJbnYoIGdmQWRkKFIsSikgKTsKICAgICAgRGVzdCsrOwogICAgICBSKys7CiAgICB9Cn0KCgovLyBBcHBseSBHYXVzc5ZKb3JkYW4gZWxpbWluYXRpb24gdG8gZmluZCBpbnZlcnNlIG9mIGRlY29kZXIgbWF0cml4LgovLyBXZSBoYXZlIHRoZSBzcXVhcmUgTkR4TkQgbWF0cml4LCBidXQgd2UgZG8gbm90IHN0b3JlIGl0cyB0cml2aWFsCi8vIGRpYWdvbmFsICIxIiByb3dzIG1hdGNoaW5nIHZhbGlkIGRhdGEsIHNvIHdlIHdvcmsgd2l0aCBORXhORCBtYXRyaXguCi8vIE91ciBvcmlnaW5hbCBDYXVjaHkgbWF0cml4IGRvZXMgbm90IGNvbnRhaW4gMCwgc28gd2Ugc2tpcCBzZWFyY2gKLy8gZm9yIG5vbi16ZXJvIHBpdm90Lgp2b2lkIFJTQ29kZXIxNjo6SW52ZXJ0RGVjb2Rlck1hdHJpeCgpCnsKICB1aW50ICpNST1uZXcgdWludFtORSAqIE5EXTsgLy8gV2UnbGwgY3JlYXRlIGludmVyc2UgbWF0cml4IGhlcmUuCiAgbWVtc2V0KE1JLCAwLCBORCAqIE5FICogc2l6ZW9mKCpNSSkpOyAvLyBJbml0aWFsaXplIHRvIGlkZW50aXR5IG1hdHJpeC4KICBmb3IgKHVpbnQgS3IgPSAwLCBLZiA9IDA7IEtyIDwgTkU7IEtyKyssIEtmKyspCiAgewogICAgd2hpbGUgKFZhbGlkRmxhZ3NbS2ZdKSAvLyBTa2lwIHRyaXZpYWwgcm93cy4KICAgICAgS2YrKzsKICAgIE1JW0tyICogTkQgKyBLZl0gPSAxOyAgLy8gU2V0IGRpYWdvbmFsIDEuCiAgfQoKICAvLyBLciBpcyB0aGUgbnVtYmVyIG9mIHJvdyBpbiBvdXIgYWN0dWFsIHJlZHVjZWQgTkUgeCBORCBtYXRyaXgsCiAgLy8gd2hpY2ggZG9lcyBub3QgY29udGFpbiB0cml2aWFsIGRpYWdvbmFsIDEgcm93cy4KICAvLyBLZiBpcyB0aGUgbnVtYmVyIG9mIHJvdyBpbiBmdWxsIE5EIHggTkQgbWF0cml4IHdpdGggYWxsIHRyaXZpYWwgcm93cwogIC8vIGluY2x1ZGVkLgogIGZvciAodWludCBLciA9IDAsIEtmID0gMDsgS2YgPCBORDsgS3IrKywgS2YrKykgLy8gU2VsZWN0IHBpdm90IHJvdy4KICB7CiAgICB3aGlsZSAoVmFsaWRGbGFnc1tLZl0gJiYgS2YgPCBORCkKICAgIHsKICAgICAgLy8gSGVyZSB3ZSBwcm9jZXNzIHRyaXZpYWwgZGlhZ29uYWwgMSByb3dzIG1hdGNoaW5nIHZhbGlkIGRhdGEgdW5pdHMuCiAgICAgIC8vIFRoZWlyIHByb2Nlc3NpbmcgY2FuIGJlIHNpbXBsaWZpZWQgY29tcGFyaW5nIHRvIHVzdWFsIHJvd3MuCiAgICAgIC8vIEluIGZ1bGwgdmVyc2lvbiBvZiBlbGltaW5hdGlvbiB3ZSB3b3VsZCBzZXQgTVhbSSAqIE5EICsgS2ZdIHRvIHplcm8KICAgICAgLy8gYWZ0ZXIgTUlbLi5dXj0sIGJ1dCB3ZSBkbyBub3QgbmVlZCBpdCBmb3IgbWF0cml4IGludmVyc2lvbi4KICAgICAgZm9yICh1aW50IEkgPSAwOyBJIDwgTkU7IEkrKykKICAgICAgICBNSVtJICogTkQgKyBLZl0gXj0gTVhbSSAqIE5EICsgS2ZdOwogICAgICBLZisrOwogICAgfQoKICAgIGlmIChLZiA9PSBORCkKICAgICAgYnJlYWs7CgogICAgdWludCAqTVhrID0gTVggKyBLciAqIE5EOyAvLyBrLXRoIHJvdyBvZiBtYWluIG1hdHJpeC4KICAgIHVpbnQgKk1JayA9IE1JICsgS3IgKiBORDsgLy8gay10aCByb3cgb2YgaW52ZXJzaW9uIG1hdHJpeC4KCiAgICB1aW50IFBJbnYgPSBnZkludiggTVhrW0tmXSApOyAvLyBQaXZvdCBpbnZlcnNlLgogICAgLy8gRGl2aWRlIHRoZSBwaXZvdCByb3cgYnkgcGl2b3QsIHNvIHBpdm90IGNlbGwgY29udGFpbnMgMS4KICAgIGZvciAodWludCBJID0gMDsgSSA8IE5EOyBJKyspCiAgICB7CiAgICAgIE1Ya1tJXSA9IGdmTXVsKCBNWGtbSV0sIFBJbnYgKTsKICAgICAgTUlrW0ldID0gZ2ZNdWwoIE1Ja1tJXSwgUEludiApOwogICAgfQoKICAgIGZvciAodWludCBJID0gMDsgSSA8IE5FOyBJKyspCiAgICAgIGlmIChJICE9IEtyKSAvLyBGb3IgYWxsIHJvd3MgZXhjZXB0IGNvbnRhaW5pbmcgdGhlIHBpdm90IGNlbGwuCiAgICAgIHsKICAgICAgICAvLyBBcHBseSBHYXVzc2lhbiBlbGltaW5hdGlvbiBNaWogLT0gTWtqICogTWlrIC8gcGl2b3QuCiAgICAgICAgLy8gU2luY2UgcGl2b3QgaXMgYWxyZWFkeSAxLCBpdCBpcyByZWR1Y2VkIHRvIE1paiAtPSBNa2ogKiBNaWsuCiAgICAgICAgdWludCAqTVhpID0gTVggKyBJICogTkQ7IC8vIGktdGggcm93IG9mIG1haW4gbWF0cml4LgogICAgICAgIHVpbnQgKk1JaSA9IE1JICsgSSAqIE5EOyAvLyBpLXRoIHJvdyBvZiBpbnZlcnNpb24gbWF0cml4LgogICAgICAgIHVpbnQgTWlrID0gTVhpW0tmXTsgLy8gQ2VsbCBpbiBwaXZvdCBwb3NpdGlvbi4KICAgICAgICBmb3IgKHVpbnQgSiA9IDA7IEogPCBORDsgSisrKQogICAgICAgIHsKICAgICAgICAgIE1YaVtKXSBePSBnZk11bChNWGtbSl0gLCBNaWspOwogICAgICAgICAgTUlpW0pdIF49IGdmTXVsKE1Ja1tKXSAsIE1payk7CiAgICAgICAgfQogICAgICB9CiAgfQoKICAvLyBDb3B5IGRhdGEgdG8gbWFpbiBtYXRyaXguCiAgZm9yICh1aW50IEkgPSAwOyBJIDwgTkUgKiBORDsgSSsrKQogICAgTVhbSV0gPSBNSVtJXTsKCiAgZGVsZXRlW10gTUk7Cn0KCgojaWYgMAovLyBNdWx0aXBseSBtYXRyaXggdG8gZGF0YSB2ZWN0b3IuIFdoZW4gZW5jb2RpbmcsIGl0IGNvbnRhaW5zIGRhdGEgaW4gRGF0YQovLyBhbmQgc3RvcmVzIGVycm9yIGNvcnJlY3Rpb24gY29kZXMgaW4gT3V0LiBXaGVuIGRlY29kaW5nIGl0IGNvbnRhaW5zCi8vIGJyb2tlbiBkYXRhIGZvbGxvd2VkIGJ5IEVDQyBpbiBEYXRhIGFuZCBzdG9yZXMgcmVjb3ZlcmVkIGRhdGEgdG8gT3V0LgovLyBXZSBkbyBub3QgdXNlIHRoaXMgZnVuY3Rpb24gbm93LCBldmVyeXRoaW5nIGlzIG1vdmVkIHRvIFVwZGF0ZUVDQy4Kdm9pZCBSU0NvZGVyMTY6OlByb2Nlc3MoY29uc3QgdWludCAqRGF0YSwgdWludCAqT3V0KQp7CiAgdWludCBQcm9jRGF0YVtnZlNpemVdOwoKICBmb3IgKHVpbnQgSSA9IDA7IEkgPCBORDsgSSsrKQogICAgUHJvY0RhdGFbSV09RGF0YVtJXTsKCiAgaWYgKERlY29kaW5nKQogIHsKICAgIC8vIFJlcGxhY2UgYnJva2VuIGRhdGEgdW5pdHMgd2l0aCBmaXJzdCBhdmFpbGFibGUgdmFsaWQgcmVjb3ZlcnkgY29kZXMuCiAgICAvLyAnRGF0YScgYXJyYXkgbXVzdCBjb250YWluIHJlY292ZXJ5IGNvZGVzIGFmdGVyIGRhdGEuCiAgICBmb3IgKHVpbnQgST0wLCBSPU5ELCBEZXN0PTA7IEkgPCBORDsgSSsrKQogICAgICBpZiAoIVZhbGlkRmxhZ3NbSV0pIC8vIEZvciBldmVyeSBicm9rZW4gZGF0YSB1bml0LgogICAgICB7CiAgICAgICAgd2hpbGUgKCFWYWxpZEZsYWdzW1JdKSAvLyBGaW5kIGEgdmFsaWQgcmVjb3ZlcnkgdW5pdC4KICAgICAgICAgIFIrKzsKICAgICAgICBQcm9jRGF0YVtJXT1EYXRhW1JdOwogICAgICAgIFIrKzsKICAgICAgfQogIH0KCiAgdWludCBIPURlY29kaW5nID8gTkUgOiBOUjsKICBmb3IgKHVpbnQgSSA9IDA7IEkgPCBIOyBJKyspCiAgewogICAgdWludCBSID0gMDsgLy8gUmVzdWx0IG9mIG1hdHJpeCByb3cgbXVsdGlwbGljYXRpb24gdG8gZGF0YS4KCiAgICB1aW50ICpNWGk9TVggKyBJICogTkQ7CiAgICBmb3IgKHVpbnQgSiA9IDA7IEogPCBORDsgSisrKQogICAgICBSIF49IGdmTXVsKE1YaVtKXSwgUHJvY0RhdGFbSl0pOwoKICAgIE91dFtJXSA9IFI7CiAgfQp9CiNlbmRpZgoKCi8vIFdlIHVwZGF0ZSBFQ0MgaW4gYmxvY2tzIGJ5IGFwcGx5aW5nIGV2ZXJ5IGRhdGEgYmxvY2sgdG8gYWxsIEVDQyBibG9ja3MuCi8vIFRoaXMgZnVuY3Rpb24gYXBwbGllcyBvbmUgZGF0YSBibG9jayB0byBvbmUgRUNDIGJsb2NrLgp2b2lkIFJTQ29kZXIxNjo6VXBkYXRlRUNDKHVpbnQgRGF0YU51bSwgdWludCBFQ0NOdW0sIGNvbnN0IGJ5dGUgKkRhdGEsIGJ5dGUgKkVDQywgc2l6ZV90IEJsb2NrU2l6ZSkKewogIGlmIChEYXRhTnVtPT0wKSAvLyBJbml0IEVDQyBkYXRhLgogICAgbWVtc2V0KEVDQywgMCwgQmxvY2tTaXplKTsKCiAgYm9vbCBEaXJlY3RBY2Nlc3M7CiNpZmRlZiBMSVRUTEVfRU5ESUFOCiAgLy8gV2UgY2FuIGFjY2VzcyBkYXRhIGFuZCBFQ0MgZGlyZWN0bHkgaWYgd2UgaGF2ZSBsaXR0bGUgZW5kaWFuIDE2IGJpdCB1aW50LgogIERpcmVjdEFjY2Vzcz1zaXplb2YodXNob3J0KT09MjsKI2Vsc2UKICBEaXJlY3RBY2Nlc3M9ZmFsc2U7CiNlbmRpZgoKI2lmZGVmIFVTRV9TU0UKICBpZiAoRGlyZWN0QWNjZXNzICYmIFNTRV9VcGRhdGVFQ0MoRGF0YU51bSxFQ0NOdW0sRGF0YSxFQ0MsQmxvY2tTaXplKSkKICAgIHJldHVybjsKI2VuZGlmCgogIGlmIChFQ0NOdW09PTApCiAgewogICAgaWYgKERhdGFMb2dTaXplIT1CbG9ja1NpemUpCiAgICB7CiAgICAgIGRlbGV0ZVtdIERhdGFMb2c7CiAgICAgIERhdGFMb2c9bmV3IHVpbnRbQmxvY2tTaXplXTsKICAgICAgRGF0YUxvZ1NpemU9QmxvY2tTaXplOwoKICAgIH0KICAgIGlmIChEaXJlY3RBY2Nlc3MpCiAgICAgIGZvciAoc2l6ZV90IEk9MDsgSTxCbG9ja1NpemU7IEkrPTIpCiAgICAgICAgRGF0YUxvZ1tJXSA9IGdmTG9nWyAqKHVzaG9ydCopKERhdGErSSkgXTsKICAgIGVsc2UKICAgICAgZm9yIChzaXplX3QgST0wOyBJPEJsb2NrU2l6ZTsgSSs9MikKICAgICAgewogICAgICAgIHVpbnQgRD1EYXRhW0ldK0RhdGFbSSsxXSoyNTY7CiAgICAgICAgRGF0YUxvZ1tJXSA9IGdmTG9nWyBEIF07CiAgICAgIH0KICB9CgogIHVpbnQgTUwgPSBnZkxvZ1sgTVhbRUNDTnVtICogTkQgKyBEYXRhTnVtXSBdOwoKICBpZiAoRGlyZWN0QWNjZXNzKQogICAgZm9yIChzaXplX3QgST0wOyBJPEJsb2NrU2l6ZTsgSSs9MikKICAgICAgKih1c2hvcnQqKShFQ0MrSSkgXj0gZ2ZFeHBbIE1MICsgRGF0YUxvZ1tJXSBdOwogIGVsc2UKICAgIGZvciAoc2l6ZV90IEk9MDsgSTxCbG9ja1NpemU7IEkrPTIpCiAgICB7CiAgICAgIHVpbnQgUj1nZkV4cFsgTUwgKyBEYXRhTG9nW0ldIF07CiAgICAgIEVDQ1tJXV49Ynl0ZShSKTsKICAgICAgRUNDW0krMV1ePWJ5dGUoUi8yNTYpOwogICAgfQp9CgoKI2lmZGVmIFVTRV9TU0UKLy8gRGF0YSBhbmQgRUNDIGFkZHJlc3NlcyBtdXN0IGJlIHByb3Blcmx5IGFsaWduZWQgZm9yIFNTRS4KLy8gQVZYMiBkaWQgbm90IHByb3ZpZGUgYSBub3RpY2VhYmxlIHNwZWVkIGdhaW4gb24gaTctNjcwMEsgaGVyZS4KYm9vbCBSU0NvZGVyMTY6OlNTRV9VcGRhdGVFQ0ModWludCBEYXRhTnVtLCB1aW50IEVDQ051bSwgY29uc3QgYnl0ZSAqRGF0YSwgYnl0ZSAqRUNDLCBzaXplX3QgQmxvY2tTaXplKQp7CiAgLy8gQ2hlY2sgZGF0YSBhbGlnbm1lbnQgYW5kIFNTU0UzIHN1cHBvcnQuCiAgaWYgKChzaXplX3QoRGF0YSkgJiAoU1NFX0FMSUdOTUVOVC0xKSkhPTAgfHwgKHNpemVfdChFQ0MpICYgKFNTRV9BTElHTk1FTlQtMSkpIT0wIHx8CiAgICAgIF9TU0VfVmVyc2lvbjxTU0VfU1NTRTMpCiAgICByZXR1cm4gZmFsc2U7CgogIHVpbnQgTT1NWFtFQ0NOdW0gKiBORCArIERhdGFOdW1dOwoKICAvLyBQcmVwYXJlIHRhYmxlcyBjb250YWluaW5nIHByb2R1Y3RzIG9mIE0gYW5kIDQsIDgsIDEyLCAxNiBiaXQgbGVuZ3RoCiAgLy8gbnVtYmVycywgd2hpY2ggaGF2ZSA0IGhpZ2ggYml0cyBpbiAwLi4xNSByYW5nZSBhbmQgb3RoZXIgYml0cyBzZXQgdG8gMC4KICAvLyBTdG9yZSBoaWdoIGFuZCBsb3cgYnl0ZXMgb2YgcmVzdWx0aW5nIDE2IGJpdCBwcm9kdWN0IGluIHNlcGFyYXRlIHRhYmxlcy4KICBfX20xMjhpIFQwTCxUMUwsVDJMLFQzTDsgLy8gTG93IGJ5dGUgdGFibGVzLgogIF9fbTEyOGkgVDBILFQxSCxUMkgsVDNIOyAvLyBIaWdoIGJ5dGUgdGFibGVzLgoKICBmb3IgKHVpbnQgST0wO0k8MTY7SSsrKQogIHsKICAgICgoYnl0ZSAqKSZUMEwpW0ldPWdmTXVsKEksTSk7CiAgICAoKGJ5dGUgKikmVDBIKVtJXT1nZk11bChJLE0pPj44OwogICAgKChieXRlICopJlQxTClbSV09Z2ZNdWwoSTw8NCxNKTsKICAgICgoYnl0ZSAqKSZUMUgpW0ldPWdmTXVsKEk8PDQsTSk+Pjg7CiAgICAoKGJ5dGUgKikmVDJMKVtJXT1nZk11bChJPDw4LE0pOwogICAgKChieXRlICopJlQySClbSV09Z2ZNdWwoSTw8OCxNKT4+ODsKICAgICgoYnl0ZSAqKSZUM0wpW0ldPWdmTXVsKEk8PDEyLE0pOwogICAgKChieXRlICopJlQzSClbSV09Z2ZNdWwoSTw8MTIsTSk+Pjg7CiAgfQoKICBzaXplX3QgUG9zPTA7CgogIF9fbTEyOGkgTG93Qnl0ZU1hc2s9X21tX3NldDFfZXBpMTYoMHhmZik7ICAgICAvLyAwMGZmMDBmZi4uLjAwZmYKICBfX20xMjhpIExvdzRNYXNrPV9tbV9zZXQxX2VwaTgoMHhmKTsgICAgICAgICAgLy8gMGYwZjBmMGYuLi4wZjBmCiAgX19tMTI4aSBIaWdoNE1hc2s9X21tX3NsbGlfZXBpMTYoTG93NE1hc2ssNCk7IC8vIGYwZjBmMGYwLi4uZjBmMAoKICBmb3IgKDsgUG9zKzIqc2l6ZW9mKF9fbTEyOGkpPD1CbG9ja1NpemU7IFBvcys9MipzaXplb2YoX19tMTI4aSkpCiAgewogICAgLy8gV2UgcHJvY2VzcyB0d28gMTI4IGJpdCBjaHVua3Mgb2Ygc291cmNlIGRhdGEgYXQgb25jZS4KICAgIF9fbTEyOGkgKkQ9KF9fbTEyOGkgKikoRGF0YStQb3MpOwoKICAgIC8vIFBsYWNlIGhpZ2ggYnl0ZXMgb2YgYm90aCBjaHVua3MgdG8gb25lIHZhcmlhYmxlIGFuZCBsb3cgYnl0ZXMgdG8KICAgIC8vIGFub3RoZXIsIHNvIHdlIGNhbiB1c2UgdGhlIHRhYmxlIGxvb2t1cCBtdWx0aXBsaWNhdGlvbiBmb3IgMTYgdmFsdWVzCiAgICAvLyA0IGJpdCBsZW5ndGggZWFjaCBhdCBvbmNlLgogICAgX19tMTI4aSBIaWdoQnl0ZXMwPV9tbV9zcmxpX2VwaTE2KERbMF0sOCk7CiAgICBfX20xMjhpIExvd0J5dGVzMD1fbW1fYW5kX3NpMTI4KERbMF0sTG93Qnl0ZU1hc2spOwogICAgX19tMTI4aSBIaWdoQnl0ZXMxPV9tbV9zcmxpX2VwaTE2KERbMV0sOCk7CiAgICBfX20xMjhpIExvd0J5dGVzMT1fbW1fYW5kX3NpMTI4KERbMV0sTG93Qnl0ZU1hc2spOwogICAgX19tMTI4aSBIaWdoQnl0ZXM9X21tX3BhY2t1c19lcGkxNihIaWdoQnl0ZXMwLEhpZ2hCeXRlczEpOwogICAgX19tMTI4aSBMb3dCeXRlcz1fbW1fcGFja3VzX2VwaTE2KExvd0J5dGVzMCxMb3dCeXRlczEpOwoKICAgIC8vIE11bHRpcGx5IGJpdHMgMC4uMyBvZiBsb3cgYnl0ZXMuIFN0b3JlIGxvdyBhbmQgaGlnaCBwcm9kdWN0IGJ5dGVzCiAgICAvLyBzZXBhcmF0ZWx5IGluIGN1bXVsYXRpdmUgc3VtIHZhcmlhYmxlcy4KICAgIF9fbTEyOGkgTG93Qnl0ZXNMb3c0PV9tbV9hbmRfc2kxMjgoTG93Qnl0ZXMsTG93NE1hc2spOwogICAgX19tMTI4aSBMb3dCeXRlc011bHRTdW09X21tX3NodWZmbGVfZXBpOChUMEwsTG93Qnl0ZXNMb3c0KTsKICAgIF9fbTEyOGkgSGlnaEJ5dGVzTXVsdFN1bT1fbW1fc2h1ZmZsZV9lcGk4KFQwSCxMb3dCeXRlc0xvdzQpOwoKICAgIC8vIE11bHRpcGx5IGJpdHMgNC4uNyBvZiBsb3cgYnl0ZXMuIFN0b3JlIGxvdyBhbmQgaGlnaCBwcm9kdWN0IGJ5dGVzIHNlcGFyYXRlbHkuCiAgICBfX20xMjhpIExvd0J5dGVzSGlnaDQ9X21tX2FuZF9zaTEyOChMb3dCeXRlcyxIaWdoNE1hc2spOwogICAgICAgICAgICBMb3dCeXRlc0hpZ2g0PV9tbV9zcmxpX2VwaTE2KExvd0J5dGVzSGlnaDQsNCk7CiAgICBfX20xMjhpIExvd0J5dGVzSGlnaDRNdWx0TG93PV9tbV9zaHVmZmxlX2VwaTgoVDFMLExvd0J5dGVzSGlnaDQpOwogICAgX19tMTI4aSBMb3dCeXRlc0hpZ2g0TXVsdEhpZ2g9X21tX3NodWZmbGVfZXBpOChUMUgsTG93Qnl0ZXNIaWdoNCk7CgogICAgLy8gQWRkIG5ldyBwcm9kdWN0IHRvIGV4aXN0aW5nIHN1bSwgbG93IGFuZCBoaWdoIGJ5dGVzIHNlcGFyYXRlbHkuCiAgICBMb3dCeXRlc011bHRTdW09X21tX3hvcl9zaTEyOChMb3dCeXRlc011bHRTdW0sTG93Qnl0ZXNIaWdoNE11bHRMb3cpOwogICAgSGlnaEJ5dGVzTXVsdFN1bT1fbW1feG9yX3NpMTI4KEhpZ2hCeXRlc011bHRTdW0sTG93Qnl0ZXNIaWdoNE11bHRIaWdoKTsKCiAgICAvLyBNdWx0aXBseSBiaXRzIDAuLjMgb2YgaGlnaCBieXRlcy4gU3RvcmUgbG93IGFuZCBoaWdoIHByb2R1Y3QgYnl0ZXMgc2VwYXJhdGVseS4KICAgIF9fbTEyOGkgSGlnaEJ5dGVzTG93ND1fbW1fYW5kX3NpMTI4KEhpZ2hCeXRlcyxMb3c0TWFzayk7CiAgICBfX20xMjhpIEhpZ2hCeXRlc0xvdzRNdWx0TG93PV9tbV9zaHVmZmxlX2VwaTgoVDJMLEhpZ2hCeXRlc0xvdzQpOwogICAgX19tMTI4aSBIaWdoQnl0ZXNMb3c0TXVsdEhpZ2g9X21tX3NodWZmbGVfZXBpOChUMkgsSGlnaEJ5dGVzTG93NCk7CgogICAgLy8gQWRkIG5ldyBwcm9kdWN0IHRvIGV4aXN0aW5nIHN1bSwgbG93IGFuZCBoaWdoIGJ5dGVzIHNlcGFyYXRlbHkuCiAgICBMb3dCeXRlc011bHRTdW09X21tX3hvcl9zaTEyOChMb3dCeXRlc011bHRTdW0sSGlnaEJ5dGVzTG93NE11bHRMb3cpOwogICAgSGlnaEJ5dGVzTXVsdFN1bT1fbW1feG9yX3NpMTI4KEhpZ2hCeXRlc011bHRTdW0sSGlnaEJ5dGVzTG93NE11bHRIaWdoKTsKCiAgICAvLyBNdWx0aXBseSBiaXRzIDQuLjcgb2YgaGlnaCBieXRlcy4gU3RvcmUgbG93IGFuZCBoaWdoIHByb2R1Y3QgYnl0ZXMgc2VwYXJhdGVseS4KICAgIF9fbTEyOGkgSGlnaEJ5dGVzSGlnaDQ9X21tX2FuZF9zaTEyOChIaWdoQnl0ZXMsSGlnaDRNYXNrKTsKICAgICAgICAgICAgSGlnaEJ5dGVzSGlnaDQ9X21tX3NybGlfZXBpMTYoSGlnaEJ5dGVzSGlnaDQsNCk7CiAgICBfX20xMjhpIEhpZ2hCeXRlc0hpZ2g0TXVsdExvdz1fbW1fc2h1ZmZsZV9lcGk4KFQzTCxIaWdoQnl0ZXNIaWdoNCk7CiAgICBfX20xMjhpIEhpZ2hCeXRlc0hpZ2g0TXVsdEhpZ2g9X21tX3NodWZmbGVfZXBpOChUM0gsSGlnaEJ5dGVzSGlnaDQpOwoKICAgIC8vIEFkZCBuZXcgcHJvZHVjdCB0byBleGlzdGluZyBzdW0sIGxvdyBhbmQgaGlnaCBieXRlcyBzZXBhcmF0ZWx5LgogICAgTG93Qnl0ZXNNdWx0U3VtPV9tbV94b3Jfc2kxMjgoTG93Qnl0ZXNNdWx0U3VtLEhpZ2hCeXRlc0hpZ2g0TXVsdExvdyk7CiAgICBIaWdoQnl0ZXNNdWx0U3VtPV9tbV94b3Jfc2kxMjgoSGlnaEJ5dGVzTXVsdFN1bSxIaWdoQnl0ZXNIaWdoNE11bHRIaWdoKTsKCiAgICAvLyBDb21iaW5lIHNlcGFyYXRlIGxvdyBhbmQgaGlnaCBjdW11bGF0aXZlIHN1bSBieXRlcyB0byAxNi1iaXQgd29yZHMuCiAgICBfX20xMjhpIEhpZ2hCeXRlc0hpZ2g0TXVsdDA9X21tX3VucGFja2xvX2VwaTgoTG93Qnl0ZXNNdWx0U3VtLEhpZ2hCeXRlc011bHRTdW0pOwogICAgX19tMTI4aSBIaWdoQnl0ZXNIaWdoNE11bHQxPV9tbV91bnBhY2toaV9lcGk4KExvd0J5dGVzTXVsdFN1bSxIaWdoQnl0ZXNNdWx0U3VtKTsKCiAgICAvLyBBZGQgcmVzdWx0IHRvIEVDQy4KICAgIF9fbTEyOGkgKlN0b3JlRUNDPShfX20xMjhpICopKEVDQytQb3MpOwoKICAgIFN0b3JlRUNDWzBdPV9tbV94b3Jfc2kxMjgoU3RvcmVFQ0NbMF0sSGlnaEJ5dGVzSGlnaDRNdWx0MCk7CiAgICBTdG9yZUVDQ1sxXT1fbW1feG9yX3NpMTI4KFN0b3JlRUNDWzFdLEhpZ2hCeXRlc0hpZ2g0TXVsdDEpOwogIH0KCiAgLy8gSWYgd2UgaGF2ZSBub24gMTI4IGJpdCBhbGlnbmVkIGRhdGEgaW4gdGhlIGVuZCBvZiBibG9jaywgcHJvY2VzcyB0aGVtCiAgLy8gaW4gYSB1c3VhbCB3YXkuIFdlIGNhbm5vdCBkbyB0aGUgc2FtZSBpbiB0aGUgYmVnaW5uaW5nIG9mIGJsb2NrLAogIC8vIGJlY2F1c2UgRGF0YSBhbmQgRUNDIGNhbiBoYXZlIGRpZmZlcmVudCBhbGlnbm1lbnQgb2Zmc2V0cy4KICBmb3IgKDsgUG9zPEJsb2NrU2l6ZTsgUG9zKz0yKQogICAgKih1c2hvcnQqKShFQ0MrUG9zKSBePSBnZk11bCggTSwgKih1c2hvcnQqKShEYXRhK1BvcykgKTsKCiAgcmV0dXJuIHRydWU7Cn0KI2VuZGlmCg==