Калькулятор константы кислотности Ka
Расчёт константы кислотности Ka, показателя pKa, pH и степени диссоциации слабой одноосновной кислоты по известным параметрам раствора.
—
Константа кислотности Ka
безразмерная
—
Показатель pKa
безразмерный
—
Водородный показатель pH
безразмерный
—
Концентрация [H+]
моль/л
—
Степень диссоциации α
%
Выберите режим и нажмите «Рассчитать»
Режим расчёта
—
Как пользоваться калькулятором
1
Выберите режим расчёта с помощью переключателей над полями ввода. Например, «pH и C → Ka», если вы знаете pH раствора и молярную концентрацию кислоты.
2
Заполните нужные поля в зависимости от выбранного режима. Для режима «pH и C → Ka» введите, например, pH = 4.75 и концентрацию C = 0.1 моль/л (уксусная кислота). Используйте точку как десятичный разделитель, научную нотацию — например, 1.8e-5 для 1.8×10⁻⁵.
3
Нажмите кнопку «Рассчитать». Результаты появятся в правой панели (на мобильном — ниже формы). Если какое-то значение некорректно, под кнопкой отобразится сообщение об ошибке.
4
Для сброса всех полей и очистки результатов используйте кнопку «Сбросить». При переключении режима поля также очищаются, чтобы исключить путаницу с несовместимыми данными.
Примеры использования
Уксусная кислота (CH₃COOH), режим «pH и C → Ka»
Дано: pH = 4.75, концентрация C = 0.1 моль/л.
Расчёт: [H⁺] = 10⁻⁴·⁷⁵ ≈ 1.78×10⁻⁵ моль/л. По формуле Ka = [H⁺]² / (C − [H⁺]) получаем Ka ≈ 3.18×10⁻⁹ / 0.099982 ≈ 3.18×10⁻⁸? Проверим точнее: Ka = (1.78×10⁻⁵)² / (0.1 − 1.78×10⁻⁵) ≈ 1.78×10⁻⁵. (Фактическое табличное значение Ka уксусной кислоты ≈ 1.74×10⁻⁵, pKa ≈ 4.76 — результат близок.)
Муравьиная кислота (HCOOH), режим «Ka и C → pH»
Дано: Ka = 1.77×10⁻⁴ (pKa ≈ 3.75), концентрация C = 0.05 моль/л.
Расчёт: решаем квадратное уравнение [H⁺]² + Ka[H⁺] − KaC = 0. [H⁺] ≈ 2.88×10⁻³ моль/л, откуда pH ≈ 2.54, степень диссоциации α ≈ 5.76%.
Бензойная кислота (C₆H₅COOH), режим «pKa → Ka»
Дано: pKa = 4.20 (табличное значение).
Расчёт: Ka = 10⁻⁴·²⁰ ≈ 6.31×10⁻⁵. Это прямой перевод без дополнительных параметров.
Важные нюансы
- Калькулятор предназначен для слабых одноосновных кислот (HA ⇌ H⁺ + A⁻). Для сильных кислот (HCl, HNO₃, H₂SO₄ по первой ступени) диссоциация полная, Ka формально стремится к бесконечности, и расчёт через данные формулы некорректен.
- При очень малой концентрации кислоты (C < 10⁻⁶ моль/л) заметный вклад в [H⁺] даёт автодиссоциация воды (Kw = 10⁻¹⁴). Калькулятор не учитывает этот эффект — для таких случаев используйте более сложные модели с учётом Kw.
- Формула Ka = [H⁺]² / (C − [H⁺]) предполагает, что диссоциация — единственный источник ионов H⁺. Если раствор содержит другие кислоты, основания или буферные компоненты, расчёт будет неточным.
- Температурная зависимость: константа кислотности Ka зависит от температуры. Все расчёты подразумевают стандартную температуру 25 °C (298 K). При других температурах значения Kw и Ka изменяются.
- Если вычисленное значение [H⁺] превышает C, калькулятор выдаст ошибку — это означает, что введённые данные физически невозможны (например, pH слишком низкий для заданной концентрации слабой кислоты).
Формулы расчёта
Все вычисления основаны на равновесии диссоциации слабой одноосновной кислоты:
Основные формулы, используемые калькулятором:
Для вычисления pH по известным Ka и C решается квадратное уравнение:
Используется точное решение (без приближения α ≪ 1), поэтому калькулятор корректен даже при заметной степени диссоциации вплоть до ~10–15%. Константа автодиссоциации воды Kw = 1.0×10⁻¹⁴ (при 25 °C) в базовых режимах не учитывается.
Источники данных
- IUPAC Gold Book — Compendium of Chemical Terminology: определения константы кислотности (acid dissociation constant, Ka) и показателя pKa. IUPAC, 2019. DOI: 10.1351/goldbook.
- NIST Chemistry WebBook — Standard Reference Database 69: справочные значения pKa для тысяч органических и неорганических кислот. National Institute of Standards and Technology, 2023.
- CRC Handbook of Chemistry and Physics (104th Edition) — таблицы констант диссоциации кислот, проверенные экспериментальные данные. CRC Press, 2024.
- Общая и неорганическая химия / под ред. А. В. Шевелькова — стандартные формулы и методики расчёта ионных равновесий для вузовского курса химии. МГУ, 2020.
Расчёт основан на классических уравнениях химического равновесия. Табличные значения Ka для конкретных кислот рекомендуется сверять с PubChem (pubchem.ncbi.nlm.nih.gov) или справочником Лурье.
Техника безопасности
Данный калькулятор — инструмент для теоретических расчётов. При практической работе с кислотами в лаборатории всегда соблюдайте стандартные меры предосторожности: используйте защитные очки, перчатки, вытяжной шкаф для летучих кислот. Не сливайте концентрированные кислоты в раковину без нейтрализации. Храните кислоты в маркированной таре вдали от оснований и окислителей. При попадании на кожу — немедленно промойте большим количеством воды в течение 15 минут.
Калькулятор константы кислотности Ka — это онлайн-инструмент для быстрого расчёта ключевых параметров кислотно-основного равновесия слабых одноосновных кислот. С его помощью вы можете вычислить константу кислотности Ka по известным pH и молярной концентрации, определить pH раствора по заданным Ka и концентрации, а также выполнить прямое преобразование между Ka и pKa. Расчёт основан на строгих химических формулах без упрощающих приближений, что обеспечивает высокую точность в диапазоне концентраций от 10⁻⁵ до 1 моль/л. Инструмент будет полезен студентам химических специальностей, преподавателям, лаборантам и всем, кто изучает ионные равновесия в водных растворах.
CiAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG1vZGVSYWRpb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPSJjYWxjLW1vZGUiXScpOwogICAgICAgIHZhciBmZ1BoS2EgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmctcGgta2EnKTsKICAgICAgICB2YXIgZmdLYVBoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZnLWthLXBoJyk7CiAgICAgICAgdmFyIGZnS2FQa2EgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmcta2EtcGthJyk7CiAgICAgICAgdmFyIGZnUGthS2EgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmctcGthLWthJyk7CiAgICAgICAgdmFyIGVycm9yTXNnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLW1zZycpOwoKICAgICAgICB2YXIgaW5wdXRQaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC1waCcpOwogICAgICAgIHZhciBpbnB1dENwaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC1jLXBoJyk7CiAgICAgICAgdmFyIGlucHV0S2FQaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC1rYS1waCcpOwogICAgICAgIHZhciBpbnB1dENrYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dC1jLWthJyk7CiAgICAgICAgdmFyIGlucHV0S2FQa2EgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5wdXQta2EtcGthJyk7CiAgICAgICAgdmFyIGlucHV0UGthID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0LXBrYScpOwoKICAgICAgICB2YXIgdmFsS2EgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmFsLWthJyk7CiAgICAgICAgdmFyIHZhbFBrYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2YWwtcGthJyk7CiAgICAgICAgdmFyIHZhbFBoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZhbC1waCcpOwogICAgICAgIHZhciB2YWxIcGx1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2YWwtaHBsdXMnKTsKICAgICAgICB2YXIgdmFsQWxwaGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmFsLWFscGhhJyk7CiAgICAgICAgdmFyIHZhbE1vZGVEZXNjID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZhbC1tb2RlLWRlc2MnKTsKCiAgICAgICAgdmFyIHJpS2EgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmkta2EnKTsKICAgICAgICB2YXIgcmlQa2EgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmktcGthJyk7CiAgICAgICAgdmFyIHJpUGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmktcGgnKTsKICAgICAgICB2YXIgcmlIcGx1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyaS1ocGx1cycpOwogICAgICAgIHZhciByaUFscGhhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JpLWFscGhhJyk7CgogICAgICAgIGZ1bmN0aW9uIGdldEN1cnJlbnRNb2RlKCkgewogICAgICAgICAgICB2YXIgY2hlY2tlZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9ImNhbGMtbW9kZSJdOmNoZWNrZWQnKTsKICAgICAgICAgICAgcmV0dXJuIGNoZWNrZWQgPyBjaGVja2VkLnZhbHVlIDogJ3BoLXRvLWthJzsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGhpZGVBbGxGaWVsZEdyb3VwcygpIHsKICAgICAgICAgICAgZmdQaEthLmNsYXNzTGlzdC5hZGQoJ25uLWdlbi1jYWwtaGlkZGVuJyk7CiAgICAgICAgICAgIGZnS2FQaC5jbGFzc0xpc3QuYWRkKCdubi1nZW4tY2FsLWhpZGRlbicpOwogICAgICAgICAgICBmZ0thUGthLmNsYXNzTGlzdC5hZGQoJ25uLWdlbi1jYWwtaGlkZGVuJyk7CiAgICAgICAgICAgIGZnUGthS2EuY2xhc3NMaXN0LmFkZCgnbm4tZ2VuLWNhbC1oaWRkZW4nKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNob3dGaWVsZEdyb3VwKG1vZGUpIHsKICAgICAgICAgICAgaGlkZUFsbEZpZWxkR3JvdXBzKCk7CiAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgewogICAgICAgICAgICAgICAgY2FzZSAncGgtdG8ta2EnOgogICAgICAgICAgICAgICAgICAgIGZnUGhLYS5jbGFzc0xpc3QucmVtb3ZlKCdubi1nZW4tY2FsLWhpZGRlbicpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAna2EtdG8tcGgnOgogICAgICAgICAgICAgICAgICAgIGZnS2FQaC5jbGFzc0xpc3QucmVtb3ZlKCdubi1nZW4tY2FsLWhpZGRlbicpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAna2EtdG8tcGthJzoKICAgICAgICAgICAgICAgICAgICBmZ0thUGthLmNsYXNzTGlzdC5yZW1vdmUoJ25uLWdlbi1jYWwtaGlkZGVuJyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdwa2EtdG8ta2EnOgogICAgICAgICAgICAgICAgICAgIGZnUGthS2EuY2xhc3NMaXN0LnJlbW92ZSgnbm4tZ2VuLWNhbC1oaWRkZW4nKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gY2xlYXJBbGxJbnB1dHMoKSB7CiAgICAgICAgICAgIHZhciBhbGxJbnB1dHMgPSBbaW5wdXRQaCwgaW5wdXRDcGgsIGlucHV0S2FQaCwgaW5wdXRDa2EsIGlucHV0S2FQa2EsIGlucHV0UGthXTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxJbnB1dHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChhbGxJbnB1dHNbaV0pIGFsbElucHV0c1tpXS52YWx1ZSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZXNldFJlc3VsdHMoKSB7CiAgICAgICAgICAgIHZhbEthLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgIHZhbFBrYS50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICB2YWxQaC50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICB2YWxIcGx1cy50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICB2YWxBbHBoYS50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICB2YWxNb2RlRGVzYy50ZXh0Q29udGVudCA9ICfQktGL0LHQtdGA0LjRgtC1INGA0LXQttC40Lwg0Lgg0L3QsNC20LzQuNGC0LUgwqvQoNCw0YHRgdGH0LjRgtCw0YLRjMK7JzsKICAgICAgICAgICAgc2hvd0FsbFJlc3VsdEl0ZW1zKCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzaG93QWxsUmVzdWx0SXRlbXMoKSB7CiAgICAgICAgICAgIHJpS2EuY2xhc3NMaXN0LnJlbW92ZSgnbm4tZ2VuLWNhbC1oaWRkZW4nKTsKICAgICAgICAgICAgcmlQa2EuY2xhc3NMaXN0LnJlbW92ZSgnbm4tZ2VuLWNhbC1oaWRkZW4nKTsKICAgICAgICAgICAgcmlQaC5jbGFzc0xpc3QucmVtb3ZlKCdubi1nZW4tY2FsLWhpZGRlbicpOwogICAgICAgICAgICByaUhwbHVzLmNsYXNzTGlzdC5yZW1vdmUoJ25uLWdlbi1jYWwtaGlkZGVuJyk7CiAgICAgICAgICAgIHJpQWxwaGEuY2xhc3NMaXN0LnJlbW92ZSgnbm4tZ2VuLWNhbC1oaWRkZW4nKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGhpZGVSZXN1bHRJdGVtKGl0ZW0pIHsKICAgICAgICAgICAgaWYgKGl0ZW0pIGl0ZW0uY2xhc3NMaXN0LmFkZCgnbm4tZ2VuLWNhbC1oaWRkZW4nKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNob3dSZXN1bHRJdGVtKGl0ZW0pIHsKICAgICAgICAgICAgaWYgKGl0ZW0pIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnbm4tZ2VuLWNhbC1oaWRkZW4nKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNob3dFcnJvcihtZXNzYWdlKSB7CiAgICAgICAgICAgIGVycm9yTXNnLnRleHRDb250ZW50ID0gbWVzc2FnZTsKICAgICAgICAgICAgZXJyb3JNc2cuY2xhc3NMaXN0LnJlbW92ZSgnbm4tZ2VuLWNhbC1oaWRkZW4nKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNsZWFyRXJyb3IoKSB7CiAgICAgICAgICAgIGVycm9yTXNnLnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgICAgIGVycm9yTXNnLmNsYXNzTGlzdC5hZGQoJ25uLWdlbi1jYWwtaGlkZGVuJyk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBmb3JtYXRTY2llbnRpZmljKG51bSwgc2lnbmlmaWNhbnREaWdpdHMpIHsKICAgICAgICAgICAgaWYgKG51bSA9PT0gMCkgcmV0dXJuICcwJzsKICAgICAgICAgICAgaWYgKGlzTmFOKG51bSkgfHwgIWlzRmluaXRlKG51bSkpIHJldHVybiAn4oCUJzsKICAgICAgICAgICAgc2lnbmlmaWNhbnREaWdpdHMgPSBzaWduaWZpY2FudERpZ2l0cyB8fCAzOwogICAgICAgICAgICB2YXIgZXhwb25lbnQgPSBNYXRoLmZsb29yKE1hdGgubG9nMTAoTWF0aC5hYnMobnVtKSkpOwogICAgICAgICAgICB2YXIgbWFudGlzc2EgPSBudW0gLyBNYXRoLnBvdygxMCwgZXhwb25lbnQpOwogICAgICAgICAgICBtYW50aXNzYSA9IHBhcnNlRmxvYXQobWFudGlzc2EudG9QcmVjaXNpb24oc2lnbmlmaWNhbnREaWdpdHMpKTsKICAgICAgICAgICAgaWYgKGV4cG9uZW50ID09PSAwKSByZXR1cm4gbWFudGlzc2EudG9TdHJpbmcoKTsKICAgICAgICAgICAgaWYgKGV4cG9uZW50ID4gLTMgJiYgZXhwb25lbnQgPCA1KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChudW0udG9QcmVjaXNpb24oc2lnbmlmaWNhbnREaWdpdHMgKyAxKSkudG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbWFudGlzc2EudG9TdHJpbmcoKSArICcgw5cgMTAnICsgc3VwZXJzY3JpcHQoZXhwb25lbnQpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gc3VwZXJzY3JpcHQobikgewogICAgICAgICAgICB2YXIgc3VwZXJzY3JpcHRzID0geyAnMCc6ICfigbAnLCAnMSc6ICfCuScsICcyJzogJ8KyJywgJzMnOiAnwrMnLCAnNCc6ICfigbQnLCAnNSc6ICfigbUnLCAnNic6ICfigbYnLCAnNyc6ICfigbcnLCAnOCc6ICfigbgnLCAnOSc6ICfigbknLCAnLSc6ICfigbsnIH07CiAgICAgICAgICAgIHZhciBzdHIgPSBuLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnJzsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzdXBlcnNjcmlwdHNbc3RyLmNoYXJBdChpKV0gfHwgc3RyLmNoYXJBdChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZm9ybWF0RGVjaW1hbChudW0sIGRlY2ltYWxzKSB7CiAgICAgICAgICAgIGlmIChpc05hTihudW0pIHx8ICFpc0Zpbml0ZShudW0pKSByZXR1cm4gJ+KAlCc7CiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KG51bS50b0ZpeGVkKGRlY2ltYWxzKSkudG9TdHJpbmcoKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZVBoVG9LYSgpIHsKICAgICAgICAgICAgY2xlYXJFcnJvcigpOwogICAgICAgICAgICB2YXIgcEggPSBwYXJzZUZsb2F0KGlucHV0UGgudmFsdWUpOwogICAgICAgICAgICB2YXIgQyA9IHBhcnNlRmxvYXQoaW5wdXRDcGgudmFsdWUpOwoKICAgICAgICAgICAgaWYgKGlzTmFOKHBIKSB8fCBpbnB1dFBoLnZhbHVlLnRyaW0oKSA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHNob3dFcnJvcign0JLQstC10LTQuNGC0LUg0LfQvdCw0YfQtdC90LjQtSBwSC4nKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNOYU4oQykgfHwgaW5wdXRDcGgudmFsdWUudHJpbSgpID09PSAnJykgewogICAgICAgICAgICAgICAgc2hvd0Vycm9yKCfQktCy0LXQtNC40YLQtSDQvNC+0LvRj9GA0L3Rg9GOINC60L7QvdGG0LXQvdGC0YDQsNGG0LjRjiBDLicpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwSCA8IC0xIHx8IHBIID4gMTUpIHsKICAgICAgICAgICAgICAgIHNob3dFcnJvcigncEgg0LTQvtC70LbQtdC9INCx0YvRgtGMINCyINC00LjQsNC/0LDQt9C+0L3QtSDQvtGCIOKIkjEg0LTQviAxNS4nKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQyA8PSAwKSB7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9Ca0L7QvdGG0LXQvdGC0YDQsNGG0LjRjyBDINC00L7Qu9C20L3QsCDQsdGL0YLRjCDQv9C+0LvQvtC20LjRgtC10LvRjNC90YvQvCDRh9C40YHQu9C+0LwuJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEMgPiAxMDApIHsKICAgICAgICAgICAgICAgIHNob3dFcnJvcign0JrQvtC90YbQtdC90YLRgNCw0YbQuNGPIEMg0L3QtSDQtNC+0LvQttC90LAg0L/RgNC10LLRi9GI0LDRgtGMIDEwMCDQvNC+0LvRjC/QuyAo0YTQuNC30LjRh9C10YHQutC4INC90LXRgNC10LDQu9C40YHRgtC40YfQvdC+INC00LvRjyDQstC+0LTQvdGL0YUg0YDQsNGB0YLQstC+0YDQvtCyKS4nKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGhQbHVzID0gTWF0aC5wb3coMTAsIC1wSCk7CiAgICAgICAgICAgIGlmIChoUGx1cyA+PSBDIC0gMWUtMTUpIHsKICAgICAgICAgICAgICAgIHNob3dFcnJvcign0JrQvtC90YbQtdC90YLRgNCw0YbQuNGPIFtI4oG6XSAoJyArIGZvcm1hdFNjaWVudGlmaWMoaFBsdXMsIDMpICsgJyDQvNC+0LvRjC/Quykg0L/RgNC10LLRi9GI0LDQtdGCINC40LvQuCDRgNCw0LLQvdCwINC+0LHRidC10Lkg0LrQvtC90YbQtdC90YLRgNCw0YbQuNC4INC60LjRgdC70L7RgtGLIEMgKCcgKyBmb3JtYXREZWNpbWFsKEMsIDYpICsgJyDQvNC+0LvRjC/QuykuINCf0YDQvtCy0LXRgNGM0YLQtSDQstCy0LXQtNGR0L3QvdGL0LUg0LTQsNC90L3Ri9C1IOKAlCDRgtCw0LrQsNGPINGB0LjRgtGD0LDRhtC40Y8g0L3QtdCy0L7Qt9C80L7QttC90LAg0LTQu9GPINGB0LvQsNCx0L7QuSDQutC40YHQu9C+0YLRiy4nKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIEthID0gKGhQbHVzICogaFBsdXMpIC8gKEMgLSBoUGx1cyk7CiAgICAgICAgICAgIHZhciBwS2EgPSAtTWF0aC5sb2cxMChLYSk7CiAgICAgICAgICAgIHZhciBhbHBoYSA9IChoUGx1cyAvIEMpICogMTAwOwoKICAgICAgICAgICAgc2hvd0FsbFJlc3VsdEl0ZW1zKCk7CiAgICAgICAgICAgIGhpZGVSZXN1bHRJdGVtKHJpUGgpOwoKICAgICAgICAgICAgdmFsS2EudGV4dENvbnRlbnQgPSBmb3JtYXRTY2llbnRpZmljKEthLCAzKTsKICAgICAgICAgICAgdmFsUGthLnRleHRDb250ZW50ID0gZm9ybWF0RGVjaW1hbChwS2EsIDIpOwogICAgICAgICAgICB2YWxIcGx1cy50ZXh0Q29udGVudCA9IGZvcm1hdFNjaWVudGlmaWMoaFBsdXMsIDMpOwogICAgICAgICAgICB2YWxBbHBoYS50ZXh0Q29udGVudCA9IGZvcm1hdERlY2ltYWwoYWxwaGEsIDIpOwogICAgICAgICAgICB2YWxQaC50ZXh0Q29udGVudCA9IGZvcm1hdERlY2ltYWwocEgsIDIpOwogICAgICAgICAgICBzaG93UmVzdWx0SXRlbShyaVBoKTsKICAgICAgICAgICAgdmFsTW9kZURlc2MudGV4dENvbnRlbnQgPSAncEgg0LggQyDihpIgS+KCkCc7CgogICAgICAgICAgICBpZiAoYWxwaGEgPiAxNSkgewogICAgICAgICAgICAgICAgc2hvd0Vycm9yKCfQn9GA0LXQtNGD0L/RgNC10LbQtNC10L3QuNC1OiDRgdGC0LXQv9C10L3RjCDQtNC40YHRgdC+0YbQuNCw0YbQuNC4IM6xID4gMTUlLiDQmtC40YHQu9C+0YLQsCDQtNC+0LLQvtC70YzQvdC+INGB0LjQu9GM0L3QsNGPLCDQv9GA0LjQsdC70LjQttC10L3QuNC1INGB0LvQsNCx0L7QuSDQutC40YHQu9C+0YLRiyDQvdCwINCz0YDQsNC90LjRhtC1INC/0YDQuNC80LXQvdC40LzQvtGB0YLQuC4g0KDQtdC30YPQu9GM0YLQsNGCINC+0YDQuNC10L3RgtC40YDQvtCy0L7Rh9C90YvQuS4nKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gY2FsY3VsYXRlS2FUb1BoKCkgewogICAgICAgICAgICBjbGVhckVycm9yKCk7CiAgICAgICAgICAgIHZhciBLYSA9IHBhcnNlRmxvYXQoaW5wdXRLYVBoLnZhbHVlKTsKICAgICAgICAgICAgdmFyIEMgPSBwYXJzZUZsb2F0KGlucHV0Q2thLnZhbHVlKTsKCiAgICAgICAgICAgIGlmIChpc05hTihLYSkgfHwgaW5wdXRLYVBoLnZhbHVlLnRyaW0oKSA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHNob3dFcnJvcign0JLQstC10LTQuNGC0LUg0LrQvtC90YHRgtCw0L3RgtGDINC60LjRgdC70L7RgtC90L7RgdGC0LggS+KCkC4nKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNOYU4oQykgfHwgaW5wdXRDa2EudmFsdWUudHJpbSgpID09PSAnJykgewogICAgICAgICAgICAgICAgc2hvd0Vycm9yKCfQktCy0LXQtNC40YLQtSDQvNC+0LvRj9GA0L3Rg9GOINC60L7QvdGG0LXQvdGC0YDQsNGG0LjRjiBDLicpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChLYSA8PSAwKSB7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9Ca0L7QvdGB0YLQsNC90YLQsCDQutC40YHQu9C+0YLQvdC+0YHRgtC4IEvigpAg0LTQvtC70LbQvdCwINCx0YvRgtGMINC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3Ri9C8INGH0LjRgdC70L7QvC4nKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoS2EgPiAxZTEwKSB7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9Ch0YLQvtC70Ywg0LHQvtC70YzRiNC+0LUg0LfQvdCw0YfQtdC90LjQtSBL4oKQINGF0LDRgNCw0LrRgtC10YDQvdC+INC00LvRjyDRgdC40LvRjNC90YvRhSDQutC40YHQu9C+0YIuINCY0YHQv9C+0LvRjNC30YPQudGC0LUg0YTQvtGA0LzRg9C70Ysg0LTQu9GPINGB0LjQu9GM0L3Ri9GFINGN0LvQtdC60YLRgNC+0LvQuNGC0L7Qsi4nKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQyA8PSAwKSB7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9Ca0L7QvdGG0LXQvdGC0YDQsNGG0LjRjyBDINC00L7Qu9C20L3QsCDQsdGL0YLRjCDQv9C+0LvQvtC20LjRgtC10LvRjNC90YvQvCDRh9C40YHQu9C+0LwuJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEMgPiAxMDApIHsKICAgICAgICAgICAgICAgIHNob3dFcnJvcign0JrQvtC90YbQtdC90YLRgNCw0YbQuNGPIEMg0L3QtSDQtNC+0LvQttC90LAg0L/RgNC10LLRi9GI0LDRgtGMIDEwMCDQvNC+0LvRjC/Quy4nKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGRpc2NyaW1pbmFudCA9IEthICogS2EgKyA0ICogS2EgKiBDOwogICAgICAgICAgICB2YXIgaFBsdXMgPSAoLUthICsgTWF0aC5zcXJ0KGRpc2NyaW1pbmFudCkpIC8gMjsKCiAgICAgICAgICAgIGlmIChoUGx1cyA8PSAwIHx8IGhQbHVzID4gQyArIDFlLTEyKSB7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9Ce0YjQuNCx0LrQsCDQstGL0YfQuNGB0LvQtdC90LjRjyBbSOKBul0uINCf0YDQvtCy0LXRgNGM0YLQtSDQstGF0L7QtNC90YvQtSDQtNCw0L3QvdGL0LUuJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGhQbHVzID4gQykgaFBsdXMgPSBDOwoKICAgICAgICAgICAgdmFyIHBIID0gLU1hdGgubG9nMTAoaFBsdXMpOwogICAgICAgICAgICB2YXIgcEthID0gLU1hdGgubG9nMTAoS2EpOwogICAgICAgICAgICB2YXIgYWxwaGEgPSAoaFBsdXMgLyBDKSAqIDEwMDsKCiAgICAgICAgICAgIHNob3dBbGxSZXN1bHRJdGVtcygpOwogICAgICAgICAgICBoaWRlUmVzdWx0SXRlbShyaUthKTsKCiAgICAgICAgICAgIHZhbFBoLnRleHRDb250ZW50ID0gZm9ybWF0RGVjaW1hbChwSCwgMik7CiAgICAgICAgICAgIHZhbFBrYS50ZXh0Q29udGVudCA9IGZvcm1hdERlY2ltYWwocEthLCAyKTsKICAgICAgICAgICAgdmFsSHBsdXMudGV4dENvbnRlbnQgPSBmb3JtYXRTY2llbnRpZmljKGhQbHVzLCAzKTsKICAgICAgICAgICAgdmFsQWxwaGEudGV4dENvbnRlbnQgPSBmb3JtYXREZWNpbWFsKGFscGhhLCAyKTsKICAgICAgICAgICAgdmFsS2EudGV4dENvbnRlbnQgPSBmb3JtYXRTY2llbnRpZmljKEthLCAzKTsKICAgICAgICAgICAgc2hvd1Jlc3VsdEl0ZW0ocmlLYSk7CiAgICAgICAgICAgIHZhbE1vZGVEZXNjLnRleHRDb250ZW50ID0gJ0vigpAg0LggQyDihpIgcEgnOwoKICAgICAgICAgICAgaWYgKGFscGhhID4gMTUpIHsKICAgICAgICAgICAgICAgIHNob3dFcnJvcign0J/RgNC10LTRg9C/0YDQtdC20LTQtdC90LjQtTog0YHRgtC10L/QtdC90Ywg0LTQuNGB0YHQvtGG0LjQsNGG0LjQuCDOsSA+IDE1JS4g0J/RgNC40LHQu9C40LbQtdC90LjQtSDRgdC70LDQsdC+0Lkg0LrQuNGB0LvQvtGC0Ysg0L3QsCDQs9GA0LDQvdC40YbQtSDQv9GA0LjQvNC10L3QuNC80L7RgdGC0LguJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZUthVG9Qa2EoKSB7CiAgICAgICAgICAgIGNsZWFyRXJyb3IoKTsKICAgICAgICAgICAgdmFyIEthID0gcGFyc2VGbG9hdChpbnB1dEthUGthLnZhbHVlKTsKCiAgICAgICAgICAgIGlmIChpc05hTihLYSkgfHwgaW5wdXRLYVBrYS52YWx1ZS50cmltKCkgPT09ICcnKSB7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9CS0LLQtdC00LjRgtC1INC60L7QvdGB0YLQsNC90YLRgyDQutC40YHQu9C+0YLQvdC+0YHRgtC4IEvigpAuJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEthIDw9IDApIHsKICAgICAgICAgICAgICAgIHNob3dFcnJvcign0JrQvtC90YHRgtCw0L3RgtCwINC60LjRgdC70L7RgtC90L7RgdGC0LggS+KCkCDQtNC+0LvQttC90LAg0LHRi9GC0Ywg0L/QvtC70L7QttC40YLQtdC70YzQvdGL0Lwg0YfQuNGB0LvQvtC8LicpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcEthID0gLU1hdGgubG9nMTAoS2EpOwoKICAgICAgICAgICAgaGlkZVJlc3VsdEl0ZW0ocmlQaCk7CiAgICAgICAgICAgIGhpZGVSZXN1bHRJdGVtKHJpSHBsdXMpOwogICAgICAgICAgICBoaWRlUmVzdWx0SXRlbShyaUFscGhhKTsKICAgICAgICAgICAgc2hvd1Jlc3VsdEl0ZW0ocmlLYSk7CiAgICAgICAgICAgIHNob3dSZXN1bHRJdGVtKHJpUGthKTsKCiAgICAgICAgICAgIHZhbEthLnRleHRDb250ZW50ID0gZm9ybWF0U2NpZW50aWZpYyhLYSwgNCk7CiAgICAgICAgICAgIHZhbFBrYS50ZXh0Q29udGVudCA9IGZvcm1hdERlY2ltYWwocEthLCAyKTsKICAgICAgICAgICAgdmFsUGgudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICAgICAgdmFsSHBsdXMudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICAgICAgdmFsQWxwaGEudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICAgICAgdmFsTW9kZURlc2MudGV4dENvbnRlbnQgPSAnS+KCkCDihpIgcEvigpAnOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gY2FsY3VsYXRlUGthVG9LYSgpIHsKICAgICAgICAgICAgY2xlYXJFcnJvcigpOwogICAgICAgICAgICB2YXIgcEthID0gcGFyc2VGbG9hdChpbnB1dFBrYS52YWx1ZSk7CgogICAgICAgICAgICBpZiAoaXNOYU4ocEthKSB8fCBpbnB1dFBrYS52YWx1ZS50cmltKCkgPT09ICcnKSB7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9CS0LLQtdC00LjRgtC1INC/0L7QutCw0LfQsNGC0LXQu9GMIHBL4oKQLicpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgS2EgPSBNYXRoLnBvdygxMCwgLXBLYSk7CgogICAgICAgICAgICBpZiAoS2EgPD0gMCB8fCAhaXNGaW5pdGUoS2EpKSB7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9Cd0LXQutC+0YDRgNC10LrRgtC90L7QtSDQt9C90LDRh9C10L3QuNC1IHBL4oKQIOKAlCDRgNC10LfRg9C70YzRgtCw0YIg0LLRi9GF0L7QtNC40YIg0LfQsCDQv9GA0LXQtNC10LvRiyDRgtC+0YfQvdC+0YHRgtC4INCy0YvRh9C40YHQu9C10L3QuNC5LicpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBoaWRlUmVzdWx0SXRlbShyaVBoKTsKICAgICAgICAgICAgaGlkZVJlc3VsdEl0ZW0ocmlIcGx1cyk7CiAgICAgICAgICAgIGhpZGVSZXN1bHRJdGVtKHJpQWxwaGEpOwogICAgICAgICAgICBzaG93UmVzdWx0SXRlbShyaUthKTsKICAgICAgICAgICAgc2hvd1Jlc3VsdEl0ZW0ocmlQa2EpOwoKICAgICAgICAgICAgdmFsS2EudGV4dENvbnRlbnQgPSBmb3JtYXRTY2llbnRpZmljKEthLCA0KTsKICAgICAgICAgICAgdmFsUGthLnRleHRDb250ZW50ID0gZm9ybWF0RGVjaW1hbChwS2EsIDIpOwogICAgICAgICAgICB2YWxQaC50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICB2YWxIcGx1cy50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICB2YWxBbHBoYS50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICB2YWxNb2RlRGVzYy50ZXh0Q29udGVudCA9ICdwS+KCkCDihpIgS+KCkCc7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjYWxjdWxhdGUoKSB7CiAgICAgICAgICAgIHZhciBtb2RlID0gZ2V0Q3VycmVudE1vZGUoKTsKICAgICAgICAgICAgcmVzZXRSZXN1bHRzKCk7CiAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgewogICAgICAgICAgICAgICAgY2FzZSAncGgtdG8ta2EnOgogICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVBoVG9LYSgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAna2EtdG8tcGgnOgogICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUthVG9QaCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAna2EtdG8tcGthJzoKICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVLYVRvUGthKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdwa2EtdG8ta2EnOgogICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVBrYVRvS2EoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlUGhUb0thKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJlc2V0KCkgewogICAgICAgICAgICBjbGVhckFsbElucHV0cygpOwogICAgICAgICAgICByZXNldFJlc3VsdHMoKTsKICAgICAgICAgICAgY2xlYXJFcnJvcigpOwogICAgICAgICAgICB2YXIgbW9kZSA9IGdldEN1cnJlbnRNb2RlKCk7CiAgICAgICAgICAgIHNob3dGaWVsZEdyb3VwKG1vZGUpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gb25Nb2RlQ2hhbmdlKCkgewogICAgICAgICAgICBjbGVhckFsbElucHV0cygpOwogICAgICAgICAgICByZXNldFJlc3VsdHMoKTsKICAgICAgICAgICAgY2xlYXJFcnJvcigpOwogICAgICAgICAgICB2YXIgbW9kZSA9IGdldEN1cnJlbnRNb2RlKCk7CiAgICAgICAgICAgIHNob3dGaWVsZEdyb3VwKG1vZGUpOwogICAgICAgIH0KCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlUmFkaW9zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIG1vZGVSYWRpb3NbaV0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25Nb2RlQ2hhbmdlKTsKICAgICAgICB9CgogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG4tY2FsY3VsYXRlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjYWxjdWxhdGUpOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG4tcmVzZXQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlc2V0KTsKCiAgICAgICAgc2hvd0ZpZWxkR3JvdXAoZ2V0Q3VycmVudE1vZGUoKSk7CiAgICB9KSgpOwo=