Калькулятор химического равновесия
Расчёт константы равновесия Kc, Kp, энергии Гиббса и направления реакции по равновесным или текущим концентрациям.
—
Kc (или Q)
безразмерно*
* Kc формально имеет размерность (моль/л)Δn, но здесь указана численная величина при стандартном состоянии 1 моль/л.
Как пользоваться
1
Выберите режим: «Расчёт Kc» — если у вас равновесные концентрации всех веществ; «Расчёт Q» — если нужно определить направление реакции по текущим концентрациям и известной Kc.
2
Задайте температуру в Кельвинах (по умолчанию 298 K = 25°C). Для перевода из Цельсия нажмите кнопку «25°C → K» или введите T = t(°C) + 273.15.
3
Укажите стехиометрические коэффициенты a, b (реагенты) и c, d (продукты) для реакции aA + bB ⇌ cC + dD. Допускаются нулевые коэффициенты для отсутствующих веществ.
4
Введите концентрации всех веществ в моль/л. Для режима Q дополнительно укажите известную константу равновесия Kc. Нажмите «Рассчитать».
Примеры использования
Синтез аммиака: N₂ + 3H₂ ⇌ 2NH₃
Температура: 298 K. Коэффициенты: a=1, b=3, c=2, d=0.
Равновесные концентрации: [N₂]=0.10, [H₂]=0.30, [NH₃]=0.20 моль/л.
Результат: Kc ≈ 14.8, Kp ≈ 14.8 (Δn = 0 при данных коэффициентах? Нет, Δn = 2 - 4 = -2, Kp = Kc·(RT)⁻² ≈ 14.8 / (0.082·298)² ≈ 0.025), ΔG° ≈ -6.7 кДж/моль.
Окисление SO₂: 2SO₂ + O₂ ⇌ 2SO₃
Температура: 700 K. Коэффициенты: a=2, b=1, c=2, d=0.
Равновесные концентрации: [SO₂]=0.40, [O₂]=0.20, [SO₃]=0.60 моль/л.
Результат: Kc = (0.60)² / ((0.40)²·0.20) = 11.25, Δn = 2-3 = -1, Kp = 11.25/(0.082·700) ≈ 0.20, ΔG° ≈ -14.1 кДж/моль.
Реакция H₂ + I₂ ⇌ 2HI (проверка направления)
Известная Kc = 49 при 298 K. Текущие концентрации: [H₂]=0.10, [I₂]=0.10, [HI]=0.50 моль/л.
Результат: Q = (0.50)²/(0.10·0.10) = 25. Q < Kc → реакция идёт в прямом направлении (вправо, в сторону продуктов).
Важные нюансы
- Калькулятор предназначен для гомогенных газофазных или жидкофазных равновесий. Твёрдые вещества и чистые жидкости в выражение Kc не входят — их активность принимается равной 1.
- Концентрации должны быть неотрицательными. Для расчёта Kc все равновесные концентрации реагентов и продуктов должны быть строго больше нуля (знаменатель не должен обращаться в нуль).
- Температура всегда указывается в Кельвинах (0 K = -273.15°C). При отрицательных или нулевых значениях расчёт не производится.
- Kp связана с Kc соотношением Kp = Kc·(RT)^Δn, где R = 0.082057 л·атм/(моль·K) для давления в атмосферах, Δn = (c+d) - (a+b). Если Δn = 0, то Kp = Kc.
- ΔG° рассчитывается как -RT ln K. Отрицательное значение ΔG° указывает на самопроизвольность прямой реакции в стандартных условиях, но не гарантирует быстрой кинетики.
- Если Q < Kc — реакция идёт в прямом направлении; Q > Kc — в обратном; Q = Kc — система в равновесии.
Источники данных
- IUPAC Gold Book — Международный союз теоретической и прикладной химии: определения константы равновесия, энергии Гиббса, стандартного состояния. doi:10.1351/goldbook
- NIST Chemistry WebBook — Национальный институт стандартов и технологий США: справочные термодинамические данные, константы равновесия для тысяч реакций. webbook.nist.gov
- CRC Handbook of Chemistry and Physics — авторитетный справочник физико-химических величин, включая значения R, стандартные потенциалы, таблицы констант.
- Стандартные химические формулы — расчёт основан на фундаментальных уравнениях химической термодинамики и законе действующих масс, изучаемых в вузовских курсах физической химии.
⚠ Техника безопасности
- Данный калькулятор — инструмент для теоретических расчётов и учебных целей. Перед проведением реального эксперимента обязательно оцените риски работы с конкретными веществами.
- Не используйте калькулятор для проектирования синтеза взрывчатых, токсичных или наркотических веществ. Соблюдайте законодательство РФ и правила лабораторной безопасности.
- При работе с газами под давлением, высокими температурами или коррозионными средами используйте средства индивидуальной защиты и проводите реакции в сертифицированном оборудовании.
Калькулятор химического равновесия позволяет быстро вычислить константу равновесия Kc и Kp, энергию Гиббса ΔG° и направление реакции по заданным концентрациям и стехиометрическим коэффициентам. Инструмент полезен студентам, преподавателям и инженерам-химикам для проверки расчётов по закону действующих масс и основам химической термодинамики. Расчёт выполняется на основе стандартных химических формул с использованием фундаментальных констант R = 8.314 Дж/(моль·K) и 0.082 л·атм/(моль·K). Все результаты сопровождаются проверкой входных данных и выводом информативных сообщений.
CiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vINCa0L7QvdGB0YLQsNC90YLRiwogICAgY29uc3QgUl9HQVNfQVRNID0gMC4wODIwNTc7IC8vINC7wrfQsNGC0LwvKNC80L7Qu9GMwrdLKQogICAgY29uc3QgUl9HQVNfSiA9IDguMzE0NDYyNjE4OyAvLyDQlNC2LyjQvNC+0LvRjMK3SykKICAgIGNvbnN0IFJfR0FTX0tKID0gUl9HQVNfSiAvIDEwMDA7IC8vINC60JTQti8o0LzQvtC70YzCt0spCgogICAgLy8g0K3Qu9C10LzQtdC90YLRiyBET00KICAgIGNvbnN0IHJhZGlvTW9kZUtjID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT0iY2FsYy1tb2RlIl1bdmFsdWU9ImtjIl0nKTsKICAgIGNvbnN0IHJhZGlvTW9kZVEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPSJjYWxjLW1vZGUiXVt2YWx1ZT0icSJdJyk7CiAgICBjb25zdCBrbm93bktjR3JvdXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna25vd24ta2MtZ3JvdXAnKTsKICAgIGNvbnN0IGtub3duS2NJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrbm93bi1rYycpOwogICAgY29uc3QgZXJyb3JLbm93bktjID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWtub3duLWtjJyk7CiAgICBjb25zdCB0ZW1wSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVtcGVyYXR1cmUtaycpOwogICAgY29uc3QgZXJyb3JUZW1wID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLXRlbXAnKTsKICAgIGNvbnN0IGNvZWZmQSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2VmZi1hJyk7CiAgICBjb25zdCBjb2VmZkIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29lZmYtYicpOwogICAgY29uc3QgY29lZmZDID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvZWZmLWMnKTsKICAgIGNvbnN0IGNvZWZmRCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2VmZi1kJyk7CiAgICBjb25zdCBlcnJvckNvZWZmID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWNvZWZmJyk7CiAgICBjb25zdCBjb25jQSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25jLWEnKTsKICAgIGNvbnN0IGNvbmNCID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmMtYicpOwogICAgY29uc3QgY29uY0MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uYy1jJyk7CiAgICBjb25zdCBjb25jRCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25jLWQnKTsKICAgIGNvbnN0IGVycm9yQ29uYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1jb25jJyk7CiAgICBjb25zdCBjYWxjdWxhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsY3VsYXRlLWJ0bicpOwogICAgY29uc3QgcmVzZXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzZXQtYnRuJyk7CiAgICBjb25zdCBjb252ZXJ0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnZlcnQtY2Vsc2l1cy1idG4nKTsKCiAgICAvLyDQoNC10LfRg9C70YzRgtCw0YLRiwogICAgY29uc3QgcmVzdWx0S2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0LWtjJyk7CiAgICBjb25zdCByZXN1bHRLcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQta3AnKTsKICAgIGNvbnN0IHJlc3VsdERlbHRhRyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQtZGVsdGEtZycpOwogICAgY29uc3QgcmVzdWx0TG5LID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdC1sbi1rJyk7CiAgICBjb25zdCByZXN1bHREaXJlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0LWRpcmVjdGlvbicpOwogICAgY29uc3QgcmVzdWx0RGlyZWN0aW9uVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQtZGlyZWN0aW9uLXRleHQnKTsKICAgIGNvbnN0IHJlc3VsdE5vdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0LW5vdGUnKTsKCiAgICAvLyDQn9C10YDQtdC60LvRjtGH0LXQvdC40LUg0YDQtdC20LjQvNCwCiAgICBmdW5jdGlvbiB1cGRhdGVNb2RlVUkoKSB7CiAgICAgIGNvbnN0IGlzUU1vZGUgPSByYWRpb01vZGVRICYmIHJhZGlvTW9kZVEuY2hlY2tlZDsKICAgICAgaWYgKGtub3duS2NHcm91cCkgewogICAgICAgIGtub3duS2NHcm91cC5zdHlsZS5kaXNwbGF5ID0gaXNRTW9kZSA/ICdibG9jaycgOiAnbm9uZSc7CiAgICAgIH0KICAgICAgaWYgKHJlc3VsdERpcmVjdGlvbikgewogICAgICAgIHJlc3VsdERpcmVjdGlvbi5zdHlsZS5kaXNwbGF5ID0gaXNRTW9kZSA/ICdibG9jaycgOiAnbm9uZSc7CiAgICAgIH0KICAgICAgLy8g0J7Rh9C40YHRgtC60LAg0L7RiNC40LHQvtC6INC4INGA0LXQt9GD0LvRjNGC0LDRgtC+0LIg0L/RgNC4INGB0LzQtdC90LUg0YDQtdC20LjQvNCwCiAgICAgIGNsZWFyRXJyb3JzKCk7CiAgICAgIGNsZWFyUmVzdWx0cygpOwogICAgfQoKICAgIGlmIChyYWRpb01vZGVLYykgcmFkaW9Nb2RlS2MuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdXBkYXRlTW9kZVVJKTsKICAgIGlmIChyYWRpb01vZGVRKSByYWRpb01vZGVRLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHVwZGF0ZU1vZGVVSSk7CgogICAgLy8g0J7Rh9C40YHRgtC60LAg0L7RiNC40LHQvtC6CiAgICBmdW5jdGlvbiBjbGVhckVycm9ycygpIHsKICAgICAgaWYgKGVycm9yVGVtcCkgZXJyb3JUZW1wLnRleHRDb250ZW50ID0gJyc7CiAgICAgIGlmIChlcnJvckNvZWZmKSBlcnJvckNvZWZmLnRleHRDb250ZW50ID0gJyc7CiAgICAgIGlmIChlcnJvckNvbmMpIGVycm9yQ29uYy50ZXh0Q29udGVudCA9ICcnOwogICAgICBpZiAoZXJyb3JLbm93bktjKSBlcnJvcktub3duS2MudGV4dENvbnRlbnQgPSAnJzsKICAgIH0KCiAgICAvLyDQntGH0LjRgdGC0LrQsCDRgNC10LfRg9C70YzRgtCw0YLQvtCyCiAgICBmdW5jdGlvbiBjbGVhclJlc3VsdHMoKSB7CiAgICAgIGlmIChyZXN1bHRLYykgcmVzdWx0S2MudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgaWYgKHJlc3VsdEtwKSByZXN1bHRLcC50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICBpZiAocmVzdWx0RGVsdGFHKSByZXN1bHREZWx0YUcudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgaWYgKHJlc3VsdExuSykgcmVzdWx0TG5LLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgIGlmIChyZXN1bHREaXJlY3Rpb25UZXh0KSByZXN1bHREaXJlY3Rpb25UZXh0LnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgIGlmIChyZXN1bHREaXJlY3Rpb24pIHJlc3VsdERpcmVjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICBpZiAocmVzdWx0Tm90ZSkgcmVzdWx0Tm90ZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgfQoKICAgIC8vINCf0L7QutCw0LfQsNGC0Ywg0L7RiNC40LHQutGDCiAgICBmdW5jdGlvbiBzaG93RXJyb3IoZWxlbWVudCwgbWVzc2FnZSkgewogICAgICBpZiAoZWxlbWVudCkgZWxlbWVudC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7CiAgICB9CgogICAgLy8g0JLQsNC70LjQtNCw0YbQuNGPINC4INC/0LDRgNGB0LjQvdCzINGH0LjRgdC70LAKICAgIGZ1bmN0aW9uIHBhcnNlUG9zaXRpdmVOdW1iZXIodmFsdWUsIGVsZW1lbnQsIGVycm9yRWwsIGZpZWxkTmFtZSwgYWxsb3daZXJvKSB7CiAgICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7CiAgICAgIGlmICh0cmltbWVkID09PSAnJykgewogICAgICAgIHNob3dFcnJvcihlcnJvckVsLCAn0J/QvtC70LUgIicgKyBmaWVsZE5hbWUgKyAnIiDQvtCx0Y/Qt9Cw0YLQtdC70YzQvdC+INC00LvRjyDQt9Cw0L/QvtC70L3QtdC90LjRjy4nKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBudW0gPSBOdW1iZXIodHJpbW1lZCk7CiAgICAgIGlmIChpc05hTihudW0pKSB7CiAgICAgICAgc2hvd0Vycm9yKGVycm9yRWwsICfQn9C+0LvQtSAiJyArIGZpZWxkTmFtZSArICciINC00L7Qu9C20L3QviDQsdGL0YLRjCDRh9C40YHQu9C+0LwuJyk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKCFpc0Zpbml0ZShudW0pKSB7CiAgICAgICAgc2hvd0Vycm9yKGVycm9yRWwsICfQn9C+0LvQtSAiJyArIGZpZWxkTmFtZSArICciINGB0L7QtNC10YDQttC40YIg0L3QtdC60L7RgNGA0LXQutGC0L3QvtC1INC30L3QsNGH0LXQvdC40LUuJyk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKGFsbG93WmVybykgewogICAgICAgIGlmIChudW0gPCAwKSB7CiAgICAgICAgICBzaG93RXJyb3IoZXJyb3JFbCwgJ9Cf0L7Qu9C1ICInICsgZmllbGROYW1lICsgJyIg0L3QtSDQvNC+0LbQtdGCINCx0YvRgtGMINC+0YLRgNC40YbQsNGC0LXQu9GM0L3Ri9C8LicpOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChudW0gPD0gMCkgewogICAgICAgICAgc2hvd0Vycm9yKGVycm9yRWwsICfQn9C+0LvQtSAiJyArIGZpZWxkTmFtZSArICciINC00L7Qu9C20L3QviDQsdGL0YLRjCDQv9C+0LvQvtC20LjRgtC10LvRjNC90YvQvCDRh9C40YHQu9C+0LwuJyk7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG51bTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZU5vbk5lZ2F0aXZlTnVtYmVyKHZhbHVlLCBlbGVtZW50LCBlcnJvckVsLCBmaWVsZE5hbWUpIHsKICAgICAgcmV0dXJuIHBhcnNlUG9zaXRpdmVOdW1iZXIodmFsdWUsIGVsZW1lbnQsIGVycm9yRWwsIGZpZWxkTmFtZSwgdHJ1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VQb3NpdGl2ZU51bWJlclN0cmljdCh2YWx1ZSwgZWxlbWVudCwgZXJyb3JFbCwgZmllbGROYW1lKSB7CiAgICAgIHJldHVybiBwYXJzZVBvc2l0aXZlTnVtYmVyKHZhbHVlLCBlbGVtZW50LCBlcnJvckVsLCBmaWVsZE5hbWUsIGZhbHNlKTsKICAgIH0KCiAgICAvLyDQoNCw0YHRh9GR0YIKICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZSgpIHsKICAgICAgY2xlYXJFcnJvcnMoKTsKICAgICAgY2xlYXJSZXN1bHRzKCk7CgogICAgICBjb25zdCBpc1FNb2RlID0gcmFkaW9Nb2RlUSAmJiByYWRpb01vZGVRLmNoZWNrZWQ7CgogICAgICAvLyDQn9Cw0YDRgdC40L3QsyDRgtC10LzQv9C10YDQsNGC0YPRgNGLCiAgICAgIGNvbnN0IHRlbXAgPSBwYXJzZVBvc2l0aXZlTnVtYmVyU3RyaWN0KHRlbXBJbnB1dC52YWx1ZSwgdGVtcElucHV0LCBlcnJvclRlbXAsICfQotC10LzQv9C10YDQsNGC0YPRgNCwIChLKScpOwogICAgICBpZiAodGVtcCA9PT0gbnVsbCkgcmV0dXJuOwoKICAgICAgLy8g0J/QsNGA0YHQuNC90LMg0LrQvtGN0YTRhNC40YbQuNC10L3RgtC+0LIKICAgICAgY29uc3QgYSA9IHBhcnNlTm9uTmVnYXRpdmVOdW1iZXIoY29lZmZBLnZhbHVlLCBjb2VmZkEsIGVycm9yQ29lZmYsICfQmtC+0Y3RhNGE0LjRhtC40LXQvdGCIGEnKTsKICAgICAgaWYgKGEgPT09IG51bGwpIHJldHVybjsKICAgICAgY29uc3QgYiA9IHBhcnNlTm9uTmVnYXRpdmVOdW1iZXIoY29lZmZCLnZhbHVlLCBjb2VmZkIsIGVycm9yQ29lZmYsICfQmtC+0Y3RhNGE0LjRhtC40LXQvdGCIGInKTsKICAgICAgaWYgKGIgPT09IG51bGwpIHJldHVybjsKICAgICAgY29uc3QgYyA9IHBhcnNlTm9uTmVnYXRpdmVOdW1iZXIoY29lZmZDLnZhbHVlLCBjb2VmZkMsIGVycm9yQ29lZmYsICfQmtC+0Y3RhNGE0LjRhtC40LXQvdGCIGMnKTsKICAgICAgaWYgKGMgPT09IG51bGwpIHJldHVybjsKICAgICAgY29uc3QgZCA9IHBhcnNlTm9uTmVnYXRpdmVOdW1iZXIoY29lZmZELnZhbHVlLCBjb2VmZkQsIGVycm9yQ29lZmYsICfQmtC+0Y3RhNGE0LjRhtC40LXQvdGCIGQnKTsKICAgICAgaWYgKGQgPT09IG51bGwpIHJldHVybjsKCiAgICAgIC8vINCf0YDQvtCy0LXRgNC60LAsINGH0YLQviDQtdGB0YLRjCDRhdC+0YLRjyDQsdGLINC+0LTQuNC9INGA0LXQsNCz0LXQvdGCINC4INC+0LTQuNC9INC/0YDQvtC00YPQutGCCiAgICAgIGlmICgoYSA9PT0gMCAmJiBiID09PSAwKSB8fCAoYyA9PT0gMCAmJiBkID09PSAwKSkgewogICAgICAgIHNob3dFcnJvcihlcnJvckNvZWZmLCAn0JTQvtC70LbQtdC9INCx0YvRgtGMINGF0L7RgtGPINCx0Ysg0L7QtNC40L0g0YDQtdCw0LPQtdC90YIgKGEg0LjQu9C4IGIgPiAwKSDQuCDRhdC+0YLRjyDQsdGLINC+0LTQuNC9INC/0YDQvtC00YPQutGCIChjINC40LvQuCBkID4gMCkuJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICAvLyDQn9Cw0YDRgdC40L3QsyDQutC+0L3RhtC10L3RgtGA0LDRhtC40LkKICAgICAgY29uc3QgY29uY0FWYWwgPSBwYXJzZU5vbk5lZ2F0aXZlTnVtYmVyKGNvbmNBLnZhbHVlLCBjb25jQSwgZXJyb3JDb25jLCAnW0FdJyk7CiAgICAgIGlmIChjb25jQVZhbCA9PT0gbnVsbCkgcmV0dXJuOwogICAgICBjb25zdCBjb25jQlZhbCA9IHBhcnNlTm9uTmVnYXRpdmVOdW1iZXIoY29uY0IudmFsdWUsIGNvbmNCLCBlcnJvckNvbmMsICdbQl0nKTsKICAgICAgaWYgKGNvbmNCVmFsID09PSBudWxsKSByZXR1cm47CiAgICAgIGNvbnN0IGNvbmNDVmFsID0gcGFyc2VOb25OZWdhdGl2ZU51bWJlcihjb25jQy52YWx1ZSwgY29uY0MsIGVycm9yQ29uYywgJ1tDXScpOwogICAgICBpZiAoY29uY0NWYWwgPT09IG51bGwpIHJldHVybjsKICAgICAgY29uc3QgY29uY0RWYWwgPSBwYXJzZU5vbk5lZ2F0aXZlTnVtYmVyKGNvbmNELnZhbHVlLCBjb25jRCwgZXJyb3JDb25jLCAnW0RdJyk7CiAgICAgIGlmIChjb25jRFZhbCA9PT0gbnVsbCkgcmV0dXJuOwoKICAgICAgLy8g0JTQu9GPIEtjICjQvdC1IFEpINCy0YHQtSDQutC+0L3RhtC10L3RgtGA0LDRhtC40Lgg0LTQvtC70LbQvdGLINCx0YvRgtGMID4gMCDQtNC70Y8g0LLQtdGJ0LXRgdGC0LIg0YEg0L3QtdC90YPQu9C10LLRi9C80Lgg0LrQvtGN0YTRhNC40YbQuNC10L3RgtCw0LzQuAogICAgICBpZiAoIWlzUU1vZGUpIHsKICAgICAgICBpZiAoYSA+IDAgJiYgY29uY0FWYWwgPT09IDApIHsKICAgICAgICAgIHNob3dFcnJvcihlcnJvckNvbmMsICdbQV0g0LTQvtC70LbQvdC+INCx0YvRgtGMID4gMCDQtNC70Y8g0YDQsNCy0L3QvtCy0LXRgdC90L7Qs9C+INGA0LDRgdGH0ZHRgtCwIEtjINC/0YDQuCBhID4gMC4nKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGIgPiAwICYmIGNvbmNCVmFsID09PSAwKSB7CiAgICAgICAgICBzaG93RXJyb3IoZXJyb3JDb25jLCAnW0JdINC00L7Qu9C20L3QviDQsdGL0YLRjCA+IDAg0LTQu9GPINGA0LDQstC90L7QstC10YHQvdC+0LPQviDRgNCw0YHRh9GR0YLQsCBLYyDQv9GA0LggYiA+IDAuJyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChjID4gMCAmJiBjb25jQ1ZhbCA9PT0gMCkgewogICAgICAgICAgc2hvd0Vycm9yKGVycm9yQ29uYywgJ1tDXSDQtNC+0LvQttC90L4g0LHRi9GC0YwgPiAwINC00LvRjyDRgNCw0LLQvdC+0LLQtdGB0L3QvtCz0L4g0YDQsNGB0YfRkdGC0LAgS2Mg0L/RgNC4IGMgPiAwLicpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoZCA+IDAgJiYgY29uY0RWYWwgPT09IDApIHsKICAgICAgICAgIHNob3dFcnJvcihlcnJvckNvbmMsICdbRF0g0LTQvtC70LbQvdC+INCx0YvRgtGMID4gMCDQtNC70Y8g0YDQsNCy0L3QvtCy0LXRgdC90L7Qs9C+INGA0LDRgdGH0ZHRgtCwIEtjINC/0YDQuCBkID4gMC4nKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vINCg0LDRgdGH0ZHRgiDQt9C90LDQvNC10L3QsNGC0LXQu9GPCiAgICAgIGxldCBkZW5vbWluYXRvciA9IDE7CiAgICAgIGlmIChhID4gMCkgZGVub21pbmF0b3IgKj0gTWF0aC5wb3coY29uY0FWYWwsIGEpOwogICAgICBpZiAoYiA+IDApIGRlbm9taW5hdG9yICo9IE1hdGgucG93KGNvbmNCVmFsLCBiKTsKCiAgICAgIGlmIChkZW5vbWluYXRvciA9PT0gMCkgewogICAgICAgIHNob3dFcnJvcihlcnJvckNvbmMsICfQl9C90LDQvNC10L3QsNGC0LXQu9GMINCy0YvRgNCw0LbQtdC90LjRjyDRgNCw0LLQtdC9INC90YPQu9GOIOKAlCDQv9GA0L7QstC10YDRjNGC0LUg0LrQvtC90YbQtdC90YLRgNCw0YbQuNC4INGA0LXQsNCz0LXQvdGC0L7Qsi4nKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIC8vINCg0LDRgdGH0ZHRgiDRh9C40YHQu9C40YLQtdC70Y8KICAgICAgbGV0IG51bWVyYXRvciA9IDE7CiAgICAgIGlmIChjID4gMCkgbnVtZXJhdG9yICo9IE1hdGgucG93KGNvbmNDVmFsLCBjKTsKICAgICAgaWYgKGQgPiAwKSBudW1lcmF0b3IgKj0gTWF0aC5wb3coY29uY0RWYWwsIGQpOwoKICAgICAgY29uc3Qga2NPclEgPSBudW1lcmF0b3IgLyBkZW5vbWluYXRvcjsKCiAgICAgIC8vINCf0YDQvtCy0LXRgNC60LAg0L3QsCDQsdC10YHQutC+0L3QtdGH0L3QvtGB0YLRjAogICAgICBpZiAoIWlzRmluaXRlKGtjT3JRKSB8fCBpc05hTihrY09yUSkpIHsKICAgICAgICBzaG93RXJyb3IoZXJyb3JDb25jLCAn0KDQtdC30YPQu9GM0YLQsNGCINGA0LDRgdGH0ZHRgtCwINC90LUg0L7Qv9GA0LXQtNC10LvRkdC9ICjQv9C10YDQtdC/0L7Qu9C90LXQvdC40LUg0LjQu9C4INC90LXQutC+0YDRgNC10LrRgtC90YvQtSDQtNCw0L3QvdGL0LUpLicpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgLy8gzpRuCiAgICAgIGNvbnN0IGRlbHRhTiA9IChjICsgZCkgLSAoYSArIGIpOwoKICAgICAgLy8gS3AgPSBLYyAqIChSVClezpRuCiAgICAgIGxldCBrcDsKICAgICAgY29uc3QgcnQgPSBSX0dBU19BVE0gKiB0ZW1wOwogICAgICBpZiAoZGVsdGFOID09PSAwKSB7CiAgICAgICAga3AgPSBrY09yUTsKICAgICAgfSBlbHNlIHsKICAgICAgICBrcCA9IGtjT3JRICogTWF0aC5wb3cocnQsIGRlbHRhTik7CiAgICAgIH0KICAgICAgaWYgKCFpc0Zpbml0ZShrcCkgfHwgaXNOYU4oa3ApKSBrcCA9IG51bGw7CgogICAgICAvLyBsbiBLICjQuNC70LggbG4gUSkKICAgICAgbGV0IGxuVmFsOwogICAgICBpZiAoa2NPclEgPiAwKSB7CiAgICAgICAgbG5WYWwgPSBNYXRoLmxvZyhrY09yUSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbG5WYWwgPSBudWxsOwogICAgICB9CgogICAgICAvLyDOlEfCsCA9IC1SVCBsbiBLICjRgtC+0LvRjNC60L4g0LIg0YDQtdC20LjQvNC1IEtjLCDQtNC70Y8gUSDQvdC1INC40LzQtdC10YIg0YHQvNGL0YHQu9CwINCyINGB0YLQsNC90LTQsNGA0YLQvdC+0Lwg0YHQvNGL0YHQu9C1KQogICAgICBsZXQgZGVsdGFHID0gbnVsbDsKICAgICAgaWYgKCFpc1FNb2RlICYmIGxuVmFsICE9PSBudWxsKSB7CiAgICAgICAgZGVsdGFHID0gLVJfR0FTX0tKICogdGVtcCAqIGxuVmFsOwogICAgICAgIGlmICghaXNGaW5pdGUoZGVsdGFHKSB8fCBpc05hTihkZWx0YUcpKSBkZWx0YUcgPSBudWxsOwogICAgICB9CgogICAgICAvLyDQktGL0LLQvtC0INGA0LXQt9GD0LvRjNGC0LDRgtC+0LIKICAgICAgaWYgKHJlc3VsdEtjKSByZXN1bHRLYy50ZXh0Q29udGVudCA9IGZvcm1hdE51bWJlcihrY09yUSk7CiAgICAgIGlmIChyZXN1bHRLcCkgcmVzdWx0S3AudGV4dENvbnRlbnQgPSBrcCAhPT0gbnVsbCA/IGZvcm1hdE51bWJlcihrcCkgOiAn4oCUJzsKICAgICAgaWYgKHJlc3VsdERlbHRhRykgcmVzdWx0RGVsdGFHLnRleHRDb250ZW50ID0gZGVsdGFHICE9PSBudWxsID8gZm9ybWF0TnVtYmVyKGRlbHRhRykgOiAoaXNRTW9kZSA/ICfigJQgKNGA0LXQttC40LwgUSknIDogJ+KAlCcpOwogICAgICBpZiAocmVzdWx0TG5LKSByZXN1bHRMbksudGV4dENvbnRlbnQgPSBsblZhbCAhPT0gbnVsbCA/IGZvcm1hdE51bWJlcihsblZhbCkgOiAn4oCUJzsKCiAgICAgIC8vINCf0YDQuNC80LXRh9Cw0L3QuNC1INC+INGA0LDQt9C80LXRgNC90L7RgdGC0LgKICAgICAgaWYgKHJlc3VsdE5vdGUpIHsKICAgICAgICBpZiAoZGVsdGFOICE9PSAwICYmICFpc1FNb2RlKSB7CiAgICAgICAgICByZXN1bHROb3RlLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgIH0gZWxzZSBpZiAoaXNRTW9kZSkgewogICAgICAgICAgcmVzdWx0Tm90ZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHROb3RlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyDQlNC70Y8g0YDQtdC20LjQvNCwIFEg4oCUINGB0YDQsNCy0L3QtdC90LjQtSDRgSDQuNC30LLQtdGB0YLQvdC+0LkgS2MKICAgICAgaWYgKGlzUU1vZGUpIHsKICAgICAgICBjb25zdCBrbm93bktjID0gcGFyc2VQb3NpdGl2ZU51bWJlclN0cmljdChrbm93bktjSW5wdXQudmFsdWUsIGtub3duS2NJbnB1dCwgZXJyb3JLbm93bktjLCAn0JjQt9Cy0LXRgdGC0L3QsNGPIEtjJyk7CiAgICAgICAgaWYgKGtub3duS2MgPT09IG51bGwpIHsKICAgICAgICAgIGlmIChyZXN1bHREaXJlY3Rpb24pIHJlc3VsdERpcmVjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAocmVzdWx0RGlyZWN0aW9uKSByZXN1bHREaXJlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgY29uc3QgcmF0aW8gPSBrY09yUSAvIGtub3duS2M7CiAgICAgICAgbGV0IGRpcmVjdGlvblRleHQgPSAnJzsKICAgICAgICBpZiAoTWF0aC5hYnMocmF0aW8gLSAxKSA8IDFlLTkpIHsKICAgICAgICAgIGRpcmVjdGlvblRleHQgPSAnUSDiiYggS2Mg4oCUINGB0LjRgdGC0LXQvNCwINC90LDRhdC+0LTQuNGC0YHRjyDQsiDRgNCw0LLQvdC+0LLQtdGB0LjQuC4nOwogICAgICAgIH0gZWxzZSBpZiAoa2NPclEgPCBrbm93bktjKSB7CiAgICAgICAgICBkaXJlY3Rpb25UZXh0ID0gJ1EgPCBLYyDigJQg0YDQtdCw0LrRhtC40Y8g0LjQtNGR0YIg0LIg0L/RgNGP0LzQvtC8INC90LDQv9GA0LDQstC70LXQvdC40LggKOKGkiksINCyINGB0YLQvtGA0L7QvdGDINC/0YDQvtC00YPQutGC0L7Qsi4nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkaXJlY3Rpb25UZXh0ID0gJ1EgPiBLYyDigJQg0YDQtdCw0LrRhtC40Y8g0LjQtNGR0YIg0LIg0L7QsdGA0LDRgtC90L7QvCDQvdCw0L/RgNCw0LLQu9C10L3QuNC4ICjihpApLCDQsiDRgdGC0L7RgNC+0L3RgyDRgNC10LDQs9C10L3RgtC+0LIuJzsKICAgICAgICB9CiAgICAgICAgaWYgKHJlc3VsdERpcmVjdGlvblRleHQpIHJlc3VsdERpcmVjdGlvblRleHQudGV4dENvbnRlbnQgPSBkaXJlY3Rpb25UZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChyZXN1bHREaXJlY3Rpb24pIHJlc3VsdERpcmVjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0TnVtYmVyKG51bSkgewogICAgICBpZiAobnVtID09PSBudWxsIHx8IG51bSA9PT0gdW5kZWZpbmVkIHx8IGlzTmFOKG51bSkgfHwgIWlzRmluaXRlKG51bSkpIHJldHVybiAn4oCUJzsKICAgICAgLy8g0JTQu9GPINC+0YfQtdC90Ywg0LHQvtC70YzRiNC40YUg0LjQu9C4INC+0YfQtdC90Ywg0LzQsNC70LXQvdGM0LrQuNGFINGH0LjRgdC10Lsg0LjRgdC/0L7Qu9GM0LfRg9C10Lwg0Y3QutGB0L/QvtC90LXQvdGG0LjQsNC70YzQvdGL0Lkg0YTQvtGA0LzQsNGCCiAgICAgIGlmIChNYXRoLmFicyhudW0pID49IDFlOSB8fCAoTWF0aC5hYnMobnVtKSA8IDFlLTkgJiYgbnVtICE9PSAwKSkgewogICAgICAgIHJldHVybiBudW0udG9FeHBvbmVudGlhbCg0KTsKICAgICAgfQogICAgICAvLyDQntC60YDRg9Cz0LvQtdC90LjQtSDQtNC+IDYg0LfQvdCw0YfQsNGJ0LjRhSDRhtC40YTRgAogICAgICBjb25zdCByb3VuZGVkID0gcGFyc2VGbG9hdChudW0udG9QcmVjaXNpb24oNikpOwogICAgICByZXR1cm4gcm91bmRlZC50b1N0cmluZygpOwogICAgfQoKICAgIC8vINCh0LHRgNC+0YEKICAgIGZ1bmN0aW9uIHJlc2V0QWxsKCkgewogICAgICBpZiAodGVtcElucHV0KSB0ZW1wSW5wdXQudmFsdWUgPSAnMjk4JzsKICAgICAgaWYgKGNvZWZmQSkgY29lZmZBLnZhbHVlID0gJzEnOwogICAgICBpZiAoY29lZmZCKSBjb2VmZkIudmFsdWUgPSAnMSc7CiAgICAgIGlmIChjb2VmZkMpIGNvZWZmQy52YWx1ZSA9ICcxJzsKICAgICAgaWYgKGNvZWZmRCkgY29lZmZELnZhbHVlID0gJzEnOwogICAgICBpZiAoY29uY0EpIGNvbmNBLnZhbHVlID0gJyc7CiAgICAgIGlmIChjb25jQikgY29uY0IudmFsdWUgPSAnJzsKICAgICAgaWYgKGNvbmNDKSBjb25jQy52YWx1ZSA9ICcnOwogICAgICBpZiAoY29uY0QpIGNvbmNELnZhbHVlID0gJyc7CiAgICAgIGlmIChrbm93bktjSW5wdXQpIGtub3duS2NJbnB1dC52YWx1ZSA9ICcnOwogICAgICBpZiAocmFkaW9Nb2RlS2MpIHJhZGlvTW9kZUtjLmNoZWNrZWQgPSB0cnVlOwogICAgICBpZiAocmFkaW9Nb2RlUSkgcmFkaW9Nb2RlUS5jaGVja2VkID0gZmFsc2U7CiAgICAgIGNsZWFyRXJyb3JzKCk7CiAgICAgIGNsZWFyUmVzdWx0cygpOwogICAgICB1cGRhdGVNb2RlVUkoKTsKICAgIH0KCiAgICAvLyDQmtC+0L3QstC10YDRgtCw0YbQuNGPIDI1wrBDINCyINCa0LXQu9GM0LLQuNC90YsKICAgIGZ1bmN0aW9uIGNvbnZlcnRDZWxzaXVzVG9LZWx2aW4oKSB7CiAgICAgIGlmICh0ZW1wSW5wdXQpIHsKICAgICAgICB0ZW1wSW5wdXQudmFsdWUgPSAnMjk4LjE1JzsKICAgICAgICAvLyDQntGH0LjRgdGC0LrQsCDQvtGI0LjQsdC60Lgg0YLQtdC80L/QtdGA0LDRgtGD0YDRiwogICAgICAgIGlmIChlcnJvclRlbXApIGVycm9yVGVtcC50ZXh0Q29udGVudCA9ICcnOwogICAgICB9CiAgICB9CgogICAgLy8g0J3QsNCy0LXRiNC40LLQsNC90LjQtSDRgdC+0LHRi9GC0LjQuQogICAgaWYgKGNhbGN1bGF0ZUJ0bikgY2FsY3VsYXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2FsY3VsYXRlKTsKICAgIGlmIChyZXNldEJ0bikgcmVzZXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZXNldEFsbCk7CiAgICBpZiAoY29udmVydEJ0bikgY29udmVydEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNvbnZlcnRDZWxzaXVzVG9LZWx2aW4pOwoKICAgIC8vINCY0L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPIFVJCiAgICB1cGRhdGVNb2RlVUkoKTsKICB9KSgpOwo=