Интерактивная SVG картограмма с помощью d3.jstutorial

Jun 02, 2013 14:18


Сегодня я расскажу вам как сделать интерактивную SVG картограмму при помощи d3js.org, о возможностях этой JavaScript библиотеки в общем, а также придётся немного разобраться в том как и где лучше хранить геоинформацию для веба. В финале мы получим следующее:



Начать сие увлекательное путешествие можно под катом.

Дела картографические.


В принципе, этот раздел можно пропустить, если не интересно, ссылка на нужный файл в самом конце раздела. Кому интересно, разбираемся дальше. Что такое карта, по сути это информация о геометрии некоего объекта с привязкой к координатам. В GIS системах для этих целей обычно используют shapefile'ы. Мы будем рисовать карту России, скорее всего поиск приведёт вас туда же куда и меня, а именно на GIS-Lab. Я выбрал проекцию Albers-Siberia. Скачиваем. Первым делом нам нужно преобразовать наш shapefile по стандарту WGS 84 (оно же EPSG:4326). Для этого необходимо создать файл проекции, например Albers_Siberia.prj со следующим содержимым :

+proj=aea +lat_1=52 +lat_2=64 +lat_0=0 +lon_0=105 +x_0=18500000 +y_0=0 +ellps=krass +units=m +towgs84=28,-130,-95,0,0,0,0 +no_defs

Затем при помощи GDAL, а точнее одной из его библиотек OGR выполним преобразование. Я для этих нужд скачал Quantum GIS, который уже содержит всё что нужно и даже больше. После установки у вас появится несколько ярлыков, ищем среди них OSGeo4W, жмакаем, переходим в каталог с нашими файлами и вводим команду следующего вида:

ogr2ogr -f 'ESRI Shapefile' -s_srs Albers_Siberia.prj -t_srs EPSG:4326 input-fixed.shp input.shp

Таким образом мы получили нужный нам shapefile, хотя как нужный, для веба он нам совсем не подходит, поэтому теперь сгенерируем GeoJSON файл на основе наших данных. Затем из GeoJSON'а сгенерируем TopoJSON, который-то и нужен для нашей картограммы. Такие вот дела, но вы не расстраивайтесь, GeoJSON- штука тож полезная, авось пригодится. Итак, идём опять в консоль и пишем примерно следующее:

ogr2ogr -f GeoJSON output.json input.shp

Получаем наш GeoJSON файл, открываем его и видим сюрприз от GIS-Lab.

Шифровка от GIS-Lab
Вообще говоря, эта фича присутствует в shapefile изначально, но заметил я этот «приятный» сюрприз только на этом этапе. Фича в том, что все названия регионов зашифрованы от врагов Родины и отображаются крякозябрами. Но наш то человек знает где искать шифровальную книгу. Но не тут-то было. Ни одна кириллическая кодировка не подошла (на DOS-866 были осмысленные названия, но часть букв отображались различными квадратиками), тут я призадумался и пошёл искать истину в интернете, может искал я плохо, но на форумах GIS-Lab, да и в других местах ничего по поводу кракозябр на этой карте не было вообще (а карта от 2010 года, как я понимаю) тут я совсем отчаялся, открыл снова EditPad (там, по-моему, больше всего кодировок представлено, да и вообще он весьма удобен для работы с текстом и регулярками) и начал перебирать все кодировки подряд, и, о чудо, при выборе кодировки MIK: Bulgarian (!?) получил почти что хотел, а именно названия регионов. Правда все буквы в названиях были разделены досовским символом ├, ну простенькая регулярка решила эту проблему довольно быстро. Хотя почему проблему, это ведь шифр и мы прошли проверку свой-чужой =). Да кстати есть у этого файла ещё одна фича, о которой правда сразу упоминают на GIS-Lab, а именно: на карте отсутствуют границы Чеченской и Ингушской республик, по причине отсутствия по ним данных Росреестра (ну не хотят они туда в командировку ехать, и всё тут). Ну да в принципе не страшно (хотя кому конечно), но неприятный осадочек остался.
Теперь перейдём к генерации TopoJSON, это позволит нам уменьшить размер файла. Вообще TopoJSON является оптимизацией GeoJSON'а в плане топологий, он убирает избыточную информацию, например убирает дублирование общих границ у соседних регионов. Но мы можем уменьшить размер файла ещё больше, упростив геометрию. Итак, приступим! Запускаем командную строку Node.js (он нужен для имплементации TopoJSON) и пишем следующее:

topojson -o output_topo.json -p -s 1e-7 -- name=input_geo.json

Здесь параметр -p отвечает за сохранение feature properties, а -s 1e-7 за упрощение геометрии, 1e-7 это порог в стерадианах чем меньше, тем точнее геометрия: 1e-3 это Швейцария относительно карты мира, а 1e-9 футбольное поле. Для чего это может быть нужно - если вы захотите сделать возможность зума на вашей карте. Разделитель -- это просто разделитель (ваш К.О.) выходного и входного файлов, а префикс russia задаёт имя объекта, если его не указывать, то в качестве имени будет использоваться имя входного файла, что не всегда удобно (может быть громоздким). В полученном файле я заменил названия регионов на коды в соответствии с ISO 3166-2:RU. Всё. Файл можно взять на GitHub.

Рисуем картограмму

Карту отрисовывать будем вообще или как?! Теперь у нас есть всё, что необходимо для отрисовки карты средствами d3.js. Скопируйте следующий шаблон и приступим:




Accidents on the Road - Choroplethtitle><br /> <script type="text/javascript" src="<a href="http://d3js.org/d3.v3.min.js" class="external">http://d3js.org/d3.v3.min.js</a>">script><br /> <script type="text/javascript" src="<a href="http://d3js.org/queue.v1.min.js" class="external">http://d3js.org/queue.v1.min.js</a>">script><br /> <script type="text/javascript" src="<a href="http://d3js.org/topojson.v0.min.js" class="external">http://d3js.org/topojson.v0.min.js</a>">script> <br /><br /> head><br /><style><br /> your awesome CSS <br />style><br /><body><br /> <h1>Cool Headerh1><br /> <script type="text/javascript"><br /> Your awesome d3.js code<br /> script><br />body><br />html> <br /><br /> Сначала зададим размеры нашей SVG карты. <br /><br /> var width = 960,<br /> height = 500; <br /><br /> Зададим домен цветов для картограммы, домен для легенды и подписи к легенде. <br /><br /> var color_domain = [50, 150, 350, 750, 1500]<br /> var ext_color_domain = [0, 50, 150, 350, 750, 1500]<br /> var legend_labels = ["< 50", "50+", "150+", "350+", "750+", "> 1500"] <br /> var color = d3.scale.threshold()<br /> .domain(color_domain)<br /> .range(["#adfcad", "#ffcb40", "#ffba00", "#ff7d73", "#ff4e40", "#ff1300"]); <br /><br /> Добавим в документ элемент и класс tooltip. <br /><br /> var div = d3.select("body").append("div") <br /> .attr("class", "tooltip") <br /> .style("opacity", 0); <br /><br /> Добавим SVG с атрибутами, задающими размер. <br /><br /> var svg = d3.select("body").append("svg")<br /> .attr("width", width)<br /> .attr("height", height); <br /><br /> Зададим параметры проецирования (вспоминаем/смотрим <a class="external" href="http://habrahabr.ru/post/181766/#prj_param">Albers_Siberia.prj</a> из начала статьи): <br /><br /> var projection = d3.geo.albers()<br /> .rotate([-105, 0])<br /> .center([-10, 65])<br /> .parallels([52, 64])<br /> .scale(700)<br /> .translate([width / 2, height / 2]); <br /><br /> var path = d3.geo.path().projection(projection); <br /><br /> Читаем данные. <br /><br /> queue()<br /> .defer(d3.json, "/d/5685937/russia_1e-7sr.json")<br /> .defer(d3.csv, "Accidents.csv")<br /> .await(ready); <br /><br /> Начинаем отрисовку. Создаем объекты для пар код региона: кол-во смертей и код региона: название региона. <br /><br /> function ready(error, map, data) {<br /> var rateById = {};<br /> var nameById = {}; <br /><br /> data.forEach(function(d) {<br /> rateById[d.RegionCode] = +d.Deaths;<br /> nameById[d.RegionCode] = d.RegionName;<br /> }); <br /><br /> Отрисовка и раскраска картограммы. <br /><br /> svg.append("g")<br /> .attr("class", "region")<br /> .selectAll("path")<br /> .data(topojson.object(map, map.objects.russia).geometries)<br /> //.data(topojson.feature(map, map.objects.russia).features) <-- in case topojson.v1.js<br /> .enter().append("path")<br /> .attr("d", path)<br /> .style("fill", function(d) {<br /> return color(rateById[d.properties.region]); <br /> })<br /> .style("opacity", 0.8) <br /><br /> Обрабатываем события: меняем яркость региона (для подсветки) и выводим в tooltip'е название региона и точное численное значение. <br /><br /> .on("mouseover", function(d) {<br /> d3.select(this).transition().duration(300).style("opacity", 1);<br /> div.transition().duration(300)<br /> .style("opacity", 1)<br /> div.text(nameById[d.properties.region] + " : " + rateById[d.properties.region])<br /> .style("left", (d3.event.pageX) + "px")<br /> .style("top", (d3.event.pageY -30) + "px");<br /> })<br /> .on("mouseout", function() {<br /> d3.select(this)<br /> .transition().duration(300)<br /> .style("opacity", 0.8);<br /> div.transition().duration(300)<br /> .style("opacity", 0);<br /> }) <br /><br /> Теперь хотелось бы научиться добавлять чего-нибудь на эту самую карту, я решил добавить города-милионники России, для этого нам собственно нужен сам город и его координаты (широта и долгота в десятичных градусах), к сожалению найти геокодер вроде этого <a class="external" href="http://www.gpsvisualizer.com/geocoder/">gpsvisualizer.com/geocoder</a>, чтобы он понимал русский язык- я не смог (может кто знает?), а лезть в API Яндекс.Карт не хотелось, тем более что список маленький. Хорошо бы они сами колдунчик такой сделали, ну да ладно, отвлекся я. В итоге получили список следующего вида: <br /><br /> City lat lon<br />Москва 55.7522200 37.6155600<br />Санкт-Петербург 59.8944400 30.2641700 <br /><br /> Ну собственно и добавим их, группой: точка-подпись. <br /><br /> d3.tsv("cities.tsv", function(error, data) {<br /> var city = svg.selectAll("g.city")<br /> .data(data)<br /> .enter()<br /> .append("g")<br /> .attr("class", "city")<br /> .attr("transform", function(d) { return "translate(" + projection([d.lon, d.lat]) + ")"; }); <br /><br /> city.append("circle")<br /> .attr("r", 3)<br /> .style("fill", "lime")<br /> .style("opacity", 0.75); <br /><br /> city.append("text")<br /> .attr("x", 5)<br /> .text(function(d) { return d.City; });<br /> });<br /> }; <br /><br /> Тут хотелось бы добавить, что вместо точек можно добавить, например, круговую/кольцевую диаграмму, увеличив тем самым информационную нагрузку на нашу картограмму. Вообще возможностей масса, всё ограничивается вашими задачами, воображением и целесообразностью с точки зрения UI/UX. <br /><br /> Ну и под конец добавим легенду нашей картограмме: <br /><br /> var legend = svg.selectAll("g.legend")<br /> .data(ext_color_domain)<br /> .enter().append("g")<br /> .attr("class", "legend"); <br /><br /> var ls_w = 20, ls_h = 20; <br /><br /> legend.append("rect")<br /> .attr("x", 20)<br /> .attr("y", function(d, i){ return height - (i*ls_h) - 2*ls_h;})<br /> .attr("width", ls_w)<br /> .attr("height", ls_h)<br /> .style("fill", function(d, i) { return color(d); })<br /> .style("opacity", 0.8); <br /><br /> legend.append("text")<br /> .attr("x", 50)<br /> .attr("y", function(d, i){ return height - (i*ls_h) - ls_h - 4;})<br /> .text(function(d, i){ return legend_labels[i]; }); <br /><br /> Вот в принципе и всё, я старался показать основные моменты на простом примере, надеюсь что мне это удалось. Код конечно не идеален (идеального ничего не бывает), но цель, повторюсь, была сделать его понятным, а не супер универсальным/эффективным. Исходники можно найти на <a class="external" href="https://gist.github.com/KoGor/5685876">GitHub</a>, а пощупать результат можно через сервис <a class="external" href="http://bl.ocks.org/KoGor/5685876">bl.ocks.org</a>. Да, CSS мы тут не рассматривали, но там всё тривиально. <br /><br /> Итоги. Что дальше? <br /><br /> Ну вот мы и создали простенькую картограмму, без возможности приближения, сложной анимации и прочих наворотов, но при желании добавить их сюда не составит большого труда. Вообще данная библиотека имеет широчайшие возможности для визуализации всего и вся: графики, диаграммы, картограммы, деревья, графы, чарты, тепловые карты…. Такой вот DataViz комбайн, всё что нужно можно найти через сайт <a class="external" href="http://d3js.org/">d3js.org</a>. Mike Bostock активно развивает проект, почти каждый день выкладывает новые примеры (один минус, почти все без комментариев), на <a class="external" href="http://stackoverflow.com/questions/tagged/d3.js">stackoverflow</a> тоже много чего и отвечают там оперативно, в том числе и сам Майк. Так что дерзайте, имхо эта библиотека, являющаяся по сути основным инструментом визуализации за бугром, у нас несправедливо обделена вниманием. Ну и я, если это будет интересно хабросообществу, буду периодически разбирать интересные примеры. Собственно всё, комментарии, вопросы и предложения приветствуются. <br /><br /> P.S. Чуть не забыл самое главное, будьте осторожнее на дорогах, особенно если вы не с Чукотки, уродов всяких у нас хватает и масса видео с регистраторов тому подтверждение! А вообще это печально, почти 28 тысяч смертей за год, ужас просто (данные брал с офф. сайта ГИБДД). </div> <p class="item-tags"> <a href="http://m.livejournal.com/read/user/topof/tag/ГИС">ГИС</a> </p> </div> <div class= " ljsale ljsale--empty " lj0sale="adfox_mobile_content_1" ></div> <div class="b-more-button"> <a class="b-more-button-inner" href="/login?back_uri=http://m.livejournal.com/read/user/topof/440027/comments/reply#comments">Leave a comment</a></p> </div> </div> </div> <div class="paging"> <table cellspacing="0" cellpadding="0"> <tbody> <tr> <td class="paging-prev"> <a href="http://m.livejournal.com/read/user/topof/439777">Previous post</a> </td> <td class="paging-next"> <a href="http://m.livejournal.com/read/user/topof/440159">Next post</a> </td> </tr> </tbody> </table> </div> <div class="to-top"> <a href="#to-top"> Up </a> </div> <div class="footer"> <div class= " ljsale ljsale--empty " lj0sale="adfox_mobile_footer" ></div> <div class="footer-content"> <table class="footer-layout"> <tr> <td> <a class="footer-menu-item footer-menu-index" href="//m.livejournal.com/"> <span class="footer-menu-item-title">Homepage</span> </a> </td> <td> <a class="footer-menu-item footer-menu-read" href="//m.livejournal.com/read"> <span class="footer-menu-item-title">Read journal...</span> </a> </td> <td> <a class="footer-menu-item footer-menu-full" href="https://topof.livejournal.com/440027.html?fullversion=yes"> <span class="footer-menu-item-title">Full version</span> </a> </td> <td> <a class="footer-menu-item footer-menu-help" href="//m.livejournal.com/help"> <span class="footer-menu-item-title">Help</span> </a> </td> <td> <a class="footer-menu-item footer-menu-eng" href="//www.livejournal.com/tools/setlang.bml?lang=ru&returnto=//m.livejournal.com/read/user/topof/440027"> <span class="footer-menu-item-title">Русская версия</span> </a> </td> </tr> </table> <link rel="stylesheet" type="text/css" href="https://l-stat.livejournal.net/??lj_base.css,flatbutton.css,mobile/default/s.css,msgsystem.css?v=1734597428" > <!--[if lte IE 8]><link rel="stylesheet" type="text/css" href="https://l-stat.livejournal.net/??ie.css?v=1734597428" ><![endif]--> <link rel="stylesheet" type="text/css" href="https://l-stat.livejournal.net/??proximanova-opentype.css?v=1734597428" > <script type="text/javascript"> Site = window.Site || {}; Site.ml_text = {"/userinfo.bml.editalias.title":"Edit Note","like_reaction.pigeon.caption":"Strange things","common.edit":"Edit","notif_center.birthday":"Today is <strong>[[display_name]]</strong>'s birthday!","common.back":"Back","medius.asapnews.breakingnews":"Срочная новость","components.report_modal.description.alco":"Information containing offers of remote retail sale of alcoholic products whose retail sale is either forbidden or restricted by law.","popup.cookies.submit":"OK","common.save":"Save","adfox.noads":"Tired of ads? Upgrade to account with Professional package of service and never see ads again!","common.delete":"Delete","components.report_modal.description.involving_minors":"Information aimed at involving minors in illegal activity dangerous for their life and(or) health.","popup.cookies.conditionsLink":"conditions","notif_center.trending_now_custom_url":"Trending now: <a href=\"#\">[[subject]]</a>","sharing.popup.title":"Share","common.are_you_sure":"Are you sure?","sharing.service.facebook":"Facebook","components.report_modal.description.suicide":"Calls for suicide or self-harm, demonstration of suicide.","component.messages.close":"Close","dialogs.no":"Cancel","sharing.service.twitter":"X","notif_center.promo_feed":"Check out <a href=\"#\">new interesting posts</a> for your personal feed!","pushWooshPopup21.description":"Enable browser push notifications about new entries","recurrentreminder.password.updated.last":"updated password <strong>more than [[time]] ago</strong>","notif_center.new_friend_achievement":"Your friend <strong>[[actor_displayname]]</strong> got a new achievement! <a href=\"#\">[[achievement_display]]</a>","fcklang.ljlike.button.whatsapp":"WhatsApp","lj.report.popover.message":"Thanks! Moderators will review your complaint","create.subscribe.proceed_btn.caption":"Proceed","modal.info_pro.title_notpaid":"Account without the \"Professional\" package","notif_center.like.comment.user_and_user":"<strong>[[actor0]]</strong> and <strong>[[actor1]]</strong> reacted to your <a href=\"#\">comment</a>","createaccount.subscribe.title":"Recommended authors","modal.info_pro.feature.item.notification":"Additional notification settings","notif_center.new_achievement":"<strong>New achievement!</strong> <a href=\"#\">[[achievement_display]]</a> [[achievement_description]]","recurrentreminder.email.message":"<span>Your account is linked to mail <strong>[[email]]</strong> Is this address still up to date?</span>","sitescheme.switchv3.confirm_dialog.no":"No, stay on the old one","notif_center.like.entry.plur":"<strong>[[actor]]</strong> and [[other_n]] [[?other_n|user|users|users]] reacted to <a href=\"#\">[[post_subject]]</a>","components.report_modal.too_many_complaints":"You've reached report limit per day","notif_center.poll.vote.plur":"<strong>[[actor]]</strong> and [[other_n]] [[?other_n|user|users|users]] voted in poll in your post <a href=\"#\">[[post_subject]]</a>","notif_center.trending_now.no_subj":"<a href=\"#\">New post</a> is trending now","dialogs.yes":"OK","modal.gift_token.buy":"Purchase LJ Tokens to gift","subscribe_button_2022.is_in_friend_list":"In friend list","notif_center.user_post.in_community":"User <strong>[[actor]]</strong> published a new entry <a href=\"#\">[[post_subject]]</a> to community <strong>[[comm_disp_name]]</strong></a>","components.report_modal.description.adult_content":"Explicit graphic content only intended for viewers aged 18 and up.","notif_center.dropdown.hide":"Unsubscribe","sharing.service.email":"E-mail","widget.recomended.partners.title":"Partner news","modal.emailreconfirm.button.cancel_short":"No","notif_center.social_connections.subscription":"<a href=\"#\">[[actor]]</a> subscribed to you","notif_center.repost":"<strong>[[actor]]</strong> reposted your entry <a href=\"#\">[[post_subject]]</a>","modal.emailreconfirm.button.cancel":"No, change","pushWooshPopup21.button.subscribe":"Yes, please","recurrentreminder.password.message":"<span>We noticed that you [[messageData]]. Increase the security of your account by setting a new one</span>","like_reaction.thumbs_up.caption":"Thumbs up","you_are_logged_in_hint.button.cancel":"Cancel","modal.emailreconfirm.button.accept_short":"Yes","/userinfo.bml.addalias.title":"Add Note","modal.info_pro.title":"An account with the active Professional service package","notif_center.comment.to_comment.anon":"Anonymous user replied to your comment for entry <a href='#'>[[post_subject]]</a>","notif_center.repost.plur":"<strong>[[actor]]</strong> and [[other_n]] [[?other_n|user|users|users]] reposted your entry <a href=\"#\">[[post_subject]]</a>","sharing.service.viber":"Viber","notif_center.continuous_series.start":"You wrote a post yesterday. That's a good start! Write a post today ([[date]]) to extend the uninterrupted series.","sharing.service.stumbleupon":"StumbleUpon","notif_center.pingback.entry.community":"<strong>[[actor]]</strong> mentioned your community [[community]] in entry <a href=\"#\">[[post_subject]]</a>","identity.system.message.title":"This account was created using a social network or other third-party service.<br />We recommend you to choose a LiveJournal login and set a password for your account so you don't need to rely on third-party services for login.<br />You can do this by following this <a id=\"identity-message\" target=\"_blank\" href=\"https://www.livejournal.com/identity/convert.bml\">link</a>","recurrentreminder.password.updated.months.ago":"[[amount]] months","like_reaction.detail_popup.button.close":"Close popup","like_reaction.detail_popup.all":"All [[count]]","components.report_modal.link.illegal":"What materials are forbidden in LiveJournal?","notif_center.dropdown.mark":"mark as read","recurrentreminder.password.button.update.password":"Yes, I want to update","modal.badge.verified.button.link":"https://www.livejournal.com/support/faq/442.html?ila_campaign=verified&ila_location=badge_modal","you_are_logged_in_hint.button.reboot":"Refresh","sharing.service.digg":"Digg","recurrentreminder.password.button.refuse":"No, I'm satisfied","like_reaction.ok_hand.caption":"OK","notif_center.read_all.label":"Mark all as read","modal.gift_token.button":"Send LJ Tokens","user_note_modal.title.edit":"Edit user note","notif_center.continuous_series":"You have been writing for [[days]] [[?days|day|days|days]] now. Write a post today ([[date]]) and extend the uninterrupted series!","components.report_modal.description.drugs":"Information on ways of producing, using, and places of purchasing of narcotic substances.","notif_center.post_suggest.recent_journal_upd":"There is a new post in journal which you've visited recently: <a href=\"#\">[[post_subject]]</a>","banner.native_install_prompt.ios.text":"Install LiveJournal app for IOS","notif_center.pingback.entry":"<strong>[[actor]]</strong> mentioned you in the entry <a href=\"#\">[[post_subject]]</a>","modal.gift_token.clue":"The commission will be [[commission]] [[?commission|token|tokens|tokens]], after you will have [[token]] [[?token|token|tokens|tokens]].","notif_center.draft":"You have an unpublished draft, continue working on your new entry","banner.native_install_prompt.android.text":"Install LiveJournal app for Android","modal.info_pro.feature.item.style":"Advanced style settings","banner.hashmob.favorite_cities.link":"https://www.livejournal.com/lyubimyye-goroda/?ila_campaign=lyubimyye_goroda&ila_location=banner","components.report_modal.description.fake":"Information containing calls for mass riots and(or) extremist activity that may endanger lives and(or) wellbeing of people, property, disruption of public order and(or) public safety.","modal.emailreconfirm.title":"Email confirmation","components.report_modal.link.other":"Other","notif_center.post_suggest":"This might be interesting for you: <a href=\"#\">[[post_subject]]</a>","modal.info_pro.feature.item.adv":"No ads","notif_center.like.comment":"<strong>[[actor]]</strong> reacted to your <a href=\"#\">comment</a>","modal.info_pro.feature.more":"And many other extra functions more!","subscribe_button_2022.subscribe_settings":"Manage subscription","common.close":"Close","sharing.service.odnoklassniki":"Odnoklassniki","notif_center.trending_now":"Trending now: <a href=\"#\">[[post_subject]]</a>","widget.alias.aliaschange":"Save note","sherry_promo_button.link":"https://sharrymania.ru/?utm_source=livejournal&utm_medium=special_project&utm_campaign=sharry&utm_content=branding_block_2","fcklang.ljlike.button.telegram":"Telegram","popup.cookies.description":"By continuing to use this website, you agree to the","components.report_modal.description.extremism":"Calls for unrest and terror, violence against people of a specific ethnicity, religion, or race.","modal.info_pro.feature.item.statistic":"Advanced statistics","createaccount.subscribe.to.feed":"To feed","notif_center.empty.label":"You don't have notifications","components.report_modal.description.insult_govsymbols":"Information that offends human dignity and public morale; explicit disrespect for society, state, official state symbols.","modal.gift_token.button.back":"Cancel","recurrentreminder.password.updated.years.ago":"[[amount]] [[?amount|year|years]]","recurrentreminder.password.title":"Your password might be out of date","components.report_modal.description.child_porn":"Materials with pornographic depiction of minors, or involvement of minors in entertainment activities of pornographic nature.","modal.info_pro.user":"is using an account with the active Professional service package","widget.alias.faq":"read <a [[aopts]]>FAQ</a> for details","like_reaction.sad.caption":"Sad","widget.alias.setalias":"Set note for","modal.emailreconfirm.confirmed":"Ок, thanks for checking the relevance of your data","you_are_logged_in_hint.hint_text_2":"You've signed in using another tab or window. Refresh this page","subscribe_button_2022.mutual_subscribe":"Mutual subscribe","userinfo.bml.hover_menu.headlinks.write_to_community":"Post to community","like_reaction.pencil.caption":"Keep writing!","like_reaction.facepalming.caption":"Facepalm","modal.emailreconfirm.button.accept":"Yes, this is my address","common.something_went_wrong":"Something went wrong","notif_center.repost.user_and_user":"<strong>[[actor0]]</strong> and <strong>[[actor1]]</strong> reposted your entry <a href=\"#\">[[post_subject]]</a>","subscribe_button_2022.you_are_owner":"You are owner","common.remove_from_friends":"Remove from friends","notif_center.pingback.comment":"<strong>[[actor]]</strong> mentioned you in a comment for the entry <a href=\"#\">[[post_subject]]</a>","modal.badge.verified.button.text":"Read more","sharing.service.vkontakte":"VKontakte","modal.gift_token.description":"The size of the commission is [[commission]] tokens; after you'll have [[token]] tokens left","like_reaction.like.caption":"Like","like_reaction.detail_popup.add_btn.is_added":"Is friend","subscribe_button_2022.join_community":"Join community","widget.addalias.display.helper":"Visit the <a [[aopts]]>Manage Notes</a> page to manage all your user notes.","modal.gift_token.button.send":"Send","notif_center.comment.to_comment":"<strong>[[actor]]</strong> replied to your comment for entry <a href='#'>[[post_subject]]</a>","sherry_promo_button.tooltip_text":"Реклама. ООО «Перфлюенс». ИНН 7725380313. erid: 2Ranym4Vj3N","components.report_modal.already_reported":"You've already reported a breach","subscribe_button_2022.add_user_note":"Add a note","notif_center.like.entry.user_and_user":"<strong>[[actor0]]</strong> and <strong>[[actor1]]</strong> reacted to your entry <a href=\"#\">[[post_subject]]</a>","modal.gift_token.message.warning.insufficient_tokens":"You don't have enough tokens. <a href=\"https://www.livejournal.com/shop/tokens.bml?ila_compaign=gift_tokens&ila_location=gift_modal\">Buy tokens</a>","subscribe_button_2022.you_are_subscribed":"You are subscribed","subscribe_button_2022.edit_user_note":"Edit the note","notif_center.pingback.comment.community":"<strong>[[actor]]</strong> mentioned your community [[community]] in a comment for entry <a href=\"#\">[[post_subject]]</a>","notif_center.poll.vote.user_and_user":"<strong>[[actor0]]</strong> and <strong>[[actor1]]</strong> voted in poll in your post <a href=\"#\">[[post_subject]]</a>","pushWooshPopup21.button.close":"No","subscribe_button_2022.user_note.not_available_for_basic_users":"<a href=\"https://www.livejournal.com/shop/profaccount/?ila_campaign=prof_account&ila_location=add_note\" target=\"_blank\">Upgrade your account</a> to add a note","modal.gift_token.suggestion.popup.text.hint":"The commission will be [[commission]] [[?commission|token|tokens|tokens]], after you will have [[token]] [[?token|token|tokens|tokens]].","mobileAppBanners.betterCommunicateInApp.title":"<p><b>Communicate</b><p><p>is easier in mobile app</p>","sharing.service.moimir":"Moi mir","recurrentreminder.password.button.update.password_short":"Yes","common.unsubscribe":"Unsubscribe","modal.info_pro.feature.item.filter_comment":"Negative comment filter","like_reaction.dislike.caption":"Dislike","notif_center.comment.anon":"Anonymous user commented an entry <a href=\"#\">[[post_subject]]</a>","fcklang.ljlike.button.copyURL":"Copy url","notif_center.comment":"<strong>[[actor]]</strong> commented an entry <a href='#'>[[post_subject]]</a>","subscribe_button_2022.you_are_member":"You are member","notif_center.settings":"Settings","modal.info_pro.feature.item.photo":"More photo storage space","notif_center.post_suggest.no_subj":"We've found a <a href=\"#\">post</a> that might be interesting for you","createaccount.subscribe.description":"You might like the authors","modal.info_pro.button":"Learn more","error_adding_friends.email_not_validated":"Sorry, you aren't allowed to add to friends until your email address has been validated. If you've lost the confirmation email to do this, you can <a href=\"http://www.livejournal.com/register.bml\">have it re-sent.</a>","sharing.service.embed":"Embed","user_note_modal.title.add":"Add a note","components.report_modal.descr":"Pick a category of complaint:","modal.badge.verified.title":"Verified log","notif_center.offcialpost":"Some news for you: <a href=\"#\">[[post_subject]]</a>","common.closing_quote":"\"","banner.hashmob.favorite_cities.button":"participate","common.recommended.description":"We selected these authors and communities for you","create.head":"Creating a New Journal","components.report_modal.description.lgbt_propaganda":"Information aimed at involving minors in illegal activity demonstratingsuicide or justifying non-traditional values.","banner.hashmob.favorite_cities.hash":"hashmob","common.add_to_friends":"Add to friends","modal.info_pro.feature.item.seo":"SEO tools","banner.hashmob.favorite_cities.name":"#favoritecities","modal.info_pro.user_notpaid":"does not yet use the \"Professional\" service package","pushWooshPopup21.title":"You can subscribe to journal","modal.gift_token.text":"How many LJ Tokens do you want to send to user","common.opening_quote":"\"","recurrentreminder.password.button.refuse_short":"No","subscribe_button_2022.leave_community":"Leave community","sitescheme.switchv3.confirm_dialog.yes":"Yes, switch to the new one","user_note_modal.add_note_for":"Only you will see this note on hover the username: ","like_reaction.fire.caption":"Hot","notif_center.this_day":"Remember what you wrote on this day, <a href=\"#\">[[date]]</a> in the past!","components.report_modal.title":"Report","like_reaction.pow_prints.caption":"Paw prints","fcklang.ljlike.button.email":"Email","like_reaction.laughing.caption":"LOL","like_reaction.detail_popup.title":"Reactions","notif_center.dropdown.delete":"Delete","modal.info_pro.feature.text":"The Professional package grants you the following perks:","createaccount.subscribe.to.post":"To first post","notif_center.view_all.label":"View all","like_reaction.nauseated_face.caption":"Nauseated face","notif_center.like.comment.plur":"<strong>[[actor]]</strong> and [[other_n]] [[?other_n|user|users|users]] reacted to your <a href=\"#\">comment</a>","notif_center.title":"Notifications","userinfo.bml.hover_menu.paid":"Account with the <a href=\"https://www.livejournal.com/shop/profaccount/?ila_campaign=prof_sign&ila_location=context_hover\" class=\"contextual-link\" target=\"_blank\">Professional</a> package of service","like_reaction.angry.caption":"Angry","notif_center.like.entry":"<strong>[[actor]]</strong> reacted to your entry <a href=\"#\">[[post_subject]]</a>","widget.alias.aliasdelete":"Delete note","popup.cookies.title":"This website uses cookies.","components.report_modal.description.hate_speech":"Expression of hatred towards against people based on their race, ethnicity, religion, gender, etc. ","notif_center.message":"<strong>[[actor]]</strong> sent you a <a href=\"#\">message</a>:","notif_center.post_suggest.recent_journal_upd.no_subj":"There is a new <a href=\"#\">post</a> in journal which you've visited recently","mobileAppBanners.footer.text":"Get LJ mobile app","adfox.noads.paid":"Log in to stop seeing ads in this journal","components.report_modal.description.spam":"Submit a complaint if someone has posted an ad in an inappropriate location.","notif_center.poll.vote":"<strong>[[actor]]</strong> voted in poll in your post <a href=\"#\">[[post_subject]]</a>","like_reaction.poop.caption":"Poop","common.subscribe":"Subscribe","common.add_to_group":"Add to group","like_reaction.ghost.caption":"Ghost","sherry_promo_button.text.sherry":"СКИДКИ","entry.url_copied.message":"Entry url was copied to clipboard","common.recommended":"Suggested for you","recurrentreminder.password.updated.never":"<strong>never</strong> updated your password","banner_popup.open_app":"Open App","modal.info_pro.feature.item.icon":"Badge by the username","sharing.service.livejournal":"LiveJournal","rambler.partners.title":"Today's News","notif_center.user_post":"User [[actor]] published a new entry <a href=\"#\">[[post_subject]]</a>","sharing.service.tumblr":"Tumblr","modal.gift_token.title":"Gift LJ Tokens","common.and":"and","notif_center.time.now":"just now","like_reaction.face_vomiting.caption":"Face vomiting","subscribe_button_2022.join_request_is_pending":"Join request is pending","modal.gift_token.message.success":"LJ Tokens has been sent successfully","components.report_modal.description.gambling":"Information violating the demands of the Federal law on prohibition of gambling and lotteries via the Internet or other means of communication.","pwa.banner.android.text":"Add [[journal]] to Home screen","modal.badge.verified.content":"The verified journal status means that the blog is officially maintained on behalf of a famous person or an organisation.<br /><br /><b>You also could receive a checkmark</b>, if you already have a verified status on another social platforms","modal.gift_token.suggestion.popup.text":"You want to send [[value]] [[?value|token|tokens|tokens]] to the user","notif_center.whosback":"<strong>[[actor]]</strong> posted for the first time in [[delta]]: <a href=\"#\">[[post_subject]]</a>","notif_center.social_connections.friending":"<a href=\"#\">[[actor]]</a> add you as a friend","user_note_modal.edit_note_for":"Only you will see this note on hover the username: ","components.report_modal.submit_report_caption":"Report","like_reaction.detail_popup.add_btn.add":"Add friend"}; Site.page = {"adv_libs":{"google":{"url":"https://l-stat.livejournal.net/js/??ads/googletag.js?v=1734597428"},"ssp":{"conflicts":["adfox"]},"inner":{},"adfox":{"conflicts":["ssp"],"url":null}},"D":{},"is_mobile_version":1}; Site.page.template = {}; Site.page.ljlive = {"is_enabled":false}; Site.page.adv = {"adfox_mobile_listing_1":{"use_lib":"ssp","options":{"puid3":"","puid4":"NO","puid21":"NO","puid10":"bot","puid14":"NO","puid1":"","puid34":"","puid6":"LIVEJOURNAL_JOURNAL","puid15":"","puid16":"","puid18":"","puid7":"","puid9":"topof","puid62":0,"puid59":"","puid2":"","puid8":""},"method":"sspScroll","options_begun":{"begun-block-id":"579314164","begun-auto-pad":"536695699"}},"adfox_native_1":{"use_lib":"ssp","options":{"puid3":"","puid4":"NO","puid21":"NO","puid10":"bot","puid14":"NO","puid1":"","puid34":"","puid6":"LIVEJOURNAL_JOURNAL","puid15":"","pct":"a","puid16":"","puid18":"","puid7":"","p1":"buuvt","puid62":0,"puid9":"topof","puid59":"","puid2":"","p2":"fhzr","puid8":""},"method":"sspScroll","options_begun":{"begun-block-id":"432172008","begun-auto-pad":"432171792"}},"adfox_mobile_footer":{"use_lib":"ssp","options":{"puid3":"","puid4":"NO","puid21":"NO","puid10":"bot","puid14":"NO","puid1":"","puid34":"","puid6":"LIVEJOURNAL_JOURNAL","puid15":"","puid16":"","puid18":"","puid7":"","puid9":"topof","puid62":0,"puid59":"","puid2":"","puid8":""},"method":"ssp","options_begun":{"begun-block-id":"579314162","begun-auto-pad":"536695699"}},"adfox_mobile_listing_2":{"use_lib":"ssp","options":{"puid3":"","puid4":"NO","puid21":"NO","puid10":"bot","puid14":"NO","puid1":"","puid34":"","puid6":"LIVEJOURNAL_JOURNAL","puid15":"","puid16":"","puid18":"","puid7":"","puid9":"topof","puid62":0,"puid59":"","puid2":"","puid8":""},"method":"sspScroll","options_begun":{"begun-block-id":"579314166","begun-auto-pad":"536695699"}},"billboard_mobile":{"use_lib":"ssp","options":{"puid3":"","puid4":"NO","puid21":"NO","puid10":"bot","puid14":"NO","puid1":"","puid34":"","puid6":"LIVEJOURNAL_JOURNAL","puid15":"","puid16":"","puid18":"","puid7":"","puid9":"topof","puid62":0,"puid59":"","puid2":"","puid8":""},"method":"ssp","options_begun":{"begun-block-id":"579314160","begun-auto-pad":"536695699"}}}; Site.page.is_adult = 0; Site.timer = +(new Date()); Site.remote = null; Site.journal = {"journal_url":"https://topof.livejournal.com/","webpush_sub_enabled":false,"is_personal":true,"userhead_url":"https://l-stat.livejournal.net/img/userinfo_v8.svg?v=17080?v=808","is_syndicated":false,"has_photopackage":false,"badge":null,"journal_subtitle":"","is_paid":false,"id":21956238,"webvisor_enabled":false,"is_news":false,"display_username":"topof","custom_reactions":"","journal_title":"Поток подсознания ","is_identity":false,"public_entries":[],"is_medius":false,"rkn_license":"","is_permanent":false,"is_community":false,"username":"topof","is_journal_page":false,"is_bad_content":false,"is_suspended":false,"manifest":"{\"related_applications\":[{\"id\":\"com.livejournal.android\",\"platform\":\"play\"}],\"gcm_sender_id\":\"88462774281\",\"short_name\":\"topof\",\"name\":\"Поток подсознания \",\"icons\":[{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj16.png\",\"type\":\"image/png\",\"sizes\":\"16x16\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj32.png\",\"type\":\"image/png\",\"sizes\":\"32x32\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj48.png\",\"type\":\"image/png\",\"sizes\":\"48x48\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj64.png\",\"type\":\"image/png\",\"sizes\":\"64x64\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj128.png\",\"type\":\"image/png\",\"sizes\":\"128x128\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj144.png\",\"type\":\"image/png\",\"sizes\":\"144x144\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj152.png\",\"type\":\"image/png\",\"sizes\":\"152x152\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj192.png\",\"type\":\"image/png\",\"sizes\":\"192x192\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj256.png\",\"type\":\"image/png\",\"sizes\":\"256x256\"},{\"src\":\"https://l-stat.livejournal.net/img/pwa_logo/lj512.png\",\"type\":\"image/png\",\"sizes\":\"512x512\"}],\"gcm_user_visible_only\":true,\"description\":\"Поток подсознания \",\"display\":\"standalone\",\"start_url\":\"https://topof.livejournal.com?adaptive\",\"theme_color\":\"#004359\",\"background_color\":\"#004359\",\"prefer_related_applications\":false,\"id\":\"?pwa_id=21956238\"}","profile_url":"https://topof.livejournal.com/profile/","is_memorial":false}; Site.entry = null; (function(){ var p = {"remote_is_identity":null,"remote_is_maintainer":0,"auth_token":"sessionless:1734908400:/__api/::090b9a4d81c22724b177d2b34659ccc7a443b754","locale":"en_US","remoteUser":null,"remote_is_sup":0,"remoteJournalBase":null,"statprefix":"https://l-stat.livejournal.net","vk_api_id":"2244371","ctx_popup":1,"jsonrpcprefix":"https://l-api.livejournal.com","siteroot":"https://www.livejournal.com","templates_update_time":900,"media_embed_enabled":1,"v":1734597428,"advc_token":"1734911723:b7eac45529723dd336c93669d96e411bcd65a086","currentEntryRecommendations":0,"currentLanguage":"en_LJ","server_time":1734911123,"logprefix":"","remote_email_reconfirmed":1,"counterprefix":"https://xc3.services.livejournal.com/ljcounter/","currentJournalBase":"https://topof.livejournal.com","isCustomDomain":false,"isTrustedCustomDomain":false,"remoteLocation":{"city_id":"261415","city_rus_name":"","country_name":"United States","longitude":"-73.2637","region_code":"CT","region_name":"Connecticut","country_short":"US","latitude":"41.1412","city_name":"Fairfield"},"untrusted_ssl":["test.elecsnet.ru","www.arte.tv/en/","yourlisten.com","www.retromap.ru","flymeango.com/","www.mreporter.ru","epronto.ru","globalgallery.ru","verold.com","bbc.co.uk","travelads.ru","rutv.ru","prolivestream.ru","redigo.ru","gettyimages.com","beznomera.ru","videobasher.ru","maxkatz.ru","livesignal.ru","spring.me","www.music1.ru","podfm.ru","wikimapia.org","fashionmedia.tv","www.caissa.com","globalgallery.ru","turngallery.com","www.now.ru","pik-tv.com","mrctv.org","brainmaggot.org","promodj.com","jizo.ru","televidoc.ru","fidel.ru","so-l.ru","weclever.ru","rutv.ru","fotogid.info"],"fileprefix":"https://l-files.livejournal.net","likesprefix":"https://likes.services.livejournal.com/get","ljold":"","writers_block_community":"https://writersblock.livejournal.com/","country":"US","isBackendMobile":false,"inbox_update_poll":0,"flags":{"journal_v3":true,"branding_tretyakovgallery":true,"messages_v6":false,"meta":false,"tosagree_show":true,"friendsfeed_v3_settings":true,"rss_tour":true,"s1comment_preview":true,"medius":false,"fake_setting":true,"air_tour":true,"browse_lang_filter":true,"regionalrating_tour":false,"discovery":true,"add_friend_page_redesign":true,"manage_communities_v5":false,"lj_magazine_post_in_rating":false,"regional_ratings":true,"adaptive_lj_mobile":true,"quick_comment":true,"selfpromo_noc":false,"writers_block":false,"reactions_req":true,"medius_ui":true,"cosmos2021_ljtimes":true,"your_friends_block":true,"friendsfeed_v3":true,"discovery_times_grants":true,"likes":true,"managenotes_v6":true,"meta_geo":true,"loginform_v8":true,"adv_adfox_ssp_mobile":true,"medius_reading_time_cards":true,"top_user_cards":true,"reactions_post":false,"notification_center":false,"your_choice_block":true,"ru_geo":false,"adv_loader":true,"commercial_promo_noc":false,"pocket":true,"lj_magazine_improvements":true,"img_comments":true,"reactions":true,"feed_promo_beta":false,"lena_comment_popup":true,"friendsfeed_tour":true,"lj_repost":false,"recaptcha":true,"image_magick_autobreak":true,"sherrypromo":false,"ljwelcomevideo":false,"video_update_tour":false,"move_billboard_to_scheme":true,"hashmobbanner":false,"medius_schemius":false,"contextualhover_v7":true,"homepage_v3":true,"rambler_adblock":true,"feed_promo":true,"three_posts_tour":true,"superban_step2":true,"photo_challenge_ny":true,"photo_v4":true,"hashmobbutton":false,"medius_sharings":true,"canva_geo":true,"post_2017_beta1":true,"auth_from_frame":false,"cosmos2021":true,"likes_display":true,"antiadblock":true,"shopius":false,"repost_facebook":true,"facebook_auth":true,"endless_scroll":true,"rec_sys_medius":true,"notification_center_display":false,"interactive_stripe":false},"rpc":{"domain":{"comment.add":1,"notifications.get_events_counter":1,"repost.get_status":1,"relations.can_add_friends":1,"user.set_prop":1,"relations.can_add_subscribers":1,"notifications.read_all_events":1,"comment.is_log_comment_ips":1,"notifications.get_events":1,"likes.get_likes":1,"repost.delete":1,"journal.emailreconfirm_set":1,"repost.create":1,"comment.set_contentflag":1,"notifications.unsubscribe":1,"memories.set":1,"likes.get_votes":1,"journal.set_prop":1,"memories.remove":1,"relations.addfriend":1,"user.emailreconfirm_set":1,"journal.get_prop":1,"user.get_prop":1,"notifications.delete_event":1,"relations.removefriend":1,"comment.is_need_captcha":1,"repost.get_communities":1,"event.set_contentflag":1,"memories.get":1,"notifications.read_event":1,"entry.set_contentflag":1,"likes.vote":1,"likes.create":1},"ssl":{"journal.login":1,"signup.check_password":1,"signup.convert_identity_lite":1,"support.create_request":1,"signup.create_user":1,"signup.convert_identity":1,"user.login":1},"public":{"medius.top_user_cards_choice":"300","comment.get_thread":"900","latest.get_entries":"180","browse.get_posts":"300","gifts.get_gifts_categories":"60","gifts.get_all_gifts":"60","homepage.get_categories":"60","medius.asap":"300","medius.activities":"300","sitemessage.get_message":"3600","ratings.journals_top":"300","medius.get_public_items":"300","post.get_minipage_widget_counter":"60","browse.get_categories":"300","medius.get_homepage_items":"300","writers_block.get_list":"60","medius.top_user_cards":"300","medius.collection_items":"300","categories.get_public_category_posts":"60","medius.get_public_items_categories":"300","homepage.cool_pool":"300","browse.get_communities":"300","homepage.get_search_hints":"300","homepage.get_rating":"300"}},"should_show_survey":false,"pushwoosh_app_id":"28B00-BD1E0","has_remote":0,"picsUploadDomain":"up.pics.livejournal.com","remoteLocale":"en_US","notifprefix":"https://notif.services.livejournal.com/","remote_is_suspended":0,"imgprefix":"https://l-stat.livejournal.net/img","remote_can_track_threads":null,"currentJournal":"topof","esn_async":1,"currentEntry":"","pics_production":""}, i; for (i in p) Site[i] = p[i]; })(); Site.current_journal = {"url_profile":"https://topof.livejournal.com/profile/","userid":21956238,"journaltype":"P","is_comm":"","is_syndicated":"","userpic_h":64,"is_person":1,"badge":null,"is_mediapartner":"","is_paid":0,"display_username":"topof","url_journal":"https://topof.livejournal.com","is_identity":"","is_shared":"","display_name":"topof","username":"topof","userpic_w":64,"can_receive_vgifts":1,"url_allpics":"https://www.livejournal.com/allpics.bml?user=topof","url_userpic":"https://l-userpic.livejournal.com/126348303/21956238"}; Site.version = '808'; </script> <script type="text/javascript" src="https://l-stat.livejournal.net/js/??.ljlib.js?v=1734597428"></script> <script type="text/javascript" src="https://l-stat.livejournal.net/js/??old/ljmobile.js?v=1734597428"></script> <!--[if gte IE 9]><script type="text/javascript" src="https://l-stat.livejournal.net/js/??deprecated/ie9pinned.js?v=1734597428"></script><![endif]--> <div class="footer-counters"> <!-- tns-counter.ru --> <script language="JavaScript" type="text/javascript"> (new Image()).src = '//www.tns-counter.ru/V13a***R>' + document.referrer.replace(/\*/g,'%2a') + '*sup_ru/ru/CP1251/tmsec=lj_mob/339111'; </script> <noscript> <img src="//www.tns-counter.ru/V13a****sup_ru/ru/CP1251/tmsec=lj_mob/339111" width="1" height="1" alt="" /> </noscript> <!--/ tns-counter.ru --> <!-- Yandex.Metrika counter --> <script type="text/javascript"> (function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter27737346 = new Ya.Metrika({id:27737346, clickmap:true, trackLinks:true, accurateTrackBounce:true}); } catch(e) { } }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//cdn.jsdelivr.net/npm/yandex-metrica-watch/tag.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); } })(document, window, "yandex_metrika_callbacks"); </script> <noscript><div><img src="//cdn.jsdelivr.net/npm/yandex-metrica-watch/tag.js" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> </div> </div> <div class="footer-copy b-strip">© 1999-2024 LiveJournal, Inc.</div> </div> <!--script type="text/ecmascript" src="/es"></script--> </div> </body> </html>