[/b/] [/d/] [/tu/] [/a/] [/ph/] [/wa/] [/cg/] [/t/] [/p/]
Скрипты/софт облегчающий жизнь.Прошлый тред >>174285
Скрипты/софт облегчающий жизнь.
Прошлый тред >>174285
>>217058POSIX это не про легкие пути.
Для тех, кто любит попытаться выжать невыжимаемое из прыщей при помощи fireдолбоеба.https://github.com/netblue30/firejail/issues/2874Пиздец. Пол часа дрочил strace, еще пол часа гуглил.
Говноскрипт на питухоне для интеграции крысы в и3. Употреблядь вместе с xfce4-genmon-plugin при помощи cat $lockFile.#!/bin/python3import i3ipcimport osimport sys# Just so you know my idea to use lock file has lead to a fuck up because it# didn't always get removed, so I figured I'd use PID instead, so the lock file# is actually the file, which holds the message.home = os.environ.get('HOME')lockDir = '%s/.cache' % homepidDir = '%s/.run' % homef = 0 # neverminddef perror(msg, err): print('%s: %s' % (msg, err))def trymkdir(path): try: os.mkdir(path) except FileExistsError: pass except Exception as e: perror(path, e) sys.exit(1)trymkdir(lockDir)trymkdir(pidDir)lock = '%s/i3ipc-mode.lock' % lockDirpidFile = '%s/i3ipc-mode.pid' % pidDirpid = os.getpid()oldpid = 0try: f = open(pidFile, "r")except FileNotFoundError: passexcept Exception as e: perror(pidFile, e) os.exit(1)else: oldpid = f.read().strip() if oldpid.isdigit(): oldpid = int(oldpid) f.close() else: perror(oldpid, 'Not PID of a process!') sys.exit(1) if os.path.exists('%s/%d' % ('/proc', oldpid)): print('Already running.') sys.exit(0)def trywrite(path, msg): try: f = open(path, 'w') f.write(msg) f.close() except Exception as e: perror(path, e) sys.exit(1)trywrite(pidFile, '%d' % pid)trywrite(lock, 'default')def ISR_mode(con, event): mode = event.change # output designed for genmon xfce4-plugin if mode != 'default': mode = '<span fgcolor=\'Red\'>%s</span>' % mode mode = '<txt>%s</txt>' % mode trywrite(lock, mode) os.system('xfce4-panel --plugin-event=genmon:refresh:bool:true')i3ipc_conn = i3ipc.Connection()i3ipc_conn.on('mode', ISR_mode)i3ipc_conn.main()def tryremove(path): try: os.remove(path) except Exception as e: perror(path, e) sys.exit(1)tryremove(lock)tryremove(pidFile)
Говноскрипт на питухоне для интеграции крысы в и3. Употреблядь вместе с xfce4-genmon-plugin при помощи cat $lockFile.
#!/bin/python3import i3ipcimport osimport sys# Just so you know my idea to use lock file has lead to a fuck up because it# didn't always get removed, so I figured I'd use PID instead, so the lock file# is actually the file, which holds the message.home = os.environ.get('HOME')lockDir = '%s/.cache' % homepidDir = '%s/.run' % homef = 0 # neverminddef perror(msg, err): print('%s: %s' % (msg, err))def trymkdir(path): try: os.mkdir(path) except FileExistsError: pass except Exception as e: perror(path, e) sys.exit(1)trymkdir(lockDir)trymkdir(pidDir)lock = '%s/i3ipc-mode.lock' % lockDirpidFile = '%s/i3ipc-mode.pid' % pidDirpid = os.getpid()oldpid = 0try: f = open(pidFile, "r")except FileNotFoundError: passexcept Exception as e: perror(pidFile, e) os.exit(1)else: oldpid = f.read().strip() if oldpid.isdigit(): oldpid = int(oldpid) f.close() else: perror(oldpid, 'Not PID of a process!') sys.exit(1) if os.path.exists('%s/%d' % ('/proc', oldpid)): print('Already running.') sys.exit(0)def trywrite(path, msg): try: f = open(path, 'w') f.write(msg) f.close() except Exception as e: perror(path, e) sys.exit(1)trywrite(pidFile, '%d' % pid)trywrite(lock, 'default')def ISR_mode(con, event): mode = event.change # output designed for genmon xfce4-plugin if mode != 'default': mode = '<span fgcolor=\'Red\'>%s</span>' % mode mode = '<txt>%s</txt>' % mode trywrite(lock, mode) os.system('xfce4-panel --plugin-event=genmon:refresh:bool:true')i3ipc_conn = i3ipc.Connection()i3ipc_conn.on('mode', ISR_mode)i3ipc_conn.main()def tryremove(path): try: os.remove(path) except Exception as e: perror(path, e) sys.exit(1)tryremove(lock)tryremove(pidFile)
>>194560Можно использовать gnome-boxes, вроде приемлимо выглядит по нынешним времнам и вместе с гномьей щелью ставится.https://help.gnome.org/users/gnome-boxes/stable/
Автозапуск иксов после логина в tty1. Последней строчкой в ~/.profile:[ -z $DISPLAY ] && [ $XDG_VTNR -eq 1 ] && exec startxПосле Ctrl+Alt+Backspace они сразу перезапускаются. Для выходы из графики придётся логиниться во второй tty, например.
Автозапуск иксов после логина в tty1. Последней строчкой в ~/.profile:
[ -z $DISPLAY ] && [ $XDG_VTNR -eq 1 ] && exec startx
После Ctrl+Alt+Backspace они сразу перезапускаются. Для выходы из графики придётся логиниться во второй tty, например.
>>217814if [ "${XDG_SESSION_TYPE}${XDG_VTNR}" = "tty1" ]; then startxfi
>>217814
if [ "${XDG_SESSION_TYPE}${XDG_VTNR}" = "tty1" ]; then startxfi
>>217814ничоси!
https://scoop.sh - Eliminates permission popup windows - Hides GUI wizard-style installers - Prevents PATH pollution from installing lots of programs - Avoids unexpected side-effects from installing and uninstalling programs - Finds and installs dependencies automatically - Performs all the extra setup steps itself to get a working program
https://scoop.sh
- Eliminates permission popup windows - Hides GUI wizard-style installers - Prevents PATH pollution from installing lots of programs - Avoids unexpected side-effects from installing and uninstalling programs - Finds and installs dependencies automatically - Performs all the extra setup steps itself to get a working program
sxiv -o *jpg | xargs -I + mv + new/path/Посмотреть пикчи, отметить нужные клавишей m, вывести их названия в stdout, где их подхватит xargs.
sxiv -o *jpg | xargs -I + mv + new/path/
Посмотреть пикчи, отметить нужные клавишей m, вывести их названия в stdout, где их подхватит xargs.
Заменить черный цвет на прозрачность в папке и подпапках, преобразовать jpg в png с прозрачностью, разброс распознания черного 10%find /home/pic -type f -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" | while read file; do convert "$file" -fuzz 10% -transparent black "${file%.png}_transparent.png"Где:/путь/к/каталогу - это путь к корневой папке, в которой находятся ваши изображения.-type f - это опция find, которая ищет только файлы, а не директории.-iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" - это фильтры для поиска файлов с расширениями PNG, JPEG и JPG.convert "$file" -fuzz XX% -transparent black "${file%.png}_transparent.png" - это команда для каждого найденного файла. Она выполняет замену черного цвета на прозрачность с использованием ImageMagick и сохраняет измененное изображение с суффиксом "_transparent.png" в той же директории.Принимаю заказы на написание регулярок нейросеткой, эта хуйня отлично справляется.
Заменить черный цвет на прозрачность в папке и подпапках, преобразовать jpg в png с прозрачностью, разброс распознания черного 10%
find /home/pic -type f -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" | while read file; do convert "$file" -fuzz 10% -transparent black "${file%.png}_transparent.png"Где:/путь/к/каталогу - это путь к корневой папке, в которой находятся ваши изображения.
-type f - это опция find, которая ищет только файлы, а не директории.-iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" - это фильтры для поиска файлов с расширениями PNG, JPEG и JPG.convert "$file" -fuzz XX% -transparent black "${file%.png}_transparent.png" - это команда для каждого найденного файла. Она выполняет замену черного цвета на прозрачность с использованием ImageMagick и сохраняет измененное изображение с суффиксом "_transparent.png" в той же директории.
Принимаю заказы на написание регулярок нейросеткой, эта хуйня отлично справляется.
>>218302A guro po vashemu kankolle esche ne sdelali? Gde zapisat'sya, chtoby sdelali?
>>218302
>>218302> -iname "*.jpg"> "${file%.png}_transparent.png"лол, ты бы хотябы проверяй перед тем как постить
> -iname "*.jpg"> "${file%.png}_transparent.png"
лол, ты бы хотябы проверяй перед тем как постить
>>218316 УМВР.
Проверка по кд и переподключение L2TP соединения в случае отвала. По хорошему нужно еще замутить киллсвич но я сырна. #!/bin/bashwhile [ "true" ]do VPNCON=$(nmcli con status) if [[ $VPNCON != 'CONNECTION NAME' ]]; then echo "Disconnected, trying to reconnect..." (sleep 1s && nmcli con up uuid CONNECTION UUID) else echo "Already connected !" fi sleep 30done
Проверка по кд и переподключение L2TP соединения в случае отвала. По хорошему нужно еще замутить киллсвич но я сырна.
#!/bin/bashwhile [ "true" ]do VPNCON=$(nmcli con status) if [[ $VPNCON != 'CONNECTION NAME' ]]; then echo "Disconnected, trying to reconnect..." (sleep 1s && nmcli con up uuid CONNECTION UUID) else echo "Already connected !" fi sleep 30done
>>218323 Opensnitch.c:chi
test
Уцух, я честно пытался, но у тебя какая-то Critical SQL Error. Это tar архив тремя сообщениями, щас я объясню.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XAp7IFwKICAgIGlmIChOT19OT1RJRlkpIHJldHVybjsgXAogICAgaWYgKCFpbml0ZWQpIHsgXAogICAgICAgIGlmIChub3RpZnlfaW5pdCAoInBhdmN0bCIpID09IEZBTFNFKSB7IFwKICAgICAgICAgICAgREJHKCAyLCBcCiAgICAgICAgICAgICAgICAgICAgIiVzOiAlcywgJXNcbiIsIFwKICAgICAgICAgICAgICAgICAgICAibm90aWZ5X2luaXQiLCBcCiAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBpbml0aWFsaXplIGxpYm5vdGlmeSIsIFwKICAgICAgICAgICAgICAgICAgICAibm90IHNlbmRpbmcgYW55IG5vdGlmaWNhdGlvbnMiIFwKICAgICAgICAgICAgICAgKTsgXAogICAgICAgICAgICByZXR1cm47IFwKICAgICAgICB9IFwKICAgICAgICBpbml0ZWQgPSAxOyBcCiAgICB9IFwKfQoKdm9pZApub3RpZnlfdm9sdW1lCigKIGludCB0YXJnZXQsCiBpbnQgdm9sCikKewogICAgaW5pdCgpOwogICAgY2hhciBzdHJbNjRdOwogICAgY2hhciBzeW0xW10gPSAi8J+UiSI7CiAgICBjaGFyIHN5bTJbXSA9ICLwn46kIjsKICAgIGNoYXIgKnN5bTsKICAgIHN3aXRjaCAodGFyZ2V0KSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBzeW0gPSBzeW0xOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHN5bSA9IHN5bTI7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgc25wcmludGYgKHN0ciwgc2l6ZW9mIChzdHIpLCAiJXM6ICVkIiwgc3ltLCB2b2wpOwogICAgTm90aWZ5Tm90aWZpY2F0aW9uICpuID0gbm90aWZ5X25vdGlmaWNhdGlvbl9uZXcgKHN0ciwgTlVMTCwgTlVMTCk7CiAgICBub3RpZnlfbm90aWZpY2F0aW9uX3NldF9oaW50X3N0cmluZyAobiwKICAgICAgICAgICAgIngtY2Fub25pY2FsLXByaXZhdGUtc3luY2hyb25vdXMiLAogICAgICAgICAgICAicGF2Y3RsLXZvbHVtZSIKICAgICAgICAgICAgKTsKICAgIG5vdGlmeV9ub3RpZmljYXRpb25fc2hvdyAobiwgTlVMTCk7CiAgICBnX29iamVjdF91bnJlZiAoR19PQkpFQ1QobikpOwogICAgcmV0dXJuOwp9Cgp2b2lkCm5vdGlmeV9tdXRlCigKIGludCB0YXJnZXQsCiBpbnQgbXV0ZQopCnsKICAgIGluaXQoKTsKICAgIGNoYXIgc3RyWzY0XTsKICAgIGNoYXIgd2hvMVtdID0gIlNvdW5kIjsKICAgIGNoYXIgd2hvMltdID0gIk1pY3JvcGhvbmUiOwogICAgY2hhciB1bltdID0gInVuIjsKICAgIGNoYXIgZW1wW10gPSAiIjsKICAgIGNoYXIgc3ltW10gPSAi8J+UhyI7CiAgICBjaGFyICp1OwogICAgY2hhciAqd2hvOwogICAgc3dpdGNoICh0YXJnZXQpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHdobyA9IHdobzE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgICAgd2hvID0gd2hvMjsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAobXV0ZSkKICAgICAgICB1ID0gZW1wOwogICAgZWxzZQogICAgICAgIHUgPSB1bjsKICAgIHNucHJpbnRmIChzdHIsIHNpemVvZiAoc3RyKSwgIiVzOiAlcyBpcyAlc211dGVkIiwgc3ltLCB3aG8sIHUpOwogICAgTm90aWZ5Tm90aWZpY2F0aW9uICpuID0gbm90aWZ5X25vdGlmaWNhdGlvbl9uZXcgKHN0ciwgTlVMTCwgTlVMTCk7CiAgICBub3RpZnlfbm90aWZpY2F0aW9uX3NldF9oaW50X3N0cmluZyAobiwKICAgICAgICAgICAgIngtY2Fub25pY2FsLXByaXZhdGUtc3luY2hyb25vdXMiLAogICAgICAgICAgICAicGF2Y3RsLW11dGUiCiAgICAgICAgICAgICk7CiAgICBub3RpZnlfbm90aWZpY2F0aW9uX3Nob3cgKG4sIE5VTEwpOwogICAgZ19vYmplY3RfdW5yZWYgKEdfT0JKRUNUKG4pKTsKICAgIHJldHVybjsKfQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcGF2Y3RsLmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMTc1MQAwMDAxNzUxADAwMDAwMDU2NDU0ADE0NTIxMjM1NzAxADAxMjcyMQAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAG5pa2l0aWNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbmlraXRpY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjZGVmaW5lIF9QT1NJWF9DX1NPVVJDRSAyMDA4MDlMCiNkZWZpbmUgX0RFRkFVTFRfU09VUkNFCiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8cHVsc2UvcHVsc2VhdWRpby5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlICJwYXZjdGwuaCIKI2luY2x1ZGUgIm5vdGlmeS5oIgoKI2RlZmluZSBDS0ZBSUxDKExFViwgRk5BTUUsIFdITywgTVNHLCBDT05ELCBSRVRWQUwpIHsgXAogICAgaWYgKENPTkQpIHsgXAogICAgICAgIERCRyggTEVWLCBcCiAgICAgICAgICAgICAiJXM6ICVzOiAlcyAlc1xuIiwgXAogICAgICAgICAgICAgRk5BTUUsIFwKICAgICAgICAgICAgIFdITywgXAogICAgICAgICAgICAgImZhaWxlZCB0byIsIFwKICAgICAgICAgICAgIE1TRyBcCiAgICAgICAgICAgKTsgXAogICAgICAgIHJldHVybiBSRVRWQUw7IFwKICAgIH0gXAp9CgojZGVmaW5lIFBBX0ZVQ0tPRkYoY3R4LCBtbCkgeyBcCiAgICBwYV9jb250ZXh0X2Rpc2Nvbm5lY3QgKGN0eCk7IFwKICAgIHBhX2NvbnRleHRfdW5yZWYgKGN0eCk7IFwKICAgIHBhX21haW5sb29wX2ZyZWUgKG1sKTsgXAp9CgojZGVmaW5lIFBBX0NPTlRFWFRfRkFJTEVEX0VSUiAxCiNkZWZpbmUgUEFfQ09OVEVYVF9URVJNSU5BVEVEX0VSUiAyCiNkZWZpbmUgUEFfU0VUX1NJTktfVk9MVU1FX0VSUiAzCiNkZWZpbmUgUEFfU0VUX1NPVVJDRV9WT0xVTUVfRVJSIDQKI2RlZmluZSBQQV9PUEVSQVRJT05fQ0FOQ0VMTEVEX0VSUiA1Ci8vIG5leHQgdHdvIG1heSBiZSBkdWUgdG8gc29tZSBzaW5rIG5hbWluZyBmdWNrdXBzLCBzaG91bGRuJ3QKLy8gbm9ybWFsbHkgaGFwcGVuLCBubyBpZGVhIGhvdyB0byBkZWJ1ZyBpZiBub3QgbmFtaW5nIGZ1Y2t1cAojZGVmaW5lIFBBX0dFVF9TSU5LX1NUQVRFX0VSUiA2CiNkZWZpbmUgUEFfR0VUX1NPVVJDRV9TVEFURV9FUlIgNwojZGVmaW5lIENPTlZFUlNJT05fVE9fVk9MVU1FX0ZBSUxFRF9FUlIgOAojZGVmaW5lIFZPTFVNRV9PVVRfT0ZfQk9VTkRBUklFU19FUlIgOQojZGVmaW5lIE9QVElPTl9OT19BUkdfRVJSIDEwCiNkZWZpbmUgUEFfR0VUX1NJTktfTkFNRV9FUlIgMTEKI2RlZmluZSBQQV9HRVRfU09VUkNFX05BTUVfRVJSIDEyCiNkZWZpbmUgUEFfU0VUX1NJTktfTVVURV9FUlIgMTMKI2RlZmluZSBQQV9TRVRfU09VUkNFX01VVEVfRVJSIDEzCiNkZWZpbmUgTk9fSE9NRV9FUlIgMTQKI2RlZmluZSBTWVNDQUxMX0VSUiAxNQojZGVmaW5lIEFMUkVBRFlfUlVOTklOR19FUlIgMTYKI2RlZmluZSBVTktOT1dOX0VSUiAxMjcKCiNkZWZpbmUgTUlOVk9MVU1FIDAKI2RlZmluZSBNQVhWT0xVTUUgMTUwCgplbnVtIHsKICAgIEhFTFAgPSAwLAogICAgU0VULAogICAgR0VULAogICAgSU5DLAogICAgREVDLAogICAgTUlDLAogICAgU0lOSywKICAgIE1VVEUsCiAgICBOT05PVElGWSwKICAgIFlFU05PVElGWQp9OwoKZW51bSB7CiAgICBHRVRfU0VSVl9JTkZPLAogICAgR0VUX1NJTktfU1QsCiAgICBHRVRfU09VUkNFX1NULAogICAgU0VUX1NJTktfVk9MLAogICAgU0VUX1NJTktfTVVURSwKICAgIFNFVF9TT1VSQ0VfVk9MLAogICAgU0VUX1NPVVJDRV9NVVRFCn07CgpzdHJ1Y3Qgdm9sdW1lX211dGUgewogICAgcGFfY3ZvbHVtZSAqdm9sOwogICAgaW50IG11dGU7Cn07CgppbnQgcGFfcmVhZHkgPSAwOwoKdm9pZApwYV9nZXRfZGVmYXVsdF9zZXJ2ZXJfaW5mb19jYgooCiBwYV9jb250ZXh0ICpjLAogY29uc3QgcGFfc2VydmVyX2luZm8gKmksCiB2b2lkICpkYXRhCikKewogICAgY2hhciAqKnVzZXJkYXRhOwogICAgdXNlcmRhdGEgPSBkYXRhOwogICAgdXNlcmRhdGFbMF0gPSBzdHJkdXAgKGktPmRlZmF1bHRfc2lua19uYW1lKTsKICAgIHVzZXJkYXRhWzFdID0gc3RyZHVwIChpLT5kZWZhdWx0X3NvdXJjZV9uYW1lKTsKICAgIHJldHVybjsKfQoKdm9pZApwYV9nZXRfc2lua19jdm9sdW1lX2NiCigKIHBhX2NvbnRleHQgKmMsCiBjb25zdCBwYV9zaW5rX2luZm8gKmksCiBpbnQgZW9sLAogdm9pZCAqZGF0YQopCnsKICAgIGlmIChlb2wpCiAgICAgICAgcmV0dXJuOwoKICAgIHN0cnVjdCB2b2x1bWVfbXV0ZSAqdm07CiAgICB2bSA9IGRhdGE7CiAgICAqKHZtLT52b2wpID0gaS0+dm9sdW1lOwogICAgdm0tPm11dGUgPSBpLT5tdXRlOwogICAgcmV0dXJuOwp9Cgp2b2lkCnBhX2dldF9zb3VyY2VfY3ZvbHVtZV9jYgooCiBwYV9jb250ZXh0ICpjLAogY29uc3QgcGFfc291cmNlX2luZm8gKmksCiBpbnQgZW9sLAogdm9pZCAqZGF0YQopCnsKICAgIGlmIChlb2wpCiAgICAgICAgcmV0dXJuOwoKICAgIHN0cnVjdCB2b2x1bWVfbXV0ZSAqdm07CiAgICB2bSA9IGRhdGE7CiAgICAqKHZtLT52b2wpID0gaS0+dm9sdW1lOwogICAgdm0tPm11dGUgPSBpLT5tdXRlOwogICAgcmV0dXJuOwp9Cgp2b2lkCnBhX3N1Y2Nlc3NfY2IKKAogcGFfY29udGV4dCAqYywKIGludCBzdWNjZXNzLAogdm9pZCAqZGF0YQopCnsKICAgIGludCAqaSA9IGRhdGE7CiAgICAqaSA9IHN1Y2Nlc3M7Cn0KCnZvaWQKcGFfaGFuZGxlX3N0YXRlX2NiCigKIHBhX2NvbnRleHQgKmMsCiB2b2lkICpkYXRhCikKewogICAgcGFfbWFpbmxvb3AgKnBhX21sOwogICAgcGFfbWwgPSBkYXRhOwoKICAgIERCRygyLCAicGFfaGFuZGxlX3N0YXRlOiBlbnRlcmVkIGZ1bmN0aW9uIGJvZHkuXG4iKTsKICAgIHN3aXRjaCAocGFfY29udGV4dF9nZXRfc3RhdGUoYykpIHsKICAgICAgICBjYXNlIFBBX0NPTlRFWFRfUkVBRFk6CiAgICAgICAgICAgIERCRyggMiwKICAgICAgICAgICAgICAgICAiJXM6ICVzXG4iLAogICAgICAgICAgICAgICAgICJwYV9oYW5kbGVfc3RhdGUiLAogICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIHJlYWR5LiIKICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgcGFfcmVhZHkgPSAxOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgY2FzZSBQQV9DT05URVhUX0ZBSUxFRDoKICAgICAgICAgICAgREJHKCAyLAogICAgICAgICAgICAgICAgICIlczogJXNcbiIsCiAgICAgICAgICAgICAgICAgInBhX2hhbmRsZV9zdGF0ZSIsCiAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb25uZWN0IHRvIHB1bHNlYWRpbyBkYWVtb24uIgogICAgICAgICAgICAgICApOwogICAgICAgICAgICBQQV9GVUNLT0ZGKGMsIHBhX21sKTsKICAgICAgICAgICAgZXhpdChQQV9DT05URVhUX0ZBSUxFRF9FUlIpOwogICAgICAgIGNhc2UgUEFfQ09OVEVYVF9URVJNSU5BVEVEOgogICAgICAgICAgICBEQkcoIDIsCiAgICAgICAgICAgICAgICAgIiVzOiAlc1xuIiwKICAgICAgICAgICAgICAgICAicGFfaGFuZGxlX3N0YXRlIiwKICAgICAgICAgICAgICAgICAiUHVsc2VhZGlvIGNvbm5lY3Rpb24gdGVybWluYXRlZC4iCiAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIFBBX0ZVQ0tPRkYoYywgcGFfbWwpOwogICAgICAgICAgICBleGl0KFBBX0NPTlRFWFRfVEVSTUlOQVRFRF9FUlIpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIERCRyggMiwKICAgICAgICAgICAgICAgICAiJXM6ICVzXG4iLAogICAgICAgICAgICAgICAgICJwYV9oYW5kbGVfc3RhdGUiLAogICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIHN0YXRlIG5vdCBoYW5kbGVkIChpZ25vcmVkKS4iCiAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIHBhX3JlYWR5ID0gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICB9Cn0KCmludApwYV9wZXJmb3JtX2FjdGlvbgooCiBwYV9jb250ZXh0ICpjLAogcGFfbWFpbmxvb3AgKm1sLAogY2hhciAqKnNpc29uLAogc3RydWN0IHZvbHVtZV9tdXRlICp2bXMsIC8vIGl0J3MgYXJyYXkhISEKIGludCBhY3Rpb24sCiBpbnQgKnNldGVycgopCnsKICAgIGNoYXIgZm5hbWVbXSA9ICJwYV9wZXJmb3JtX2FjdGlvbiI7CiAgICBjaGFyIGZwYXRbXSA9ICIlczogJXNcbiI7CiAgICBpbnQgb3BlcmF0aW9uID0gMDsKICAgIHBhX29wZXJhdGlvbiAqcGFfb3A7CiAgICBwYV9vcGVyYXRpb25fc3RhdGVfdCBwYV9zdGF0ZTsKCiAgICBEQkcoIDIsCiAgICAgICAgIGZwYXQsCiAgICAgICAgIGZuYW1lLAogICAgICAgICAiRW50ZXJpbmcgbG9vcC4iCiAgICAgICApOwogICAgd2hpbGUgKDEpIHsKICAgICAgICBEQkcoIDIsCiAgICAgICAgICAgICBmcGF0LAogICAgICAgICAgICAgZm5hbWUsCiAgICAgICAgICAgICAiQ2hlY2tpbmcgaWYgcHVsc2VhZGlvIGlzIHJlYWR5LiIKICAgICAgICAgICApOwogICAgICAgIGlmICghcGFfcmVhZHkpIHsKICAgICAgICAgICAgREJHKCAyLAogICAgICAgICAgICAgICAgIGZwYXQsCiAgICAgICAgICAgICAgICAgZm5hbWUsCiAgICAgICAgICAgICAgICAgIk5vdCByZWFkeS4gSXRlcmF0aW5nIG1haW5sb29wLiIKICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgcGFfbWFpbmxvb3BfaXRlcmF0ZSAobWwsIDEsIE5VTEwpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIERCRyggMiwKICAgICAgICAgICAgIGZwYXQsCiAgICAgICAgICAgICBmbmFtZSwKICAgICAgICAgICAgICJQdWxzZWFkaW8gcmVhZHkuIgogICAgICAgICAgICk7CiAgICAgICAgY2hhciBmcGF0MltdID0gIiVzOiAlczogJXNcbiI7CiAgICAgICAgY2hhciBhY3Rpb25zdHJbMjU2XTsKICAgICAgICBpZiAoIW9wZXJhdGlvbikgewogICAgICAgICAgICBtZW1zZXQgKGFjdGlvbnN0ciwgMCwgc2l6ZW9mIChjaGFyKSAqIDI1Nik7CiAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICAgICAgICAgICAgICBjYXNlIEdFVF9TRVJWX0lORk86CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5IChhY3Rpb25zdHIsICJHRVRfU0VSVl9JTkZPIik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEdFVF9TSU5LX1NUOgogICAgICAgICAgICAgICAgICAgIHN0cmNweSAoYWN0aW9uc3RyLCAiR0VUX1NJTktfU1QiKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgR0VUX1NPVVJDRV9TVDoKICAgICAgICAgICAgICAgICAgICBzdHJjcHkgKGFjdGlvbnN0ciwgIkdFVF9TT1VSQ0VfU1QiKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgU0VUX1NJTktfVk9MOgogICAgICAgICAgICAgICAgICAgIHN0cmNweSAoYWN0aW9uc3RyLCAiU0VUX1NJTktfVk9MIik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFNFVF9TSU5LX01VVEU6CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5IChhY3Rpb25zdHIsICJTRVRfU0lOS19WT0wiKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgU0VUX1NPVVJDRV9WT0w6CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5IChhY3Rpb25zdHIsICJTRVRfU09VUkNFX1ZPTCIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBTRVRfU09VUkNFX01VVEU6CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5IChhY3Rpb25zdHIsICJTRVRfU09VUkNFX01VVEUiKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3dpdGNoIChvcGVyYXRpb24pIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgREJHKCAyLAogICAgICAgICAgICAgICAgICAgICBmcGF0MiwKICAgICAgICAgICAgICAgICAgICAgZm5hbWUsCiAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnN0ciwKICAgICAgICAgICAgICAgICAgICAgInNlbmRpbmcgcmVxdWVzdCIKICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgICAgICAgICAgICAgICAgIGNhc2UgR0VUX1NFUlZfSU5GTzoKICAgICAgICAgICAgICAgICAgICAgICAgcGFfb3AgPSBwYV9jb250ZXh0X2dldF9zZXJ2ZXJfaW5mbyAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYV9nZXRfZGVmYXVsdF9zZXJ2ZXJfaW5mb19jYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXNvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAg
Уцух, я честно пытался, но у тебя какая-то Critical SQL Error. Это tar архив тремя сообщениями, щас я объясню.
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XAp7IFwKICAgIGlmIChOT19OT1RJRlkpIHJldHVybjsgXAogICAgaWYgKCFpbml0ZWQpIHsgXAogICAgICAgIGlmIChub3RpZnlfaW5pdCAoInBhdmN0bCIpID09IEZBTFNFKSB7IFwKICAgICAgICAgICAgREJHKCAyLCBcCiAgICAgICAgICAgICAgICAgICAgIiVzOiAlcywgJXNcbiIsIFwKICAgICAgICAgICAgICAgICAgICAibm90aWZ5X2luaXQiLCBcCiAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBpbml0aWFsaXplIGxpYm5vdGlmeSIsIFwKICAgICAgICAgICAgICAgICAgICAibm90IHNlbmRpbmcgYW55IG5vdGlmaWNhdGlvbnMiIFwKICAgICAgICAgICAgICAgKTsgXAogICAgICAgICAgICByZXR1cm47IFwKICAgICAgICB9IFwKICAgICAgICBpbml0ZWQgPSAxOyBcCiAgICB9IFwKfQoKdm9pZApub3RpZnlfdm9sdW1lCigKIGludCB0YXJnZXQsCiBpbnQgdm9sCikKewogICAgaW5pdCgpOwogICAgY2hhciBzdHJbNjRdOwogICAgY2hhciBzeW0xW10gPSAi8J+UiSI7CiAgICBjaGFyIHN5bTJbXSA9ICLwn46kIjsKICAgIGNoYXIgKnN5bTsKICAgIHN3aXRjaCAodGFyZ2V0KSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBzeW0gPSBzeW0xOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHN5bSA9IHN5bTI7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgc25wcmludGYgKHN0ciwgc2l6ZW9mIChzdHIpLCAiJXM6ICVkIiwgc3ltLCB2b2wpOwogICAgTm90aWZ5Tm90aWZpY2F0aW9uICpuID0gbm90aWZ5X25vdGlmaWNhdGlvbl9uZXcgKHN0ciwgTlVMTCwgTlVMTCk7CiAgICBub3RpZnlfbm90aWZpY2F0aW9uX3NldF9oaW50X3N0cmluZyAobiwKICAgICAgICAgICAgIngtY2Fub25pY2FsLXByaXZhdGUtc3luY2hyb25vdXMiLAogICAgICAgICAgICAicGF2Y3RsLXZvbHVtZSIKICAgICAgICAgICAgKTsKICAgIG5vdGlmeV9ub3RpZmljYXRpb25fc2hvdyAobiwgTlVMTCk7CiAgICBnX29iamVjdF91bnJlZiAoR19PQkpFQ1QobikpOwogICAgcmV0dXJuOwp9Cgp2b2lkCm5vdGlmeV9tdXRlCigKIGludCB0YXJnZXQsCiBpbnQgbXV0ZQopCnsKICAgIGluaXQoKTsKICAgIGNoYXIgc3RyWzY0XTsKICAgIGNoYXIgd2hvMVtdID0gIlNvdW5kIjsKICAgIGNoYXIgd2hvMltdID0gIk1pY3JvcGhvbmUiOwogICAgY2hhciB1bltdID0gInVuIjsKICAgIGNoYXIgZW1wW10gPSAiIjsKICAgIGNoYXIgc3ltW10gPSAi8J+UhyI7CiAgICBjaGFyICp1OwogICAgY2hhciAqd2hvOwogICAgc3dpdGNoICh0YXJnZXQpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHdobyA9IHdobzE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgICAgd2hvID0gd2hvMjsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAobXV0ZSkKICAgICAgICB1ID0gZW1wOwogICAgZWxzZQogICAgICAgIHUgPSB1bjsKICAgIHNucHJpbnRmIChzdHIsIHNpemVvZiAoc3RyKSwgIiVzOiAlcyBpcyAlc211dGVkIiwgc3ltLCB3aG8sIHUpOwogICAgTm90aWZ5Tm90aWZpY2F0aW9uICpuID0gbm90aWZ5X25vdGlmaWNhdGlvbl9uZXcgKHN0ciwgTlVMTCwgTlVMTCk7CiAgICBub3RpZnlfbm90aWZpY2F0aW9uX3NldF9oaW50X3N0cmluZyAobiwKICAgICAgICAgICAgIngtY2Fub25pY2FsLXByaXZhdGUtc3luY2hyb25vdXMiLAogICAgICAgICAgICAicGF2Y3RsLW11dGUiCiAgICAgICAgICAgICk7CiAgICBub3RpZnlfbm90aWZpY2F0aW9uX3Nob3cgKG4sIE5VTEwpOwogICAgZ19vYmplY3RfdW5yZWYgKEdfT0JKRUNUKG4pKTsKICAgIHJldHVybjsKfQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcGF2Y3RsLmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMTc1MQAwMDAxNzUxADAwMDAwMDU2NDU0ADE0NTIxMjM1NzAxADAxMjcyMQAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAG5pa2l0aWNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbmlraXRpY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjZGVmaW5lIF9QT1NJWF9DX1NPVVJDRSAyMDA4MDlMCiNkZWZpbmUgX0RFRkFVTFRfU09VUkNFCiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8cHVsc2UvcHVsc2VhdWRpby5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlICJwYXZjdGwuaCIKI2luY2x1ZGUgIm5vdGlmeS5oIgoKI2RlZmluZSBDS0ZBSUxDKExFViwgRk5BTUUsIFdITywgTVNHLCBDT05ELCBSRVRWQUwpIHsgXAogICAgaWYgKENPTkQpIHsgXAogICAgICAgIERCRyggTEVWLCBcCiAgICAgICAgICAgICAiJXM6ICVzOiAlcyAlc1xuIiwgXAogICAgICAgICAgICAgRk5BTUUsIFwKICAgICAgICAgICAgIFdITywgXAogICAgICAgICAgICAgImZhaWxlZCB0byIsIFwKICAgICAgICAgICAgIE1TRyBcCiAgICAgICAgICAgKTsgXAogICAgICAgIHJldHVybiBSRVRWQUw7IFwKICAgIH0gXAp9CgojZGVmaW5lIFBBX0ZVQ0tPRkYoY3R4LCBtbCkgeyBcCiAgICBwYV9jb250ZXh0X2Rpc2Nvbm5lY3QgKGN0eCk7IFwKICAgIHBhX2NvbnRleHRfdW5yZWYgKGN0eCk7IFwKICAgIHBhX21haW5sb29wX2ZyZWUgKG1sKTsgXAp9CgojZGVmaW5lIFBBX0NPTlRFWFRfRkFJTEVEX0VSUiAxCiNkZWZpbmUgUEFfQ09OVEVYVF9URVJNSU5BVEVEX0VSUiAyCiNkZWZpbmUgUEFfU0VUX1NJTktfVk9MVU1FX0VSUiAzCiNkZWZpbmUgUEFfU0VUX1NPVVJDRV9WT0xVTUVfRVJSIDQKI2RlZmluZSBQQV9PUEVSQVRJT05fQ0FOQ0VMTEVEX0VSUiA1Ci8vIG5leHQgdHdvIG1heSBiZSBkdWUgdG8gc29tZSBzaW5rIG5hbWluZyBmdWNrdXBzLCBzaG91bGRuJ3QKLy8gbm9ybWFsbHkgaGFwcGVuLCBubyBpZGVhIGhvdyB0byBkZWJ1ZyBpZiBub3QgbmFtaW5nIGZ1Y2t1cAojZGVmaW5lIFBBX0dFVF9TSU5LX1NUQVRFX0VSUiA2CiNkZWZpbmUgUEFfR0VUX1NPVVJDRV9TVEFURV9FUlIgNwojZGVmaW5lIENPTlZFUlNJT05fVE9fVk9MVU1FX0ZBSUxFRF9FUlIgOAojZGVmaW5lIFZPTFVNRV9PVVRfT0ZfQk9VTkRBUklFU19FUlIgOQojZGVmaW5lIE9QVElPTl9OT19BUkdfRVJSIDEwCiNkZWZpbmUgUEFfR0VUX1NJTktfTkFNRV9FUlIgMTEKI2RlZmluZSBQQV9HRVRfU09VUkNFX05BTUVfRVJSIDEyCiNkZWZpbmUgUEFfU0VUX1NJTktfTVVURV9FUlIgMTMKI2RlZmluZSBQQV9TRVRfU09VUkNFX01VVEVfRVJSIDEzCiNkZWZpbmUgTk9fSE9NRV9FUlIgMTQKI2RlZmluZSBTWVNDQUxMX0VSUiAxNQojZGVmaW5lIEFMUkVBRFlfUlVOTklOR19FUlIgMTYKI2RlZmluZSBVTktOT1dOX0VSUiAxMjcKCiNkZWZpbmUgTUlOVk9MVU1FIDAKI2RlZmluZSBNQVhWT0xVTUUgMTUwCgplbnVtIHsKICAgIEhFTFAgPSAwLAogICAgU0VULAogICAgR0VULAogICAgSU5DLAogICAgREVDLAogICAgTUlDLAogICAgU0lOSywKICAgIE1VVEUsCiAgICBOT05PVElGWSwKICAgIFlFU05PVElGWQp9OwoKZW51bSB7CiAgICBHRVRfU0VSVl9JTkZPLAogICAgR0VUX1NJTktfU1QsCiAgICBHRVRfU09VUkNFX1NULAogICAgU0VUX1NJTktfVk9MLAogICAgU0VUX1NJTktfTVVURSwKICAgIFNFVF9TT1VSQ0VfVk9MLAogICAgU0VUX1NPVVJDRV9NVVRFCn07CgpzdHJ1Y3Qgdm9sdW1lX211dGUgewogICAgcGFfY3ZvbHVtZSAqdm9sOwogICAgaW50IG11dGU7Cn07CgppbnQgcGFfcmVhZHkgPSAwOwoKdm9pZApwYV9nZXRfZGVmYXVsdF9zZXJ2ZXJfaW5mb19jYgooCiBwYV9jb250ZXh0ICpjLAogY29uc3QgcGFfc2VydmVyX2luZm8gKmksCiB2b2lkICpkYXRhCikKewogICAgY2hhciAqKnVzZXJkYXRhOwogICAgdXNlcmRhdGEgPSBkYXRhOwogICAgdXNlcmRhdGFbMF0gPSBzdHJkdXAgKGktPmRlZmF1bHRfc2lua19uYW1lKTsKICAgIHVzZXJkYXRhWzFdID0gc3RyZHVwIChpLT5kZWZhdWx0X3NvdXJjZV9uYW1lKTsKICAgIHJldHVybjsKfQoKdm9pZApwYV9nZXRfc2lua19jdm9sdW1lX2NiCigKIHBhX2NvbnRleHQgKmMsCiBjb25zdCBwYV9zaW5rX2luZm8gKmksCiBpbnQgZW9sLAogdm9pZCAqZGF0YQopCnsKICAgIGlmIChlb2wpCiAgICAgICAgcmV0dXJuOwoKICAgIHN0cnVjdCB2b2x1bWVfbXV0ZSAqdm07CiAgICB2bSA9IGRhdGE7CiAgICAqKHZtLT52b2wpID0gaS0+dm9sdW1lOwogICAgdm0tPm11dGUgPSBpLT5tdXRlOwogICAgcmV0dXJuOwp9Cgp2b2lkCnBhX2dldF9zb3VyY2VfY3ZvbHVtZV9jYgooCiBwYV9jb250ZXh0ICpjLAogY29uc3QgcGFfc291cmNlX2luZm8gKmksCiBpbnQgZW9sLAogdm9pZCAqZGF0YQopCnsKICAgIGlmIChlb2wpCiAgICAgICAgcmV0dXJuOwoKICAgIHN0cnVjdCB2b2x1bWVfbXV0ZSAqdm07CiAgICB2bSA9IGRhdGE7CiAgICAqKHZtLT52b2wpID0gaS0+dm9sdW1lOwogICAgdm0tPm11dGUgPSBpLT5tdXRlOwogICAgcmV0dXJuOwp9Cgp2b2lkCnBhX3N1Y2Nlc3NfY2IKKAogcGFfY29udGV4dCAqYywKIGludCBzdWNjZXNzLAogdm9pZCAqZGF0YQopCnsKICAgIGludCAqaSA9IGRhdGE7CiAgICAqaSA9IHN1Y2Nlc3M7Cn0KCnZvaWQKcGFfaGFuZGxlX3N0YXRlX2NiCigKIHBhX2NvbnRleHQgKmMsCiB2b2lkICpkYXRhCikKewogICAgcGFfbWFpbmxvb3AgKnBhX21sOwogICAgcGFfbWwgPSBkYXRhOwoKICAgIERCRygyLCAicGFfaGFuZGxlX3N0YXRlOiBlbnRlcmVkIGZ1bmN0aW9uIGJvZHkuXG4iKTsKICAgIHN3aXRjaCAocGFfY29udGV4dF9nZXRfc3RhdGUoYykpIHsKICAgICAgICBjYXNlIFBBX0NPTlRFWFRfUkVBRFk6CiAgICAgICAgICAgIERCRyggMiwKICAgICAgICAgICAgICAgICAiJXM6ICVzXG4iLAogICAgICAgICAgICAgICAgICJwYV9oYW5kbGVfc3RhdGUiLAogICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIHJlYWR5LiIKICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgcGFfcmVhZHkgPSAxOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgY2FzZSBQQV9DT05URVhUX0ZBSUxFRDoKICAgICAgICAgICAgREJHKCAyLAogICAgICAgICAgICAgICAgICIlczogJXNcbiIsCiAgICAgICAgICAgICAgICAgInBhX2hhbmRsZV9zdGF0ZSIsCiAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb25uZWN0IHRvIHB1bHNlYWRpbyBkYWVtb24uIgogICAgICAgICAgICAgICApOwogICAgICAgICAgICBQQV9GVUNLT0ZGKGMsIHBhX21sKTsKICAgICAgICAgICAgZXhpdChQQV9DT05URVhUX0ZBSUxFRF9FUlIpOwogICAgICAgIGNhc2UgUEFfQ09OVEVYVF9URVJNSU5BVEVEOgogICAgICAgICAgICBEQkcoIDIsCiAgICAgICAgICAgICAgICAgIiVzOiAlc1xuIiwKICAgICAgICAgICAgICAgICAicGFfaGFuZGxlX3N0YXRlIiwKICAgICAgICAgICAgICAgICAiUHVsc2VhZGlvIGNvbm5lY3Rpb24gdGVybWluYXRlZC4iCiAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIFBBX0ZVQ0tPRkYoYywgcGFfbWwpOwogICAgICAgICAgICBleGl0KFBBX0NPTlRFWFRfVEVSTUlOQVRFRF9FUlIpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIERCRyggMiwKICAgICAgICAgICAgICAgICAiJXM6ICVzXG4iLAogICAgICAgICAgICAgICAgICJwYV9oYW5kbGVfc3RhdGUiLAogICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIHN0YXRlIG5vdCBoYW5kbGVkIChpZ25vcmVkKS4iCiAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIHBhX3JlYWR5ID0gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICB9Cn0KCmludApwYV9wZXJmb3JtX2FjdGlvbgooCiBwYV9jb250ZXh0ICpjLAogcGFfbWFpbmxvb3AgKm1sLAogY2hhciAqKnNpc29uLAogc3RydWN0IHZvbHVtZV9tdXRlICp2bXMsIC8vIGl0J3MgYXJyYXkhISEKIGludCBhY3Rpb24sCiBpbnQgKnNldGVycgopCnsKICAgIGNoYXIgZm5hbWVbXSA9ICJwYV9wZXJmb3JtX2FjdGlvbiI7CiAgICBjaGFyIGZwYXRbXSA9ICIlczogJXNcbiI7CiAgICBpbnQgb3BlcmF0aW9uID0gMDsKICAgIHBhX29wZXJhdGlvbiAqcGFfb3A7CiAgICBwYV9vcGVyYXRpb25fc3RhdGVfdCBwYV9zdGF0ZTsKCiAgICBEQkcoIDIsCiAgICAgICAgIGZwYXQsCiAgICAgICAgIGZuYW1lLAogICAgICAgICAiRW50ZXJpbmcgbG9vcC4iCiAgICAgICApOwogICAgd2hpbGUgKDEpIHsKICAgICAgICBEQkcoIDIsCiAgICAgICAgICAgICBmcGF0LAogICAgICAgICAgICAgZm5hbWUsCiAgICAgICAgICAgICAiQ2hlY2tpbmcgaWYgcHVsc2VhZGlvIGlzIHJlYWR5LiIKICAgICAgICAgICApOwogICAgICAgIGlmICghcGFfcmVhZHkpIHsKICAgICAgICAgICAgREJHKCAyLAogICAgICAgICAgICAgICAgIGZwYXQsCiAgICAgICAgICAgICAgICAgZm5hbWUsCiAgICAgICAgICAgICAgICAgIk5vdCByZWFkeS4gSXRlcmF0aW5nIG1haW5sb29wLiIKICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgcGFfbWFpbmxvb3BfaXRlcmF0ZSAobWwsIDEsIE5VTEwpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIERCRyggMiwKICAgICAgICAgICAgIGZwYXQsCiAgICAgICAgICAgICBmbmFtZSwKICAgICAgICAgICAgICJQdWxzZWFkaW8gcmVhZHkuIgogICAgICAgICAgICk7CiAgICAgICAgY2hhciBmcGF0MltdID0gIiVzOiAlczogJXNcbiI7CiAgICAgICAgY2hhciBhY3Rpb25zdHJbMjU2XTsKICAgICAgICBpZiAoIW9wZXJhdGlvbikgewogICAgICAgICAgICBtZW1zZXQgKGFjdGlvbnN0ciwgMCwgc2l6ZW9mIChjaGFyKSAqIDI1Nik7CiAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICAgICAgICAgICAgICBjYXNlIEdFVF9TRVJWX0lORk86CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5IChhY3Rpb25zdHIsICJHRVRfU0VSVl9JTkZPIik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEdFVF9TSU5LX1NUOgogICAgICAgICAgICAgICAgICAgIHN0cmNweSAoYWN0aW9uc3RyLCAiR0VUX1NJTktfU1QiKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgR0VUX1NPVVJDRV9TVDoKICAgICAgICAgICAgICAgICAgICBzdHJjcHkgKGFjdGlvbnN0ciwgIkdFVF9TT1VSQ0VfU1QiKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgU0VUX1NJTktfVk9MOgogICAgICAgICAgICAgICAgICAgIHN0cmNweSAoYWN0aW9uc3RyLCAiU0VUX1NJTktfVk9MIik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFNFVF9TSU5LX01VVEU6CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5IChhY3Rpb25zdHIsICJTRVRfU0lOS19WT0wiKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgU0VUX1NPVVJDRV9WT0w6CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5IChhY3Rpb25zdHIsICJTRVRfU09VUkNFX1ZPTCIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBTRVRfU09VUkNFX01VVEU6CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5IChhY3Rpb25zdHIsICJTRVRfU09VUkNFX01VVEUiKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3dpdGNoIChvcGVyYXRpb24pIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgREJHKCAyLAogICAgICAgICAgICAgICAgICAgICBmcGF0MiwKICAgICAgICAgICAgICAgICAgICAgZm5hbWUsCiAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnN0ciwKICAgICAgICAgICAgICAgICAgICAgInNlbmRpbmcgcmVxdWVzdCIKICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgICAgICAgICAgICAgICAgIGNhc2UgR0VUX1NFUlZfSU5GTzoKICAgICAgICAgICAgICAgICAgICAgICAgcGFfb3AgPSBwYV9jb250ZXh0X2dldF9zZXJ2ZXJfaW5mbyAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYV9nZXRfZGVmYXVsdF9zZXJ2ZXJfaW5mb19jYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXNvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAg
ICAgICAgIGNhc2UgR0VUX1NJTktfU1Q6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhX29wID0gcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X25hbWUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lzb25bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFfZ2V0X3NpbmtfY3ZvbHVtZV9jYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm1zWzBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBHRVRfU09VUkNFX1NUOgogICAgICAgICAgICAgICAgICAgICAgICBwYV9vcCA9IHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9pbmZvX2J5X25hbWUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lzb25bMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFfZ2V0X3NvdXJjZV9jdm9sdW1lX2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2bXNbMV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIFNFVF9TSU5LX1ZPTDoKICAgICAgICAgICAgICAgICAgICAgICAgcGFfb3AgPSBwYV9jb250ZXh0X3NldF9zaW5rX3ZvbHVtZV9ieV9uYW1lICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpc29uWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtc1swXS52b2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFfc3VjY2Vzc19jYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRlcnIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIFNFVF9TSU5LX01VVEU6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhX29wID0gcGFfY29udGV4dF9zZXRfc2lua19tdXRlX2J5X25hbWUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lzb25bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm1zWzBdLm11dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFfc3VjY2Vzc19jYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRlcnIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIFNFVF9TT1VSQ0VfVk9MOgogICAgICAgICAgICAgICAgICAgICAgICBwYV9vcCA9IHBhX2NvbnRleHRfc2V0X3NvdXJjZV92b2x1bWVfYnlfbmFtZSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXNvblsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bXNbMV0udm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhX3N1Y2Nlc3NfY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0ZXJyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBTRVRfU09VUkNFX01VVEU6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhX29wID0gcGFfY29udGV4dF9zZXRfc291cmNlX211dGVfYnlfbmFtZSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXNvblsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bXNbMV0ubXV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYV9zdWNjZXNzX2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGVycgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3BlcmF0aW9uKys7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgREJHKCAyLAogICAgICAgICAgICAgICAgICAgICBmcGF0MiwKICAgICAgICAgICAgICAgICAgICAgZm5hbWUsCiAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnN0ciwKICAgICAgICAgICAgICAgICAgICAgImhhbmRsaW5nIHJlcXVlc3QgcmVzdWx0IgogICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHBhX3N0YXRlID0gcGFfb3BlcmF0aW9uX2dldF9zdGF0ZSAocGFfb3ApOwogICAgICAgICAgICAgICAgc3dpdGNoIChwYV9zdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgUEFfT1BFUkFUSU9OX0RPTkU6CiAgICAgICAgICAgICAgICAgICAgICAgIERCRyggMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcGF0MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVlc3QgY29tcGxldGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBQQV9PUEVSQVRJT05fUlVOTklORzoKICAgICAgICAgICAgICAgICAgICAgICAgREJHKCAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwYXQyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgUEFfT1BFUkFUSU9OX0NBTkNFTExFRDoKICAgICAgICAgICAgICAgICAgICAgICAgREJHKCAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwYXQyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWVzdCBjYW5jZWxsZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhX29wZXJhdGlvbl91bnJlZiAocGFfb3ApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUEFfT1BFUkFUSU9OX0NBTkNFTExFRF9FUlI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcGFfbWFpbmxvb3BfaXRlcmF0ZSAobWwsIDEsIE5VTEwpOwogICAgfQpsb29wZXhpdDoKICAgIHBhX29wZXJhdGlvbl91bnJlZiAocGFfb3ApOwogICAgcmV0dXJuIDA7Cn0KCmludAp2YWxwZXJjZW50CigKIGludCB2b2wKKQp7CiAgICBpZiAoTUlOVk9MVU1FID4gdm9sIHx8IHZvbCA+IE1BWFZPTFVNRSkKICAgICAgICByZXR1cm4gVk9MVU1FX09VVF9PRl9CT1VOREFSSUVTX0VSUjsKICAgIHJldHVybiAwOwp9CgppbnQKc3RyMnBlcmNlbnQKKAogY29uc3QgY2hhciAqc3RyLAogaW50ICpwZXJjZW50CikKewogICAgY2hhciAqZW5kcHRyWzFdOwogICAgZG91YmxlIHRtcDsKCiAgICB0bXAgPSBzdHJ0b2QgKHN0ciwgZW5kcHRyKTsKICAgIGlmICgqKmVuZHB0ciAhPSAnXDAnKQogICAgICAgIHJldHVybiBDT05WRVJTSU9OX1RPX1ZPTFVNRV9GQUlMRURfRVJSOwoKICAgICpwZXJjZW50ID0gKGludCkgcm91bmQgKHRtcCk7CiAgICByZXR1cm4gMDsKfQoKaW50CmlkZW50aWZ5X29wdAooCiBjb25zdCBjaGFyICpvcHQKKQp7CiAgICBpZiAoc3RybGVuIChvcHQpIDwgMikgcmV0dXJuIC0xOwogICAgaWYgKCFzdHJuY21wICgiLWgiLCBvcHQsIDMpKSByZXR1cm4gSEVMUDsKICAgIGlmICghc3RybmNtcCAoIi1zIiwgb3B0LCAzKSkgcmV0dXJuIFNFVDsKICAgIGlmICghc3RybmNtcCAoIi1nIiwgb3B0LCAzKSkgcmV0dXJuIEdFVDsKICAgIGlmICghc3RybmNtcCAoIi1pIiwgb3B0LCAzKSkgcmV0dXJuIElOQzsKICAgIGlmICghc3RybmNtcCAoIi1kIiwgb3B0LCAzKSkgcmV0dXJuIERFQzsKICAgIGlmICghc3RybmNtcCAoIi1ubiIsIG9wdCwgNCkpIHJldHVybiBOT05PVElGWTsKICAgIGlmICghc3RybmNtcCAoIi1ueSIsIG9wdCwgNCkpIHJldHVybiBZRVNOT1RJRlk7CiAgICBpZiAoIXN0cm5jbXAgKCItbWljIiwgb3B0LCA1KSkgcmV0dXJuIE1JQzsKICAgIGlmICghc3RybmNtcCAoIi1zaW5rIiwgb3B0LCA2KSkgcmV0dXJuIFNJTks7CiAgICBpZiAoIXN0cm5jbXAgKCItbXV0ZSIsIG9wdCwgNikpIHJldHVybiBNVVRFOwogICAgcmV0dXJuIC0xOwp9CgpjaGFyIGhlbHBfbXNnW10gPSAiVXNhZ2U6IHBhdmN0bCA8b3B0aW9ucz5cblwKT3B0aW9uczpcblwKICAtaDogaGVscC5cblwKICAtczogc2V0IHZvbHVtZS5cblwKICAtZzogZ2V0IHZvbHVtZS5cblwKICAtaTogaW5jcmVhc2Ugdm9sdW1lLlxuXAogIC1kOiBkZWNyZWFzZSB2b2x1bWUuXG5cCiAgLW1pYzogd29yayB3aXRoIG1pY3JvcGhvbmUgaW5zdGVhZCBvZiBzcGVha2Vycy5cblwKICAtc2luazogZ28gYmFjayB0byBzcGVha2Vycy5cblwKICAtbXV0ZTogbXV0ZS5cblwKICAtbm46IG5vIG5vdGlmaWNhdGlvbnMuXG5cCiAgLW55OiB5ZXMgbm90aWZpY2F0aW9uLlxuXApFeGFtcGxlIDE6IHBhdmN0bCAtcyA1MCAtbWljIC1zIDgwIC1zaW5rIC1nXG5cCkV4YW1wbGUgMjogcGF2Y3RsIC1ubiAtcyA0MCAtbnkgLXMgMzAiOwoKCnZvaWQKcHJpbnRfaGVscCAoKQp7CiAgICBwdXRzIChoZWxwX21zZyk7Cn0KCmludAptYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIGlmIChhcmdjID09IDEgfHwgc3RyY21wKGFyZ3ZbMV0sICItaCIpID09IDApIHsKICAgICAgICBwcmludF9oZWxwICgpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgCiAgICBjaGFyIGZuYW1lW10gPSAibWFpbiI7CiAgICBpbnQgcmVzOwoKICAgIGNoYXIgKmhvbWU7CiAgICBob21lID0gZ2V0ZW52ICgiSE9NRSIpOwogICAgaWYgKCFob21lKSB7CiAgICAgICAgREJHKDEsICIlczogJXNcbiIsIGZuYW1lLCAiSE9NRSB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCIpOwogICAgICAgIHJldHVybiBOT19IT01FX0VSUjsKICAgIH0KICAgIGNoYXIgc3VwW10gPSAiLy5jYWNoZS9wYXZjdGwubG9jayI7CgogICAgaW50IGhvbWVsZW4sIHN1cGxlbjsKICAgIGhvbWVsZW4gPSBzdHJsZW4gKGhvbWUpOwogICAgc3VwbGVuID0gc3RybGVuIChzdXApOwoKICAgIGNoYXIgbG9ja2ZpbGVbaG9tZWxlbiArIHN1cGxlbiArIDFdOwogICAgc3ByaW50ZiAobG9ja2ZpbGUsIGhvbWUpOwogICAgc3ByaW50ZiAobG9ja2ZpbGUgKyBob21lbGVuLCBzdXApOwoKICAgIHJlcyA9IGFjY2VzcyAobG9ja2ZpbGUsIEZfT0spOwogICAgaWYgKHJlcyA9PSAwKSB7CiAgICAgICAgaWYgKGNobW9kIChsb2NrZmlsZSwgIFNfSVJVU1IgfCBTX0lXVVNSKSA9PSAtMSkgewogICAgICAgICAgICBEQkcoMSwgIiVzOiAlczogJXM6ICVzXG4iLCBmbmFtZSwgImNobW9kIiwgbG9ja2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CiAgICAgICAgICAgIHJldHVybiBTWVNDQUxMX0VSUjsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKHJlcyA9PSAtMSkgewogICAgICAgIERCRygxLCAiJXM6ICVzOiAlczogJXNcbiIsIGZuYW1lLCAiYWNjZXNzIiwgbG9ja2ZpbGUsCiAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKICAgICAgICByZXR1cm4gU1lTQ0FMTF9FUlI7CiAgICB9CgogICAgaW50IGZkOwogICAgZmQgPSBvcGVuIChsb2NrZmlsZSwgT19SRFdSIHwgT19UUlVOQyB8IE9fQ1JFQVQpOwogICAgaWYgKGZkIDwgMCkgewogICAgICAgIERCRygxLCAiJXM6ICVzOiAlczogJXNcbiIsIGZuYW1lLCAib3BlbiIsIGxvY2tmaWxlLCBzdHJlcnJvciAoZXJybm8pKTsKICAgICAgICByZXR1cm4gU1lTQ0FMTF9FUlI7CiAgICB9CgogICAgaWYgKGxvY2tmIChmZCwgRl9UTE9DSywgMCkpIHsKICAgICAgICBEQkcoMiwgIkFscmVhZHkgcnVubmluZy5cbiIpOwogICAgICAgIHJldHVybiBBTFJFQURZX1JVTk5JTkdfRVJSOwogICAgfQogICAgZWxzZQogICAgICAgIGxvY2tmIChmZCwgRl9MT0NLLCAwKTsKCiAgICBwYV9tYWlubG9vcCAqcGFfbWw7CiAgICBwYV9tYWlubG9vcF9hcGkgKnBhX2FwaTsKICAgIHBhX2NvbnRleHQgKnBhX2N0eDsKCiAgICBwYV9tbCA9IHBhX21haW5sb29wX25ldyAoKTsKICAgIHBhX2FwaSA9IHBhX21haW5sb29wX2dldF9hcGkgKHBhX21sKTsKICAgIHBhX2N0eCA9IHBhX2NvbnRleHRfbmV3IChwYV9hcGksICJ2b2x1bWVjdGwiKTsKCiAgICBwYV9jb250ZXh0X3NldF9zdGF0ZV9jYWxsYmFjayAocGFfY3R4LCBwYV9oYW5kbGVfc3RhdGVfY2IsIHBhX21sKTsKICAgIHBhX2NvbnRleHRfY29ubmVjdCAocGFfY3R4LCBOVUxMLCAwLCBOVUxMKTsKCiAgICBjaGFyICpzaXNvblsyXTsKICAgIHNpc29uWzBdID0gTlVMTDsKICAgIHNpc29uWzFdID0gTlVMTDsKICAgIGNoYXIgZmFpbHNlZVtdID0gImNvbXBsZXRlIHJlcXVlc3QsIHNlZSBleGl0IHN0YXR1cyI7CiAgICBzdHJ1Y3Qgdm9sdW1lX211dGUgdm1zWzJdOwogICAgcGFfY3ZvbHVtZSB2c1syXTsKICAgIHZtc1swXS52b2wgPSAmdnNbMF07CiAgICB2bXNbMV0udm9sID0gJnZzWzFdOwoKICAgIHJlcyA9IHBhX3BlcmZvcm1fYWN0aW9uICgKICAgICAgICAgICAgcGFfY3R4LAogICAgICAgICAgICBwYV9tbCwKICAgICAgICAgICAgc2lzb24sCiAgICAgICAgICAgIHZtcywKICAgICAgICAgICAgR0VUX1NFUlZfSU5GTywKICAgICAgICAgICAgTlVMTAogICAgICAgICAgICApOwogICAgQ0tGQUlMQygyLCBmbmFtZSwgIkdFVF9TRVJWX0lORk8iLCBmYWlsc2VlLCByZXMsIHJlcyk7CiAgICBDS0ZBSUxDKDIsIGZuYW1lLCAiR0VUX1NFUlZfSU5GTyIsICJnZXQgc2luayBuYW1lIiwgKCFzaXNvblswXSksCiAgICAgICAgICAgIFBBX0dFVF9TSU5LX05BTUVfRVJSKTsKICAgIENLRkFJTEMoMiwgZm5hbWUsICJHRVRfU0VSVl9JTkZPIiwgImdldCBzb3VyY2UgbmFtZSIsICghc2lzb25bMV0pLAogICAgICAgICAgICBQQV9HRVRfU09VUkNFX05BTUVfRVJSKTsKCiAgICByZXMgPSBwYV9wZXJmb3JtX2FjdGlvbiAoCiAgICAgICAgICAgIHBhX2N0eCwKICAgICAgICAgICAgcGFfbWwsCiAgICAgICAgICAgIHNpc29uLAogICAgICAgICAgICB2bXMsCiAgICAgICAgICAgIEdFVF9TSU5LX1NULAogICAgICAgICAgICBOVUxMCiAgICAgICAgICAgICk7CiAgICBDS0ZBSUxDKDIsIGZuYW1lLCAiU0VUX1NJTktfU1QiLCBmYWlsc2VlLCByZXMsIHJlcyk7CiAgICBDS0ZBSUxDKDIsIGZuYW1lLCAiU0VUX1NJTktfU1QiLCAiZ2V0IHNpbmsgc3RhdGUiLAogICAgICAgICAgICAodm1zWzBdLnZvbC0+Y2hhbm5lbHMgPT0gMCksCiAgICAgICAgICAgIFBBX0dFVF9TSU5LX1NUQVRFX0VSUik7CgogICAgcmVzID0gcGFfcGVyZm9ybV9hY3Rpb24gKAogICAgICAgICAgICBwYV9jdHgsCiAgICAgICAgICAgIHBhX21sLAogICAgICAgICAgICBzaXNvbiwKICAgICAgICAgICAgdm1zLAogICAgICAgICAgICBHRVRfU09VUkNFX1NULAogICAgICAgICAgICBOVUxMCiAgICAgICAgICAgICk7CiAgICBDS0ZBSUxDKDIsIGZuYW1lLCAiU0VUX1NPVVJDRV9TVCIsIGZhaWxzZWUsIHJlcywgcmVzKTsKICAgIENLRkFJTEMoMiwgZm5hbWUsICJTRVRfU09VUkNFX1NUIiwgImdldCBzb3VyY2Ugc3RhdGUiLAogICAgICAgICAgICAodm1zWzFdLnZvbC0+Y2hhbm5lbHMgPT0gMCksCiAgICAgICAgICAgIFBBX0dFVF9TT1VSQ0VfU1RBVEVfRVJSKTsKCiAgICBkb3VibGUgZHZvbDsKICAgIGludCBvID0gSEVMUDsKICAgIGludCB2b2wgPSAwOwogICAgaW50IHBlciA9IDA7CiAgICBpbnQgdGFyZ2V0ID0gMDsKICAgIGludCBzZXRlcnIgPSAwOwogICAgd2hpbGUgKGFyZ2MtLSA+IDEpIHsKICAgICAgICBvID0gaWRlbnRpZnlfb3B0IChhcmd2WzFdKTsKCiAgICAgICAgc3dpdGNoIChvKSB7CiAgICAgICAgICAgIGNhc2UgSEVMUDoKICAgICAgICAgICAgICAgIHByaW50X2hlbHAgKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgY2FzZSBTRVQ6CiAgICAgICAgICAgICAgICBpZiAoYXJnYyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgREJHKCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWlyZXMgYW4gYXJndW1lbnQuIgogICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QVElPTl9OT19BUkdfRVJSOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVzID0gc3RyMnBlcmNlbnQgKGFyZ3ZbMl0sICZwZXIpOwogICAgICAgICAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgICAgICAgICAgIERCRyggMSwKICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJXM6ICVzICVzOiBDb252ZXJzaW9uIGZhaWxlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lLCAiU0VUIiwgYXJndlsxXSwgYXJndlsyXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcyA9IHZhbHBlcmNlbnQgKHBlcik7CiAgICAgICAgICAgICAgICBpZiAocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgREJHKCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlczogJXMgJXM6IFZvbHVtZSBub3QgaW4gcmFuZ2VcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZSwgIlNFVCIsIGFyZ3ZbMV0sIGFyZ3ZbMl0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZHZvbCA9IHBlcjsKICAgICAgICAgICAgICAgIGR2b2wgKj0gUEFfVk9MVU1FX05PUk07CiAgICAgICAgICAgICAgICBkdm9sIC89IDEwMDsKICAgICAgICAgICAgICAgIGR2b2wgPSByb3VuZChkdm9sKTsKICAgICAgICAgICAgICAgIHZvbCA9IChpbnQpIGR2b2w7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vIGdvdG9zLCBzd2VldAogICAgICAgICAgICAgICAgLy8gaGVoZQpzZXRfdm9sdW1lOgogICAgICAgICAgICAgICAgc3dpdGNoICh0YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhX2N2b2x1bWVfc2V0ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bXNbMF0udm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtc1swXS52b2wtPmNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHBhX3BlcmZvcm1fYWN0aW9uICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYV9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFfbWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9TSU5LX1ZPTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0ZXJyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgQ0tGQUlMQygyLCBmbmFtZSwgIlNFVF9TSU5LX1ZPTCIsICJzZXQgc2luayB2b2x1bWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgcmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgQ0tGQUlMQygyLCBmbmFtZSwgIlNFVF9TSU5LX1ZPTCIsICJzZXQgc2luayB2b2x1bWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRlcnIgPT0gMCksIFBBX1NFVF9TSU5LX1ZPTFVNRV9FUlIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhX2N2b2x1bWVfc2V0ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bXNbMV0udm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtc1sxXS52b2wtPmNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHBhX3BlcmZvcm1fYWN0aW9uICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYV9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFfbWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9TT1VSQ0VfVk9MLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRlcnIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBDS0ZBSUxDKDIsIGZuYW1lLCAiU0VUX1NPVVJDRV9WT0wiLCAic2V0IHNvdXJjZSB2b2x1bWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgcmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgQ0tGQUlMQygyLCBmbmFtZSwgIlNFVF9TT1VSQ0VfVk9MIiwgInNldCBzb3VyY2Ugdm9sdW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0ZXJyID09IDApLCBQQV9TRVRfU09VUkNFX1ZPTFVNRV9FUlIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAg
IG5vdGlmeV92b2x1bWUgKHRhcmdldCwgcGVyKTsKICAgICAgICAgICAgICAgIGFyZ2MtLTsKICAgICAgICAgICAgICAgIGFyZ3YgKz0gMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEdFVDoKICAgICAgICAgICAgICAgIHN3aXRjaCAodGFyZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICBkdm9sID0gdm1zWzBdLnZvbC0+dmFsdWVzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBkdm9sICo9IDEwMDsKICAgICAgICAgICAgICAgICAgICAgICAgZHZvbCAvPSBQQV9WT0xVTUVfTk9STTsKICAgICAgICAgICAgICAgICAgICAgICAgZHZvbCA9IHJvdW5kIChkdm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiU2luayAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICBkdm9sID0gdm1zWzFdLnZvbC0+dmFsdWVzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBkdm9sICo9IDEwMDsKICAgICAgICAgICAgICAgICAgICAgICAgZHZvbCAvPSBQQV9WT0xVTUVfTk9STTsKICAgICAgICAgICAgICAgICAgICAgICAgZHZvbCA9IHJvdW5kIChkdm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiU291cmNlICIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZvbCA9IGR2b2w7CiAgICAgICAgICAgICAgICBwcmludGYgKCJ2b2x1bWU6ICVkJSUuXG4iLCB2b2wpOwogICAgICAgICAgICAgICAgYXJndisrOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgSU5DOgogICAgICAgICAgICAgICAgaWYgKGFyZ2MgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIERCRyggMSwKICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVpcmVzIGFuIGFyZ3VtZW50LiIKICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBPUFRJT05fTk9fQVJHX0VSUjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcyA9IHN0cjJwZXJjZW50IChhcmd2WzJdLCAmcGVyKTsKICAgICAgICAgICAgICAgIGlmIChyZXMpIHsKICAgICAgICAgICAgICAgICAgICBEQkcoIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzOiAlcyAlczogQ29udmVyc2lvbiBmYWlsZWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZSwgIklOQyIsIGFyZ3ZbMV0sIGFyZ3ZbMl0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkdm9sID0gcGVyOwogICAgICAgICAgICAgICAgZHZvbCA9IGR2b2wgKiBQQV9WT0xVTUVfTk9STSAvIDEwMDsKCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRhcmdldCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgZHZvbCArPSB2bXNbMF0udm9sLT52YWx1ZXNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgZHZvbCArPSB2bXNbMV0udm9sLT52YWx1ZXNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGR2b2wgPSByb3VuZCAoZHZvbCk7CiAgICAgICAgICAgICAgICB2b2wgPSAoaW50KSBkdm9sOwogICAgICAgICAgICAgICAgcGVyID0gKGludCkgcm91bmQgKGR2b2wgKiAxMDAgLyBQQV9WT0xVTUVfTk9STSk7CiAgICAgICAgICAgICAgICByZXMgPSB2YWxwZXJjZW50IChwZXIpOwogICAgICAgICAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgICAgICAgICAgIERCRyggMSwKICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJXM6ICVzICVzOiBDYW5ub3QgaW5jcmVhc2UgdGhpcyBtdWNoXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgZm5hbWUsICJJTkMiLCBhcmd2WzFdLCBhcmd2WzJdKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ290byBzZXRfdm9sdW1lOwogICAgICAgICAgICBjYXNlIERFQzoKICAgICAgICAgICAgICAgIGlmIChhcmdjID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBEQkcoIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgYXJndlsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICJSZXF1aXJlcyBhbiBhcmd1bWVudC4iCiAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BUSU9OX05PX0FSR19FUlI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXMgPSBzdHIycGVyY2VudCAoYXJndlsyXSwgJnBlcik7CiAgICAgICAgICAgICAgICBpZiAocmVzKSB7CiAgICAgICAgICAgICAgICAgICAgREJHKCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlczogJXMgJXM6IENvbnZlcnNpb24gZmFpbGVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgZm5hbWUsICJJTkMiLCBhcmd2WzFdLCBhcmd2WzJdKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZHZvbCA9IHBlcjsKICAgICAgICAgICAgICAgIGR2b2wgPSBkdm9sICogUEFfVk9MVU1FX05PUk0gLyAxMDA7CiAgICAgICAgICAgICAgICBkdm9sID0gcm91bmQgKGR2b2wpOwogICAgICAgICAgICAgICAgdm9sID0gKGludCkgZHZvbDsKCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRhcmdldCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgdm9sID0gdm1zWzBdLnZvbC0+dmFsdWVzWzBdIC0gdm9sOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIHZvbCA9IHZtc1sxXS52b2wtPnZhbHVlc1swXSAtIHZvbDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZHZvbCA9IHZvbDsKICAgICAgICAgICAgICAgIHBlciA9IChpbnQpIHJvdW5kIChkdm9sICogMTAwIC8gUEFfVk9MVU1FX05PUk0pOwogICAgICAgICAgICAgICAgcmVzID0gdmFscGVyY2VudCAocGVyKTsKICAgICAgICAgICAgICAgIGlmIChyZXMpIHsKICAgICAgICAgICAgICAgICAgICBEQkcoIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzOiAlcyAlczogQ2Fubm90IGRlY3JlYXNlIHRoaXMgbXVjaFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lLCAiREVDIiwgYXJndlsxXSwgYXJndlsyXQogICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdvdG8gc2V0X3ZvbHVtZTsKICAgICAgICAgICAgY2FzZSBNSUM6CiAgICAgICAgICAgICAgICB0YXJnZXQgPSAxOwogICAgICAgICAgICAgICAgYXJndisrOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgU0lOSzoKICAgICAgICAgICAgICAgIHRhcmdldCA9IDA7CiAgICAgICAgICAgICAgICBhcmd2Kys7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBNVVRFOgogICAgICAgICAgICAgICAgc3dpdGNoICh0YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHZtc1swXS5tdXRlID0gIXZtc1swXS5tdXRlOwogICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBwYV9wZXJmb3JtX2FjdGlvbiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFfY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhX21sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfU0lOS19NVVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRlcnIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBDS0ZBSUxDKDIsIGZuYW1lLCAiU0VUX1NJTktfTVVURSIsICJtdXRlIHNpbmsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgcmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgQ0tGQUlMQygyLCBmbmFtZSwgIlNFVF9TSU5LX01VVEUiLCAibXV0ZSBzaW5rIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0ZXJyID09IDApLCBQQV9TRVRfU0lOS19NVVRFX0VSUik7CiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeV9tdXRlICh0YXJnZXQsIHZtc1swXS5tdXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICB2bXNbMV0ubXV0ZSA9ICF2bXNbMV0ubXV0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcGFfcGVyZm9ybV9hY3Rpb24gKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhX2N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYV9tbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX1NPVVJDRV9NVVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRlcnIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBDS0ZBSUxDKDIsIGZuYW1lLCAiU0VUX1NPVVJDRV9NVVRFIiwgIm11dGUgc291cmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMsIHJlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIENLRkFJTEMoMiwgZm5hbWUsICJTRVRfU09VUkNFX01VVEUiLCAibXV0ZSBzb3VyY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRlcnIgPT0gMCksIFBBX1NFVF9TT1VSQ0VfTVVURV9FUlIpOwogICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlfbXV0ZSAodGFyZ2V0LCB2bXNbMV0ubXV0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYXJndisrOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgTk9OT1RJRlk6CiAgICAgICAgICAgICAgICBOT19OT1RJRlkgPSAxOwogICAgICAgICAgICAgICAgYXJndisrOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgWUVTTk9USUZZOgogICAgICAgICAgICAgICAgTk9fTk9USUZZID0gMDsKICAgICAgICAgICAgICAgIGFyZ3YrKzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgREJHKCAxLCAKICAgICAgICAgICAgICAgICAgICAgIiVzOiAlczogJXMgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgIGZuYW1lLAogICAgICAgICAgICAgICAgICAgICBhcmd2WzFdLAogICAgICAgICAgICAgICAgICAgICAiSSBkb24ndCBrbm93IHdoYXQgeW91IG1lYW4sIGJ1dCB0aGlzIGlzIG5vdCBhIHZhbGlkIiwKICAgICAgICAgICAgICAgICAgICAgImlucHV0LlxuQ29uc2lkZXIgZG9pbmcgJ3BhdmN0bCAtaCcgdG8gZ2V0IGhlbHAuIgogICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUjsKICAgICAgICB9CiAgICB9CiAgICBQQV9GVUNLT0ZGKHBhX2N0eCwgcGFfbWwpOwogICAgbG9ja2YgKGZkLCBGX1VMT0NLLCAwKTsKICAgIHJldHVybiAwOwp9CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
base64, вы поняли. Это то, что должно было быть реализовано в pactl/pacmd. Никаких проверок на счет памяти не делал, работает и похуй. Что бы скомпилировать нужно pkg-config --cflags --libs libnotify, и еще флаги -lm -lpulse. Компилировай гондонским gcc, потому что лень clang устанавливать.
Теоретически, если весь notify.* выкинуть вообще, то будет еще быстрее работать, а то подргузка всех этой гейских гномотек на стартапе занимает больше времени, чем запуск ебучего sh.
> base64Сделай ку ююк.
> base64
Сделай ку ююк.
>>218420Там бы gzip сделать, оно бы и в одно сообщение влезло бы.
>>218422.tar.xz щаас посмотрим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
>>218422.tar.xz щаас посмотрим
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
>>218430да, влезло. правда там больше lzma, чем xz.
zip.png удобнее.Алсо, видел на форчане такой способ, ещё до того, как webm прикрутили.#!/bin/env bash# usage: script.sh <input> [<output>]if [ ! "$1" ]; then echo Specify an input.; exit; fiif [ ! -e "$1" ]; then echo \"$1\" doesn\'t exist.; exit; fiif [ "$2" ]; then output="${2%.*}.png"; else output="${1%.*}.png"; fiif [ -e "$output" ]; then echo Output exists, specify another name.; exit; fisize=$(echo "sqrt($(stat -c%s "$1")/8)+0.5/1" | bc)cat "$1" /dev/zero - | ffmpeg -f rawvideo -s ${size}:${size} -pix_fmt rgba64be -i - -vframes 1 "$output"echo Playback with\:echo ffmpeg -i \"$output\" -f rawvideo - \| mpv -Мудрёно!
zip.png удобнее.Алсо, видел на форчане такой способ, ещё до того, как webm прикрутили.
#!/bin/env bash# usage: script.sh <input> [<output>]if [ ! "$1" ]; then echo Specify an input.; exit; fiif [ ! -e "$1" ]; then echo \"$1\" doesn\'t exist.; exit; fiif [ "$2" ]; then output="${2%.*}.png"; else output="${1%.*}.png"; fiif [ -e "$output" ]; then echo Output exists, specify another name.; exit; fisize=$(echo "sqrt($(stat -c%s "$1")/8)+0.5/1" | bc)cat "$1" /dev/zero - | ffmpeg -f rawvideo -s ${size}:${size} -pix_fmt rgba64be -i - -vframes 1 "$output"echo Playback with\:echo ffmpeg -i \"$output\" -f rawvideo - \| mpv -
Мудрёно!
>>218436так а че оно делает-то?
Кажется, я нашёл свой идеальный промпт. PS1='\[\033[0;34m\]\W\[\033[m\]: '
Кажется, я нашёл свой идеальный промпт.
PS1='\[\033[0;34m\]\W\[\033[m\]: '
RSS для новеря, работает через cgi интерфейс вебсервера, вызывать как http://server/cgi-bin/script.cgi/b/res/217061.htmlна сервере нужен собственно сам вебсервер с поддержкой cgi и питон с Flask.#!/usr/bin/env python3from flask import Flask, request, redirect, make_responsefrom wsgiref.handlers import CGIHandlerimport osimport timeapp = Flask(__name__)if os.environ.get("PATH_INFO") is None: os.environ["PATH_INFO"] = ""def getpage(thread): import requests import bs4 page='' html = requests.get('http://nowere.net/' + thread).content html = bs4.BeautifulSoup(html, 'lxml') page = page + '<?xml version="1.0"?><rss version="2.0">\n <channel>\n <title>\n' page = page + thread + '\n' page = page + ' </title>\n' page = page + ' <link>http://nowere.net/' + thread + '</link>\n' page = page + 'http://nowere.net/' + thread + ';' posts = html.find_all('td', attrs={'class':'reply'}) for post in posts: postTitle = str(post.a['name']) postLink = 'http://nowere.net/' + thread + '#' + postTitle page = page + ' <item>\n' page = page + ' <title>' + postTitle + '</title>\n' page = page + ' <description>\n' page = page + ' <p><a href="' + postLink + '">' + postLink + '</a></p>\n' page = page + str(post) page = page + ' </description>\n' page = page + ' <guid isPermaLink="true">' + postLink + '</guid>\n' page = page + ' </item>\n' page = page + ' </channel>\n</rss>' return page@app.route('/<path:thread>', methods=['GET'])def mainpage(thread): page = getpage(thread) response = make_response(page, 200) response.mimetype = "application/rss+xml" return responseCGIHandler().run(app)
RSS для новеря, работает через cgi интерфейс вебсервера, вызывать как http://server/cgi-bin/script.cgi/b/res/217061.htmlна сервере нужен собственно сам вебсервер с поддержкой cgi и питон с Flask.
#!/usr/bin/env python3from flask import Flask, request, redirect, make_responsefrom wsgiref.handlers import CGIHandlerimport osimport timeapp = Flask(__name__)if os.environ.get("PATH_INFO") is None: os.environ["PATH_INFO"] = ""def getpage(thread): import requests import bs4 page='' html = requests.get('http://nowere.net/' + thread).content html = bs4.BeautifulSoup(html, 'lxml') page = page + '<?xml version="1.0"?><rss version="2.0">\n <channel>\n <title>\n' page = page + thread + '\n' page = page + ' </title>\n' page = page + ' <link>http://nowere.net/' + thread + '</link>\n' page = page + 'http://nowere.net/' + thread + ';' posts = html.find_all('td', attrs={'class':'reply'}) for post in posts: postTitle = str(post.a['name']) postLink = 'http://nowere.net/' + thread + '#' + postTitle page = page + ' <item>\n' page = page + ' <title>' + postTitle + '</title>\n' page = page + ' <description>\n' page = page + ' <p><a href="' + postLink + '">' + postLink + '</a></p>\n' page = page + str(post) page = page + ' </description>\n' page = page + ' <guid isPermaLink="true">' + postLink + '</guid>\n' page = page + ' </item>\n' page = page + ' </channel>\n</rss>' return page@app.route('/<path:thread>', methods=['GET'])def mainpage(thread): page = getpage(thread) response = make_response(page, 200) response.mimetype = "application/rss+xml" return responseCGIHandler().run(app)
>>218497def getpage(thread): import requests import bs4ЖестьХотя, всё равно спасибо, буду разбираться.
>>218497
def getpage(thread): import requests import bs4
Жесть
Хотя, всё равно спасибо, буду разбираться.
>>218500Там изначально было кеширование и вот с таким вот хаком при попадании в кеш оно отрабатывало несколько быстрее.
Вывод количества траффика по интерфейсам. Использую тизеринг с мобильника, поэтому вот.#!/bin/sh# show total bandwidth stats for network interfacesscriptname="${0##*/}"[ $# -eq 0 ] || [ "$1" = "-h" ] && { echo "usage: $scriptname <iface> [iface] .." >&2 exit 1}# total bandwidthtotal=0# number of working interfacescnt=0for i; do [ -d /sys/class/net/$i ] && { tx=$(cat /sys/class/net/$i/statistics/tx_bytes) rx=$(cat /sys/class/net/$i/statistics/rx_bytes) mibs=$(( (tx + rx) / 1024 / 1024 )) total=$((total + mibs)) cnt=$((cnt + 1)) echo $i: ${mibs} MiB } || { echo "$scriptname: no such interface: $i" >&2 }done[ $cnt -gt 1 ] && echo total: $total MiB
Вывод количества траффика по интерфейсам. Использую тизеринг с мобильника, поэтому вот.
#!/bin/sh
# show total bandwidth stats for network interfaces
scriptname="${0##*/}"
[ $# -eq 0 ] || [ "$1" = "-h" ] && { echo "usage: $scriptname <iface> [iface] .." >&2 exit 1}
# total bandwidthtotal=0# number of working interfacescnt=0
for i; do [ -d /sys/class/net/$i ] && { tx=$(cat /sys/class/net/$i/statistics/tx_bytes) rx=$(cat /sys/class/net/$i/statistics/rx_bytes) mibs=$(( (tx + rx) / 1024 / 1024 )) total=$((total + mibs)) cnt=$((cnt + 1)) echo $i: ${mibs} MiB } || { echo "$scriptname: no such interface: $i" >&2 }done
[ $cnt -gt 1 ] && echo total: $total MiB
https://libredirect.github.io/index.htmlПеренаправления на альтернативные фронтенды, автоматически, браузерным аддоном.
https://libredirect.github.io/index.html
Перенаправления на альтернативные фронтенды, автоматически, браузерным аддоном.
>>218501Я могу попробовать захостить у себя и получть бесплатный домен через freedns.afraid.orgНо не раньше чем у меня семестр кончится, то есть в Январе.
>>218501
Я могу попробовать захостить у себя и получть бесплатный домен через freedns.afraid.org
Но не раньше чем у меня семестр кончится, то есть в Январе.
>>218628Оно на локалхосте отлично живет без внешнего ip, главное чтобы у rss читалки доступ был. Но если хочешь захостить для всех, то я могу попробовать прикрутить кеширование обратно, чтобы меньше трафика гонять.
>>218629>Но если хочешь захостить для всехХочешь.>я могу попробовать прикрутить кеширование обратноПопробуй.Тебе будет удобно, если будет для этой штуки git репозиторий где-то ?Я могу написать гайд как кидать патчи анонимно.
>>218629
>Но если хочешь захостить для всех
Хочешь.
>я могу попробовать прикрутить кеширование обратно
Попробуй.
Тебе будет удобно, если будет для этой штуки git репозиторий где-то ?Я могу написать гайд как кидать патчи анонимно.
>>218773> Попробуй.Держи:#!/usr/bin/env python3from flask import Flask, request, redirect, make_responsefrom wsgiref.handlers import CGIHandlerimport osimport timefrom diskcache import Cache# some settingsurl_base = 'http://nowere.net/' # http fast, but insecure; https secure but slowerdirectcache_time = 600 # time in seconds when local cache returned without quering servercache_directory = '/tmp/nowere' # where cache has been stored, safe to deleteapp = Flask(__name__)if os.environ.get("PATH_INFO") is None: os.environ["PATH_INFO"] = ""def update_page(thread, cache): if (cache[thread + 'time'] > 0): # return older version of feed to another clients if we have cached one cache[thread + 'time'] = time.time() import requests ret = requests.get(url_base + thread, headers={'If-Modified-Since':cache[thread + 'Last-Modified']}) if (ret.status_code == 304): # nothing changed return True if (ret.status_code > 399): # something wrong return ret import bs4 html = ret.content feed = '' html = bs4.BeautifulSoup(html, 'lxml') feed = feed + '<?xml version="1.0"?><rss version="2.0">\n <channel>\n <title>\n' feed = feed + thread + '\n' feed = feed + ' </title>\n' feed = feed + ' <link>' + url_base + thread + '</link>\n' posts = html.find_all('td', attrs={'class':'reply'}) for post in posts: postTitle = str(post.a['name']) postLink = url_base + thread + '#' + postTitle feed = feed + ' <item>\n' feed = feed + ' <title>' + postTitle + '</title>\n' feed = feed + ' <description>\n' feed = feed + ' <p><a href="' + postLink + '">' + postLink + '</a></p>\n' feed = feed + str(post) feed = feed + ' </description>\n' feed = feed + ' <guid isPermaLink="true">' + postLink + '</guid>\n' feed = feed + ' </item>\n' feed = feed + ' </channel>\n</rss>' cache[thread + 'feed'] = feed cache[thread + 'Last-Modified'] = ret.headers['Last-Modified'] cache[thread + 'time'] = time.time() return True@app.route('/<path:thread>', methods=['GET'])def mainpage(thread): cache = Cache(directory=cache_directory) try: test = cache[thread+'time'] except KeyError: cache[thread + 'time'] = 0 cache[thread + 'Last-Modified'] = 'Thu, 01 Jan 1970 00:00:00 GMT' if ( (time.time() - cache[thread + 'time']) > directcache_time): ret = update_page(thread, cache) if ( ret != True ): response = make_response(ret.content, ret.status_code) return response response = make_response(cache[thread + 'feed'], 200) #response.mimetype = "text/plain" response.mimetype = "application/rss+xml" return responseCGIHandler().run(app)> Тебе будет удобно, если будет для этой штуки git репозиторий где-то ?Не уверен что в этом есть смысл, это ведь типичный одноразовый код, который часто проще выкинуть чем переписывать.
>>218773
> Попробуй.
Держи:
#!/usr/bin/env python3from flask import Flask, request, redirect, make_responsefrom wsgiref.handlers import CGIHandlerimport osimport timefrom diskcache import Cache# some settingsurl_base = 'http://nowere.net/' # http fast, but insecure; https secure but slowerdirectcache_time = 600 # time in seconds when local cache returned without quering servercache_directory = '/tmp/nowere' # where cache has been stored, safe to deleteapp = Flask(__name__)if os.environ.get("PATH_INFO") is None: os.environ["PATH_INFO"] = ""def update_page(thread, cache): if (cache[thread + 'time'] > 0): # return older version of feed to another clients if we have cached one cache[thread + 'time'] = time.time() import requests ret = requests.get(url_base + thread, headers={'If-Modified-Since':cache[thread + 'Last-Modified']}) if (ret.status_code == 304): # nothing changed return True if (ret.status_code > 399): # something wrong return ret import bs4 html = ret.content feed = '' html = bs4.BeautifulSoup(html, 'lxml') feed = feed + '<?xml version="1.0"?><rss version="2.0">\n <channel>\n <title>\n' feed = feed + thread + '\n' feed = feed + ' </title>\n' feed = feed + ' <link>' + url_base + thread + '</link>\n' posts = html.find_all('td', attrs={'class':'reply'}) for post in posts: postTitle = str(post.a['name']) postLink = url_base + thread + '#' + postTitle feed = feed + ' <item>\n' feed = feed + ' <title>' + postTitle + '</title>\n' feed = feed + ' <description>\n' feed = feed + ' <p><a href="' + postLink + '">' + postLink + '</a></p>\n' feed = feed + str(post) feed = feed + ' </description>\n' feed = feed + ' <guid isPermaLink="true">' + postLink + '</guid>\n' feed = feed + ' </item>\n' feed = feed + ' </channel>\n</rss>' cache[thread + 'feed'] = feed cache[thread + 'Last-Modified'] = ret.headers['Last-Modified'] cache[thread + 'time'] = time.time() return True@app.route('/<path:thread>', methods=['GET'])def mainpage(thread): cache = Cache(directory=cache_directory) try: test = cache[thread+'time'] except KeyError: cache[thread + 'time'] = 0 cache[thread + 'Last-Modified'] = 'Thu, 01 Jan 1970 00:00:00 GMT' if ( (time.time() - cache[thread + 'time']) > directcache_time): ret = update_page(thread, cache) if ( ret != True ): response = make_response(ret.content, ret.status_code) return response response = make_response(cache[thread + 'feed'], 200) #response.mimetype = "text/plain" response.mimetype = "application/rss+xml" return responseCGIHandler().run(app)
> Тебе будет удобно, если будет для этой штуки git репозиторий где-то ?
Не уверен что в этом есть смысл, это ведь типичный одноразовый код, который часто проще выкинуть чем переписывать.
Почему curl не загружает через HTTP POST файлы с такими именами —test'file'name.jpgtest'file.txttest&file.txttest<file>.txtПервые два отправляются успешно, вторые два — уже нет. С флагом verbosity ничего не говорит, как будто заливает пустые файлы. Делаю вот так,curl \ -F "files=@\"test'file.txt\"" \ -F "files=@\"test'file'name.jpg\"" \ -F "files=@\"test&file.txt\"" \ -F "files=@\"test<file>.txt\""Братишка говорит, если я хорошо курлыкну, он мне погону отдаст.
Почему curl не загружает через HTTP POST файлы с такими именами —
test'file'name.jpgtest'file.txttest&file.txttest<file>.txt
Первые два отправляются успешно, вторые два — уже нет. С флагом verbosity ничего не говорит, как будто заливает пустые файлы. Делаю вот так,
curl \ -F "files=@\"test'file.txt\"" \ -F "files=@\"test'file'name.jpg\"" \ -F "files=@\"test&file.txt\"" \ -F "files=@\"test<file>.txt\""
Братишка говорит, если я хорошо курлыкну, он мне погону отдаст.
>>218866Это предположение, но вероятно & парсится шеллом как синтаксис для запуска в бэкгрунде, а < и > как перенаправления в файл
- wakaba 3.0.7 + futaba + futallaby -