from pathlib import Path
import shutil
R=Path('/mnt/data/work4110/site');E=R/'доказательства/редакция-4.11.0';p=R/'ресурсы/сценарии/доказательный-контур.js';shutil.copyfile(p,E/'ядро-4.10.0-до-изменения.js.txt');s=p.read_text()
old="""        const token=JSON.stringify(v);yield token===undefined&&array?'null':token??'';return;"""
new="""        // Большой безопасный фрагмент уже является строкой источника: кавычки
        // выдаются отдельно, без полной копии JSON.stringify. Экранируемые
        // символы и суррогаты по-прежнему обрабатывает штатный JSON.stringify.
        if(typeof v==='string'&&v.length>=65536&&!/[\\u0000-\\u001f\"\\\\\\ud800-\\udfff]/.test(v)){
          yield '\"';yield v;yield '\"';return;
        }
        const token=JSON.stringify(v);yield token===undefined&&array?'null':token??'';return;"""
assert old in s;s=s.replace(old,new)
old="""    for(const token of canonicalTokens(value)){pending.push(token);size+=token.length;if(size>=65536){chunks.push(pending.join(''));pending=[];size=0;}}"""
new="""    for(const token of canonicalTokens(value)){
      // Не присоединять крупный неизменённый фрагмент к маленькому пакету:
      // это создаёт ещё одну его копию до окончательного соединения.
      if(token.length>=65536){if(pending.length){chunks.push(pending.join(''));pending=[];size=0;}chunks.push(token);continue;}
      pending.push(token);size+=token.length;if(size>=65536){chunks.push(pending.join(''));pending=[];size=0;}
    }"""
assert old in s;s=s.replace(old,new);p.write_text(s)
print('patched canonical tokenization only')
