LyoqCiAqIEBmaWxlIGF0X3V0aWxzLmgKICogQGJyaWVmIMzhuam4+NOm08PKudPDtcRzb2Z0YXDGvcyouau5sr3Tv9oKICoKICogQ29weXJpZ2h0IChDKSAyMDE3IFNhbmVjaGlwcyBUZWNobm9sb2d5IENvLiwgTHRkLgogKiBAYXV0aG9yCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKi8KI2lmbmRlZiBfX0FUX1VUSUxTX0hfXwojZGVmaW5lIF9fQVRfVVRJTFNfSF9fCiNpbmNsdWRlICJvc190eXBlX2RlZi5oIgojaW5jbHVkZSAic29mdGFwX2FwaS5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioKICogQGJyaWVmILao0uVBVMnPz8LOxLWxx7C0psDttcTXtMysu/qjrNLUvva2qM/C0ruyvbSmwO0KICogQHBhcmFtIEFUX0VORCAgICAgICAgICBBVMH3s8y94cr4o6y/zbuntsu/ydLUz/LJz7LjYXBwt6LLzc/s06bP+8+io6y3/s7xtsvQ6NKqz/JhdM2otcC3osvNYXTP7NOmw/zB7gogKiBAcGFyYW0gQVRfQ09OVElOVUUgICAgIEFUvbu7pcH3s8y8zND4CiAqIEBwYXJhbSBBVF9FTkRfQU5EX01TRyAg08PT2rf+zvG2y8rVtb1BVMfrx/O686OswaK8tLvYuLRPS73hufvC66OszazKsbu50Oi3osvNz/vPorj4t/7O8bbLQVBQCiAqIEBwYXJhbSBBVF9TVEFURV9NQVggICAgyc/P3rrqCiAqLwojaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUwplbnVtIGF0X2NvbnRleHRfc3RhdGUgewoJQVRfRU5EID0gMCwgLy9BVMH3s8y94cr4o6y/zbuntsu/ydLUz/LJz7LjYXBwt6LLzc/s06bP+8+io6y3/s7xtsvQ6NKqz/JhdM2otcC3osvNYXTP7NOmw/zB7goJQVRfQ09OVElOVUUsLy9BVL27u6XB97PMvMzQ+AoJQVRfRU5EX0FORF9NU0csLy/Tw9Pat/7O8bbLytW1vUFUx+vH87rzo6zBory0u9i4tE9LveG5+8Lro6zNrMqxu7nQ6Leiy83P+8+iuPi3/s7xtstBUFAKCUFUX1dBSVRfQVVUTywvL9PD09rK1bW906a08Lrzo6zJ0M60u/HIobW9z+vSqrXE1ve2r8nPsajKsaOst7W72LjD1rWju8S/x7C99tPD09pQRFC8pLvutcR6Z2lwZG5z1ve2r8nPsaiz2dPaT0u688nPsai1xMfpv/YKCUFUX1NUQVRFX01BWCwvL8nPz9666gp9OwojZW5kaWYKCi8qKgogKiBAYnJpZWYgtKbA7df3zqq3/s7xtsu1xMrVtb21xMfrx/PD/MHuoaO21NPaYXRfY3Rssb612LXEt/7O8bbLo6zK1bW9x+vH89auuvOjrNf3zqrNrLK9tKbA7be9yr3Wsb3T1Nq4w7qvyv3W0LSmwO2jrLKit7W72G9rCiAqttTT2kRFTU+3/s7xtssov827p7b+tM6/qrei16Ky4bXEt/7O8bbLKcrVtb21xMfrx/OjrLHY0OvNqLn90uyyvc/7z6K1xLe9yr2jrNPJREVNT7XEQVBQt/7O8bbLzai5/c/7z6K9+NDQ06a08AogKiBAcGFyYW0gYXRfZmQgCQkgvdPK1UFUw/zB7rXEzai1wAogKiBAcGFyYW0gYXRfcGFyYXMJCSBBVMP8we6yzsr9CiAqIEBwYXJhbSByZXNfbXNnCQkgyPTOqs2ssr20psDtt73KvaOscmVzX21zZ86qu9i4tLXEveG5+8Lro7vI9M6q0uyyvbSmwO23vcq9o6xyZXNfbXNnzqpBVMP8we7Xqru7uvO1xM/7z6K94bm5zOUKICogQHBhcmFtIHJlc19tc2dsZW4JILLOyv1yZXNfbXNntcSzpLbICiAqIEByZXR1cm4gaW500M294bn7wusgICC3tbvYZW51bSBhdF9jb250ZXh0X3N0YXRlw7a+2da1o6xBVF9FTkSx7cq+zayyvdOmtPC3vcq9o7tBVF9DT05USU5VRbHtyr7S7LK906a08Le9yr0s08m/8rzcvva2qM/C0ruyvbSmwO0KICogQG5vdGUgv8myzr+8yr7A/bT6wus6IHVzZXJfcmVnaXN0LmMKICovCnR5cGVkZWYgaW50ICgqc2VyX3JlcV9mdW5jMikoaW50IGF0X2ZkLCBjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnLCBpbnQgKnJlc19tc2dsZW4pOwoKCi8qKgogKiBAYnJpZWYgt/7O8bbLQVBQt6LLzbXE06a08M/7z6K1xEFUw/zB7rfi17CjrNfu1tXX6dews8lBVNOmtPDD/MHuuvOjrLTTYXRfZmTNqLXAt6LLzbj41La2y7/Nu6e2ywogKiBAcGFyYW0gcnNwX21zZwkJIEFQULeiy821xNOmtPDP+8+ixNrI3QogKiBAcGFyYW0gcmV0CQkJIEFUw/zB7gogKiBAcGFyYW0gcmV0bGVuCQkgQVTD/MHus6S2yAogKiBAcmV0dXJuIGludNDNveG5+8LrICAgt7W72GVudW0gYXRfY29udGV4dF9zdGF0ZcO2vtnWtQogKiBAbm90ZSC/ybLOv7zKvsD9tPrC6zogdXNlcl9yZWdpc3QuYwogKi8KdHlwZWRlZiBpbnQgKCphcHBfcnNwX3Byb2MpKHZvaWQgKnJzcF9tc2csIHZvaWQqKnJldCwgaW50ICpyZXRsZW4pOwoKLyoqCiAqIEBicmllZiC21NPayc+xqGF0w/zB7rSmwO26r8r9o6yw/LqssunRr9bQvOS94bn7us3W97avyc+xqLXEYXTD/MHutKbA7QogKgm21NPacHPP4LnYtcTW97avyc+xqLrNsunRr9bQvOS94bn7yc+xqKOs0ruw487e0Oi9q8nPsajE2sjdt6LLzbj4xuTL+8Sjv+nTptPDo6zS8rTLvqHBv8q508NudrrNyKu+1rHkwb+1xLe9yr205rfFCiAqCbbU09rAqdW5YXS1xNbQvOS94bn7yc+xqKOs0ruw49Do0qq9q7Lp0a+94bn7t6LLzbj4xuTL+8Sjv+nTptPDo6y2r8ysyerH68TatOajrLfF1Npjb250ZXh0yc/Pws7E1tC1xGFwcF9wYXJhseTBv9bQCiAqIEBwYXJhbSBhdF9wYXJhcwlBVMP8we7X1rf7tK4KICogQHJldHVybiBjaGFy0M3X1rf7tK6jrLHtyr7Xqru7uvO1xGF0w/zB7rLOyv0KICogQG5vdGUKICogYXRfcGFyYda4z/LIpbX0QVTD/MHuzbeyv7rztcS12tK7uPbX1rf7o6y8tKGuo7qhrwogKiC3tbvYtcRBVMP8we7SssrHJzogJ7+qzbe1xEFUw/zB7rLOyv2jrCAKICogwP2juitDU1E6IDxyc3NpPiw8YmVyPiw8YWN0PiwgYXRfcGFyYc6qOiA8cnNzaT4sPGJlcj4sPGFjdD4sILe1u9g6IDxyc3NpPiw8YmVyPgogKi8KCnR5cGVkZWYgY2hhciAqICgqZm9ybWF0X2luZm9ybV9mdW5jKShjaGFyICphdF9wYXJhcyk7CgoKLyoqCiAqIEBicmllZiDJ+rPJYXS2r9f3x+vH88P8we4KICogQHBhcmFtIGNtZAkgQVTD/MHux+vH88P7s8YKICogQHBhcmFtIHBhcmFtICBBVMP8we7H68fzss7K/QogKiBAcmV0dXJuIGF0tq/X98frx/PX1rf7tK61xNa41esKICogQG5vdGUg08lhdF9jdGy4utTwys23xcTatOYKICovCmNoYXIqIGF0X2FjdF9idWlsZChjaGFyKiBjbWQsIGNoYXIqIHBhcmFtKTsKCi8qKgogKiBAYnJpZWYgyfqzyWF0sunRr8frx/PD/MHuCiAqIEBwYXJhbSBjbWQJQVTD/MHux+vH88P7s8YKICogQHJldHVybiBhdLLp0a/H68fz19a3+7SutcTWuNXrCiAqIEBub3RlINPJYXRfY3RsuLrU8MrNt8XE2rTmCiAqLwpjaGFyKiBhdF9xdWVyeV9idWlsZChjaGFyKiBjbWQpOwoKCi8qKgogKiBAYnJpZWYgIMn6s8lhdLLp0a/H68fzw/zB7rXEz+zTpsP8we6jrLWx09DW0LzkveG5+8nPsajKsaOs1NpzZXJfb3BzX3QytcRyc3BfYWN0tffTw6OsCiAqILjDuq/K/dbQvavW0Lzkyc+xqL3hufu6zW9rYXTD/MHu1+nXsNTa0rvG8KOszai5/W1hbGxvY8nqx+vKudPDtcTE2rTmo6yyore1u9gKICoguMPWuNXruPjN4rLjtffTw7qvyv3KudPDo6zX7tbV08nN4rLjtffTw7qvyv3KzbfFuMPE2rTmCiAqIEBwYXJhbSBjbWQJQVTD/MHuz+zTpsP7s8YKICogQHBhcmFtIHBhcmFtICBBVMP8we7P7NOmss7K/QogKiBAcmV0dXJuIGF0tq/X98/s06bX1rf7tK61xNa41esKICogQG5vdGUgaW5wdXQ6ICBjbWQgICJ4eCIgICAKICogICAgICAgICAgIAlwYXJhbSAgICAieXksenoiIAogKiAgICAgICBvdXRwdXQ6ICAgXHJcbit4eDp5eSx6elxyXG4KICovCmNoYXIqIGF0X3F1ZXJ5X3Jlc3VsdF9idWlsZChjaGFyKiBjbWQsIGNoYXIqIHBhcmFtKTsKCgoKLyoqCiAqIEBicmllZiDJ+rPJYXTP7NOmveG5+09Luq/K/QogKiBAcmV0dXJuIGF0z+zTpr3huftPS9fWt/u0rrXE1rjV6wogKiBAbm90ZSDTyWF0X2N0bLi61PDKzbfFxNq05gogKi8KY2hhciogYXRfb2tfYnVpbGQoKTsKCgovKioKKiBAYnJpZWYgYXTD/MHuveLO9goqIEBwYXJhbSBmbXQgw7+49rLOyv3K5LP2tcTK/b7duPHKvQoqIEBwYXJhbSBidWYg1K3KvMr9vt0KKiBAcGFyYW0gcHZhbCDK5LP2uPHKvbuvuvPK/b7d1rUKKiBAcmV0dXJuIL/J0tTV/ci3veLO9rLOyv21xLj2yv0KKiBAbm90ZSC48cq9vfbWp7PWJWS6zSVzLM2syrG/ydLU1NrDv7j2uPHKvcewvNPJz8r919bS1Na4tqgKCSCx5MG/v8nS1Liz1rW1xL/VvOS089Cho6y1pc67zqrX1r3ao6zA/cjnJTJkse3Kvr3Tyty05rSiv9W85M6qMtfWvdqjuyU1c7Htyr7L48nPJ1wwJ6Os1+624L/J0tQKCSC908rcNbj219a3+6GjtbElZLK71ri2qMr919bKsaOssLTV1TTX1r3avfjQ0Liz1rWjrCVz1PKwtNXVyrW8yr3izva1xNfWt/u0rrOktsjN6siruLPWtaOs09C/ycTcCgkgu+HT0NS9veehowoqyr7A/Qo8cHJlPgoJY2hhciBidWZbXT0iMSwyLFwidGVzdFwiIjsKCWludCBuMSA9IDA7CglpbnQgbjIgPSAwOwoJY2hhciAqbjMgPSBtYWxsb2Moc3RybGVuKGJ1ZikpOwoJY2hhciAqcFtdID0geyZuMSwmbjIsbjN9OwoJcmV0ID0gcGFyc2VfcGFyYW0yKCIlZCwlZCwlcyIsIGJ1ZiwgKHZvaWQqKilwKTsKCS8vveLO9rrzbjE9PTEgbjI9PTIgbjM9PSJ0ZXN0IgkgCglyZXQgPSBwYXJzZV9wYXJhbTIoIiU0ZCwlZCwlM3MiLCBidWYsICh2b2lkKiopcCk7CgkvL73izva6824xPT0xIG4yPT0yIG4zPT0idGUiCSAKCXJldLXE1rXOqjMKPC9wcmU+CiovCmludCBwYXJzZV9wYXJhbTIoY2hhciAqZm10LCBjaGFyICpidWYsIHZvaWQgKipwdmFsKTsKCgovKioKICogQGJyaWVmIEFUw/zB7r3izva907/aCiAqIEBwYXJhbSBmbXQgQVTH68fzu/LP7NOmtcS48cq9u6+3vcq9CiAqIEBwYXJhbSBidWYgIEFUx+vH87vyz+zTprXE19a3+7Su1rjV67K7uqzNt7K/us2/1bjxCiAqIEBwYXJhbSBwdmFsCbjxyr27r7rztcRBVMP8we4KICogQHJldHVybiAwse3Kvr3izvayzsr91f2zo6OsxNqyv7340NDRz7jxtcSyzsr9vOyy6aOssPzAqLLOyv249sr90rvWwtDUvOyy6aOsttTT2r/J0aGyzsr9o6zQ6NKqtffTw9Xf19TQ0L+8wscKICogQG5vdGUgIAogKiAxLiC94s72tcRBVMP8we6x2NDrsLTV1TNHUFAyNzAwN7Hq17zQrdLpo6yyzsr90tS2urrFuPS/qqOs19a3+7Su0Oi0+Mur0v26xaOst/HU8rvhts/R1AogKiAyLiDX1rf7tK694s72yrG1xMjrss6zpLbIsdjQ67Tz09q/ycTcveKz9rXE19a3+7Sus6S2yKOst/HU8rvh1L295wogKiAzLiC3tbvY1rXH67LOv7zDtr7ZZW51bSBTQVBfRVJSo6y6rL/J0aGyzsr90rvWwtDUvOyy6QogKiA0LiDI9GZtdNa4tqi1xLLOyv3A4NDNsdjQ69PrcHZhbNbQ1rjV67XE0rvSu7bU06YKICogNS4gyr7A/Qo8cHJlPgoJY2hhciBidWZbXT0iMSwyLFwidGVzdFwiIjsKCWludCBuMSA9IDA7CglpbnQgbjIgPSAwOwoJY2hhciAqbjMgPSBtYWxsb2Moc3RybGVuKGJ1ZikpOwoJY2hhciAqcFtdID0geyZuMSwmbjIsbjN9OwoJcmV0ID0gcGFyc2VfcGFyYW1fc2FmZSgiJWQsJWQsJXMiLCBidWYsICh2b2lkKiopcCk7CgkvL73izva6824xPT0xIG4yPT0yIG4zPT0idGVzdCIJIAoJcmV0ID0gcGFyc2VfcGFyYW1fc2FmZSgiJTRkLCVkLCUzcyIsIGJ1ZiwgKHZvaWQqKilwKTsKCS8vveLO9rrzbjE9PTEgbjI9PTIgbjM9PSJ0ZSIJIAo8L3ByZT4KICogQHdhcm5pbmcgCiAqLwppbnQgIHBhcnNlX3BhcmFtX3NhZmUoY2hhciAqZm10LCBjaGFyICpidWYsIHZvaWQgKipwdmFsKTsKCgovKioKICogQGJyaWVmINOm08O3osvNtq/X98Dgu/Ky6dGvwOBBVMfrx/O4+DNHUFDQrdLp1bujrLKis6zKsbXItP22r9f3veG5+6O716LS4qO6uMO907/a1rvE3NPD09qy6dGvus3J6NbDus3WtNDQx+vH86Oszai5/cjrss69+NDQ1tC85L3hufu1xMTasr+94s72tKbA7aOssqLH0goJCSAg09DW0LzkveG5+8nPsajKsaOs1rvWp7PW0rvM9dbQvOS94bn7tcTJz7GoveLO9qO7CiAqIEBwYXJhbSByZXFfYXQgIMfrx/NBVMP8we6jrLTz0KHQtMP0uNCjrLHY0Ou089C0CiAqIEBwYXJhbSBpbmZvX2ZtdCBBVM/s06a1xLjxyr27r7e9yr0KICogQHBhcmFtIHB2YWwJuPHKvbuvuvO1xEFUz+zTpqOsvt/M5cq508Oyzr+0cGFyc2VfcGFyYW2907/aCiAqIEBwYXJhbSBzYWZlX3Bhcm1fY2hlY2sJ1rjKvsrHt/G21LLOyv249sr9vfjQ0NK71sLQ1LzssumjrDCx7cq+uqy/ydGhss7K/aOssru21LLOyv249sr9vfjQ0Lzssuk7MbHtyr621LLOyv249sr9vfjQ0NHPuPG87LLpCiAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQ9PTAgse3KvtPAvsO1yLT9veG5+8Lro6y38dTytci0/cqxvOTOqlt0aW1lb3V0XcPrCiAqIEByZXR1cm4gMLHtyr63tbvYs8m5pqOsxuTL+9a1se3KvsqnsNy07c7zwusKICogQG5vdGUgIAogKiAxLiDTw7unyrnTw8qxo6zI9LK7z+vTybjDvdO/2sTasr+9+NDQss7K/bXEuPHKvbuvveLO9qOsv8nS1L2raW5mb19mbXS4s9a1zqoiJXMio6xwdmFsuLPWtc6qY2hhciAqKnDLq9a41eujrNXi0fmyzsr9vavX986q1fvM5dfWt/u0rre1u9i4+LX308PV3wogKiAyLiC21NPaWk1HTCxDUEJSLCBDT1BTPT+1yNK7zPXH68fzu+HT0LbgzPXW0LzkveG5+8fpv/ajrLjDuq/K/bK7ysrTwwogKiAzLiDX1rf7tK694s72yrG1xMjrss6zpLbIsdjQ67Tz09q/ycTcveKz9rXE19a3+7Sus6S2yKOst/HU8rvh1L295wogKiA0LiC1sbTm1NrW0Lzkyc+xqMqxo6xwdmFsus1pbmZvX2ZtdLK7zqq/1aO7tbHOqtbQvOTJz7GoyrGjrMG9uPax2NDrvdTOqr/VCiAqIDUuIHB2YWy6zWluZm9fZm10wb3V39Kqw7S2vM6qTlVMTCzSqsO0tryyu86qTlVMTKOssrvE3LTm1NrG5NbQ0ru49s6qTlVMTKOswe3Su7j2srvOqk5VTEy1xMfpv/YKICogNi4gyr7A/Qo8cHJlPgoJaW50IHJldCA9IDA7CglyZXQgPSBnZXRfbW9kZW1faW5mbzIoIkFUK0NGVU49MVxyIiwgTlVMTCwgIE5VTEwpOwoJLy+3tbvYvLSx7cq+1rTQ0LPJuaYKCgljaGFyICpwc3RyID0gbWFsbG9jKDUwKTsKCW1lbXNldChwc3RyLDAsNTApOwoJcmV0ID0gZ2V0X21vZGVtX2luZm8yKCJBVCtDSU1JXHIiLCAiJXMiLCAgKHZvaWQqKikmcHN0ciwwLDEwKTsKCS8vt7W72LrzcHN0cj09MTExMTExMTExMTExMTExCgoJaW50IG4xID0gMDsKCWludCBuMiA9IDA7CglpbnQgbjMgPSAwOwoJY2hhciAqcDJbXSA9IHsmbjEsJm4yLCZuM307CglyZXQgPSBnZXRfbW9kZW1faW5mbzIoIkFUK0NDSU9UT1BUP1xyIiwgIiVkLCVkLCVkIiwJKHZvaWQqKilwMiwwLDEwKTsKCS8vK0NDSU9UT1BUOiAxLDIsM73izva6824xPT0xIG4yPT0yIG4zPT0zCjwvcHJlPgogKiBAd2FybmluZyAKICovCmludCAgZ2V0X21vZGVtX2luZm8yKGNoYXIgKnJlcV9hdCxjaGFyICppbmZvX2ZtdCx2b2lkICoqcHZhbCwgaW50IHNhZmVfcGFybV9jaGVjaywgaW50IHRpbWVvdXQpOwoKCi8qKgogKiBAYnJpZWYg08PT2r+qu/rXorLhy/nT0LXEt/7O8bbLvt/M5UFUw/zB7srCvP6jrLOj08PT2snPsuO8sL/Nu6e2qNbGo6yyu9e808PT2lBT0K3S6dW7oaMKICogQHBhcmFtIGF0X2NtZF9wcmVmaXggIEFUw/zB7sew17rWuNXrCiAqIEBwYXJhbSBtb2R1bGVfaWQgCSDUtMSjv+m208HQaWQKICogQHBhcmFtIHJlcV9tc2dfaWQJIMfrx/PP+8+iaWQKICogQHBhcmFtIHJzcF9tc2dfaWQJIM/s06bP+8+iaWQKICogQHBhcmFtIHJlcV9yY3ZfYWN0CSDK1bW9x+vH88/7z6LKsbXEtKbA7bqvyv0KICogQHBhcmFtIHJzcF9hY3QJCSDK1bW9z+zTpr3hufvKsbXEtKbA7bqvyv0KICogQHJldHVybiBpbnTQzb3hufvC6wogKiBAcmV0dmFsILPJuaYgMAogKiBAbm90ZSC/ybLOv7zKvsD9tPrC6zogdXNlcl9yZWdpc3QuYwogKi8KaW50ICByZWdpc3Rlcl9zZXJ2X2Z1bmMyKGNoYXIgKmF0X2NtZF9wcmVmaXgsIGludCAgbW9kdWxlX2lkLCBpbnQgIHJlcV9tc2dfaWQsIGludAlyc3BfbXNnX2lkLCBzZXJfcmVxX2Z1bmMyIHJlcV9yY3ZfYWN0LCBhcHBfcnNwX3Byb2MgcnNwX2FjdCk7CgovKioKICogQGJyaWVmINeisuHJz7GoQVTD/MHutcS48cq9u6+0psDtuq/K/aOszeKyv01DVbeiy81BVMP8we6jrG1vZGVtt7W72LXE1tC85L3hufuyu8L61+PN4rK/TUNVtcS48cq90qrH86OsCtDo0qphdF9jdGy9+NDQ16q7uwogKiBAcGFyYW0gYXRfY21kX3ByZWZpeCAgQVTD/MHux7DXuta41esKICogQHBhcmFtIGluZm9ybV9hY3QgIL3TytW1vUFUw/zB7tbQvOS94bn7tcTXqru7tKbA7bqvyv0KICogQHJldHVybiBpbnTQzb3hufvC6wogKiBAcmV0dmFsILPJuaYgMAogKiBAbm90ZQogKi8KaW50ICByZWdpc3Rlcl9mb3JtYXRJbmZvcm1fZnVuYyhjaGFyICphdF9jbWRfcHJlZml4LCBmb3JtYXRfaW5mb3JtX2Z1bmMgaW5mb3JtX2FjdCk7CgojaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUwovKioKICogQGJyaWVmIL/JtPLTodfWt/u0rtequ7vOqtfWvdrK/b7dIKOsyOejugogICAgICAgICAgICAgICAgIkM4MzI5QkZEMEUwMSIgLS0+IHsweEM4LCAweDMyLCAweDlCLCAweEZELCAweDBFLCAweDAxfQogKiBAcGFyYW0gcFNyYyDUtNfWt/u0rta41esKICogQHBhcmFtIHBEc3QgxL+x6sr9vt3WuNXrCiAqIEBwYXJhbSBuU3JjTGVuZ3RoINS019a3+7Sus6S2yAogKiBAcmV0dXJuIMS/serK/b7ds6S2yAogKiBAbm90ZQogKiBAd2FybmluZwogKi8KaW50IHN0cmluZzJieXRlcyhjb25zdCBjaGFyKiBwU3JjLCB1bnNpZ25lZCBjaGFyKiBwRHN0LCBpbnQgblNyY0xlbmd0aCk7Ci8qKgogKiBAYnJpZWYg19a92sr9vt3Xqru7zqq/ybTy06HX1rf7tK4go6zI56O6CiAgICAgICAgICAgICAgICAgICAgIHsweEM4LCAweDMyLCAweDlCLCAweEZELCAweDBFLCAweDAxfSAtLT4gIkM4MzI5QkZEMEUwMSIKICogQHBhcmFtIHBTcmMg1LTK/b7d1rjV6wogKiBAcGFyYW0gcERzdCDEv7Hq19a3+7Su1rjV6wogKiBAcGFyYW0gblNyY0xlbmd0aCDUtMr9vt2zpLbICiAqIEByZXR1cm4gxL+x6sr9vt2zpLbIo7sKICogQG5vdGUKICogQHdhcm5pbmcKICovCmludCBieXRlczJzdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciogcFNyYywgY2hhciogcERzdCwgaW50IG5TcmNMZW5ndGgpOwoKCgogLyoqCiAgKiBAYnJpZWYg1Nq69sLUtPPQodC0tcTH6b/2z8KjrLHIvc/Bvbj2YXTX1rf7tK7Kx7fxz+DNrAogICogQHBhcmFtIGRlc3QgIMS/serX1rf7tK4KICAqIEBwYXJhbSBzb3VyY2Ug1LTX1rf7tK4KICAqIEByZXR1cm4gMLHtyr7BvdfWt/u0rs3qyKvP4M2so6zI57n7tdrSu7j2yOuyzrTz09q12rb+uPbI67LOo6y3tbvY1f3WtaOst/HU8re1u9i4uta1o7sKICAqIEBub3RlCiAgKiBAd2FybmluZyAKICAqLwogaW50IGF0X3N0cmNtcChjb25zdCBjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzb3VyY2UpOwoKCiAvKioKICAqIEBicmllZiDU2rr2wtS089Ch0LS1xMfpv/bPwqOssci9z8G9uPZhdNfWt/u0rsewc2l6ZbOktsjKx7fxz+DNrAogICogQHBhcmFtIGRlc3QgIMS/serX1rf7tK4KICAqIEBwYXJhbSBzb3VyY2Ug1LTX1rf7tK4KICAqIEBwYXJhbSBzaXplILHIvc+1xNfWvdrK/QogICogQHJldHVybiAwse3KvsG919a3+7Sux7BzaXpls6S2yM3qyKvP4M2so6zI57n7tdrSu7j2yOuyzrTz09q12rb+uPbI67LOo6y3tbvY1f3WtaOst/HU8re1u9i4uta1o7sKICAqIEBub3RlCiAgKiBAd2FybmluZyAKICAqLwogaW50IGF0X3N0cm5jbXAoY29uc3QgY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc291cmNlLCBpbnQgc2l6ZSk7CgogIC8qKgogICogQGJyaWVmINTauvbC1LTz0KHQtLXEx+m/9s/Co6zU2nNvdXJjZdbQ0bDV0nN1YnN0ctfTtK61xM671sMKICAqIEBwYXJhbSBkZXN0ICDEv7Hq19a3+7SuCiAgKiBAcGFyYW0gc291cmNlINS019a3+7SuCiAgKiBAcmV0dXJuIMjnufvV0rW9o6zWsb3Tt7W72HN1YnN0ctTac291cmNl1tC12tK7tM6z9s/WtcTOu9bDo6zI57n7w7vT0NXStb2jrLe1u9hOVUxMCiAgKiBAbm90ZQogICogQHdhcm5pbmcgCiAgKi8KIGNoYXIgKiBhdF9zdHJzdHIoY29uc3QgY2hhciAqIHNvdXJjZSwgY29uc3QgY2hhciAqIHN1YnN0cik7CgogCiAgLy/Tw9PavMbL48DbvNO1xENIRUNLU1VN1rUKIHVuc2lnbmVkIHNob3J0IGdldF9jaGtzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqcHRyLCB1bnNpZ25lZCBzaG9ydCBsZW4pOwojZW5kaWYKCiNlbmRpZgoK