Переподписать IPA (iPhone)

В настоящее время я без проблем создаю все свои приложения с помощью hudson, используя xcodebuild, за которым следует xcrun

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

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

Я нашел некоторую информацию (http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for-upload/)

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

С моим сценарием отставки я сейчас делаю

  • распаковать app.ipa
  • appname = $ (ls Payload)
  • xcrun -sdk iphoneos PackageApplication -s "$ provisioning_profile" "$ project_dir / Payload / $ appname" -o "$ project_dir / app-resigned.ipa" --sign "$ provisioning_profile" --embed "$ mobileprovision"

Я просмотрел полученный файл ipa, и он очень похож на исходное приложение. Какие файлы здесь действительно нужно менять? Сначала я думал, что _CodeSignature / CodeResources изменится, но содержимое выглядит почти так же.

Указатели очень ценятся.


person Erik    schedule 01.08.2011    source источник


Ответы (13)


Наконец-то это заработало!

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

Решение:

Разархивируйте IPA

unzip Application.ipa

Удалить старую подпись CodeSignature

rm -r "Payload/Application.app/_CodeSignature" "Payload/Application.app/CodeResources" 2> /dev/null | true

Заменить встроенный профиль мобильной подготовки

cp "MyEnterprise.mobileprovision" "Payload/Application.app/embedded.mobileprovision"

Уходить в отставку

/usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

Переупаковать

zip -qr "Application.resigned.ipa" Payload

Изменить: удалена часть прав (см. Комментарий переулков, спасибо)

person Erik    schedule 03.08.2011
comment
Я не мог заставить это работать, если исходный идентификатор пакета отличался от нового. Я пробовал использовать -i для кодового знака, но это привело к ошибкам связки ключей при запуске приложения. Я также пытался изменить Info.plist, а затем безуспешно подписывать его. Кажется, что двоичный файл содержит идентификатор пакета. - person tjg184; 24.08.2011
comment
Одна вещь, которая вызвала у нас проблемы, заключалась в том, что файл прав, если он у вас есть, должен соответствовать идентификатору приложения, предоставленному Apple. Поскольку мы меняли идентификатор пакета, права не совпадали. Приложение будет работать, но связка ключей очищается после каждого запуска. - person tjg184; 24.08.2011
comment
Не могли бы вы немного лучше описать способ заставить его работать, изменив идентификатор пакета? Я пытаюсь изменить идентификатор пакета, так как для нашего внутреннего пользования нам нужно использовать другой. Большое спасибо. - person SlowTree; 25.08.2011
comment
Вы можете изменить Info.plist вручную. Это будет включать идентификатор пакета. Итак, измените его перед подписанием. Одна из проблем, с которой мы столкнулись, заключалась в том, что файл grantlements.plist содержал $ (AppIdentifierPrefix) $ (CFBundleIdentifier), который не соответствовал новому идентификатору приложения после того, как мы подписали его. Сообщите мне, если это поможет. - person tjg184; 26.08.2011
comment
Согласно oleb.net/blog/2011/06 / code-signed-changes-in-xcode-4 идентификатор приложения встроен в двоичный файл, поэтому вы можете уйти в отставку только с тем же идентификатором приложения. Я знаю, что не смог уволиться с другим идентификатором приложения. - person Michael Baltaks; 06.12.2011
comment
К вашему сведению, вы можете использовать (встроенную) команду Apple /usr/libexec/PlistBuddy для изменения значений в списке. - person zekel; 23.01.2012
comment
Это сделало мой день. Сначала мне пришлось создать Entitlements.plist. Xcode > New file > Entitlement.plist > Can be debugged = 'NO' - person Besi; 24.01.2012
comment
Я смог отправить дистрибутив ipa, выполнив описанные выше шаги. Просто пришлось удалить часть прав, так как в нашем приложении их не было. Спасибо за помощь ! - person madoke; 02.03.2012
comment
Могу ли я выполнить ту же процедуру для индивидуальной учетной записи разработчика. Поскольку теперь клиент хочет отправить приложение в свою учетную запись, могу ли я просто переназначить приложение для его учетной записи? - person user431791; 19.09.2012
comment
Большое спасибо за эту процедуру. Только одно: мне нужно было указать правильную платформу для codeign_allocate перед запуском codeign: $ export CODESIGN_ALLOCATE = / Developer / Platforms / iPhoneOS.platform / Developer / usr / bin / codesign_allocate, иначе кодовый знак останавливается с помощью codeign_allocate: object: / Users /. ../MyApp.app/MyApp ошибка некорректного объекта (неизвестная команда загрузки 9) - person Kevin Gaudin; 25.09.2012
comment
Привет, @Erik, я создал гем, в значительной степени основанный на этом решении, чтобы облегчить процесс повторной подписи файлов .ipa ... может быть, вы можете проверить это, ура github.com/felipesabino/provise - person Felipe Sabino; 08.12.2012
comment
Полезная нагрузка содержит символические ссылки, поэтому вам нужно включить флаг -y при ее архивировании: zip -yqr resigned.ipa Payload - person RandomBits; 23.01.2013
comment
Интересно, работает ли этот способ отказа от приложения для распространения в App Store. Я попытался выполнить следующие действия, но при загрузке ушедшего в отставку IPA через загрузчик приложений выдается следующая ошибка: Ошибка проверки кода приложения. Подпись недействительна, содержит запрещенные права или не подписана сертификатом распространения iPhone. Конечно, нет никаких прав, и сертификат является распределительным. - person Valerio Santinelli; 08.02.2013
comment
@ValerioSantinelli Вам нужно будет перенести права из предыдущего подписания кода. Push-уведомления FWIW не будут работать без прав. После распаковки: /usr/bin/codesign -d --entitlements :entitlements.plist /Payload/appname.app Потом при увольнении добавить --entitlements entitlements.plist - person Peter; 24.05.2013
comment
Если вы увольняетесь, чтобы отправить заявку в App Store, вам необходимо создать и включить файл прав. Просто предупреждаю. Этот ответ решил для нас множество проблем и позволит нам отправить заявку в срок. Спасибо! - person cesarislaw; 06.09.2013
comment
Фелипе Сабино, отличный инструмент, попробовал впервые. И спасибо за признание. - person Erik; 31.01.2014
comment
ive получил следующую ошибку в этой строке Нет такого файла или каталога: cp MyEnterprise.mobileprovision Payload / Application.app / embedded.mobileprovision - person Mutawe; 09.06.2014
comment
Так что же именно происходит во время отставки? - person ColossalChris; 03.10.2014
comment
codeign не работает в Yosemite - Предупреждение: --resource-rules устарело в Mac OS X ›= 10.10! Payload / Aaa.app / ResourceRules.plist: не удается прочитать ресурсы - person Jibeex; 29.10.2014
comment
Используя это, я не получаю действительной строки прав 'aps-environment', найденной для приложения, когда я пытаюсь зарегистрироваться для получения push-уведомлений. Я попробовал советы @Peter, но приложение не установилось. Любая идея? - person Sandro Machado; 10.11.2014
comment
Спасибо за публикацию. Это сработало для меня. Я хотел бы добавить примечание о необходимом мне дополнительном шаге. В Payload / Application.app / был каталог с именем CACertChains, содержащий файл с именем cacert.pem. Мне пришлось удалить каталог и .pem, чтобы выполнить эти шаги. Спасибо еще раз! - person William Power; 26.11.2014
comment
Я бы рекомендовал добавить --symlinks в команду zip, чтобы исправить ... CodeResources файл должен быть символической ссылкой ... проблема. Подробнее см. stackoverflow.com/a/7141055/404409. - person Jon Cox; 19.01.2015
comment
Спасибо, это работает! И Права должны быть включены, начиная с iOS 8.1.3., Поэтому добавьте --entitlements entitlements.plist обратно в команду отставки. Я создал entitlements.plist, используя Как проверить права, связанные с моим профилем обеспечения? - person Lion; 10.07.2015
comment
Кажется, что важно добавить часть --entitlements entitlements.plist в правильное место, для меня она не работала (No such file or directory), когда помещалась в конец команды .. Помещение ее перед переключателем -s ... помогло. - person d4Rk; 26.08.2015
comment
Также убедитесь, что срок действия вашего профиля не истек. Мне потребовалось некоторое время, чтобы понять это .. -.- - person d4Rk; 08.09.2015
comment
Предупреждение: --resource-rules устарело в Mac OS X ›= 10.10! Payload / Application.app / ResourceRules.plist: не может читать ресурсы. Получили эту ошибку? - person megha; 22.09.2015
comment
Есть кто-нибудь, кто пробует такое на ios 9? Я могу установить на ios 8, но на ios 9 я получаю эту ошибку. Приложение не может быть проверено. - person Khant Thu Linn; 25.09.2015
comment
Согласно комментарию @ KhantThuLinn, я также получаю, что приложение не может быть проверено. Это можно обойти? - person Christopher Griffith; 16.11.2017

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

----- Как отказаться от приложения для iOS -----

Допустим, вы получили приложение (например, MyApp.ipa) от другого разработчика и хотите иметь возможность установить и запустить его на своих устройствах (например, с помощью ideviceinstaller).

Подготовьте новые активы для подписи

Первым шагом является получение профиля обеспечения, который включает все устройства, которые вы хотите установить и использовать. Убедитесь, что профиль содержит сертификат, который вы установили в своем Keychain Access (например, iPhone Developer: Some Body (XXXXXXXXXX)). Загрузите профиль (MyProfile.mobileprovision), чтобы вы могли заменить профиль, встроенный в приложение.

Затем мы собираемся подготовить файл прав для включения в подпись. Откройте свой терминал и запустите следующее.

$ security cms -D -i path/to/MyProfile.mobileprovision > provision.plist

Будет создан XML-файл с описанием вашего профиля обеспечения. Затем мы хотим извлечь права в файл.

$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist

Замените профиль обеспечения и оставьте приложение

Если вы работаете с файлом .ipa, сначала распакуйте приложение (если вместо этого у вас есть .app, вы можете пропустить этот шаг).

$ unzip MyApp.ipa

Теперь ваш рабочий каталог будет содержать Payload/ и Payload/MyApp.app/. Затем удалите старые файлы подписи кода.

$ rm -rf Payload/MyApp.app/_CodeSignature

Замените существующий профиль обеспечения (например, embedded.mobileprovision) своим собственным.

$ cp path/to/MyProfile.mobileprovision Payload/MyApp.app/embedded.mobileprovision

ВАЖНО: вы также должны отказаться от всех фреймворков, включенных в приложение. Вы найдете их в Payload/MyApp.app/Frameworks. Если приложение написано на Swift или включает какие-либо дополнительные фреймворки, они должны быть уволены, иначе приложение установится, но не запустится.

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app/Frameworks/*

Теперь подпишите приложение с помощью сертификата, включенного в ваш профиль обеспечения, и файла grantlements.plist, который вы создали ранее.

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app

Теперь вы можете повторно разархивировать приложение.

$ zip -qr MyApp-resigned.ipa Payload

Готово

Теперь вы можете удалить каталог Payload, так как у вас есть исходное приложение (MyApp.ipa) и ваша отставная версия (MyApp-resigned.ipa). Теперь вы можете установить MyApp-resigned.ipa на любое устройство, включенное в ваш профиль подготовки.

person InnisBrendan    schedule 11.05.2016
comment
Будет ли этот же подход применяться к профилям распределения? IE: могу ли я извлечь права и повторно подписать их из своего distro.mobileprovision? - person Chase Florell; 23.06.2016
comment
@grez Будет ли это работать и для раздачи IPA? - person LearneriOS; 21.07.2016
comment
Я также имею в виду распространение IPA корпоративных приложений @grez - person LearneriOS; 21.07.2016
comment
@LearneriOS У меня это не сработало для Enterprise IPA Distribution. Я использую Sierra, Xcode 8, iOS 10. Приложение устанавливается через iTunes, но сразу после установки удаляется. - person Bryan Bryce; 08.12.2016
comment
@PhoenixFF Я не уверен в установке с помощью iTunes, но можете ли вы попробовать установить из командной строки следующим образом: $ ideviceinstaller -i myapp.ipa - person InnisBrendan; 08.12.2016
comment
На данный момент, 9 марта 2017 года, iOS 10.2 и Xcode 8, это единственное рабочее решение, которое я нашел. Большое спасибо! - person allemattio; 09.03.2017
comment
этот ответ мне очень помогает! Я забываю отказаться от фреймворков, и приложение разбилось во время запуска. - person Rufus; 24.04.2017
comment
Я не могу отказаться от фреймворков, так как у меня нет папки Frameworks в Payload / MyApp.app. Может ли кто-нибудь помочь мне с этим. Заранее спасибо. - person i 4322946; 30.06.2017
comment
@ i4322946 Если у вас нет папки Frameworks, пропустите этот шаг. К вашему сведению, я просто использовал инструкцию, предоставленную grez, чтобы повторно подписать корпоративное приложение ios через командную строку и успешно развернул его. - person Jay; 10.07.2017

Я успешно выполнил этот ответ, но, поскольку права изменились, я просто удалил --entitlements "Payload/Application.app/Entitlements.plist" часть предпоследнего оператора, и это сработало как шарм.

person alleus    schedule 02.04.2012
comment
Я повторю предыдущий комментарий. Удалите права, чтобы эта работа работала с помощью современного набора инструментов. - person Bruno Bronosky; 05.06.2012
comment
Без прав мое приложение начало работать странно, в журнале было указано: SecItemCopyMatching: missing entitlement. У меня нет отдельного файла Entitlements.plist, поэтому для сохранения прав я использовал Комментарий @ LordT: сначала создайте файл прав: echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>/usr/bin/codesign -d --entitlements - temp/Payload/$APP_NAME | sed -E -e '1d'" > temp/newEntitlements, затем используйте его при подписании: --entitlements temp/newEntitlements. - person Bulat; 30.04.2013

Думаю, проще всего использовать Fastlane:

sudo gem install fastlane -NV
hash -r # for bash
rehash # for zsh
fastlane sigh resign ./path/app.ipa --signing_identity "Apple Distribution: Company Name" -p "my.mobileprovision"
person Marián Černý    schedule 03.06.2019
comment
Я пробовал много способов, но безуспешно. Это решение сработало для меня, спасибо. - person Omid Kia; 08.02.2020

Проверено с Mac OS High Sierra и Xcode 10

Вы можете просто реализовать то же самое с помощью приложения iResign.

Укажите путь 1) .ipa

2) Новый профиль обеспечения

3) Файл с правами (необязательно, добавляйте, только если у вас есть права)

4) Идентификатор пакета

5) Сертификат распространения

Вы можете увидеть выходной файл .ipa, сохраненный после повторной подписи

Простой и мощный инструмент

person Saranjith    schedule 17.07.2018

Ни один из этих подходов к увольнению не помог мне, поэтому мне пришлось придумать что-то другое.

В моем случае у меня был IPA с просроченным сертификатом. Я мог бы перестроить приложение, но поскольку мы хотели убедиться, что распространяем точно такую ​​же версию (только с новым сертификатом), мы не хотели перестраивать его.

Вместо способов увольнения, упомянутых в других ответах, я обратился к методу Xcode для создания IPA, который начинается с .xcarchive из сборки.

  1. Я продублировал существующий .xcarchive и начал заменять его содержимое. (Я проигнорировал файл .dSYM.)

  2. Я извлек старое приложение из старого файла IPA (распаковав; приложение - единственное, что находится в папке Payload)

  3. Я переместил это приложение в новый .xcarchive, где Products/Applications заменил приложение, которое было там.

  4. Я редактировал Info.plist, редактирую

    • ApplicationProperties/ApplicationPath
    • ApplicationProperties/CFBundleIdentifier
    • ApplicationProperties/CFBundleShortVersionString
    • ApplicationProperties/CFBundleVersion
    • Name
  5. Я переместил .xcarchive в папку архива Xcode, обычно /Users/xxxx/Library/Developer/Xcode/Archives.

  6. В Xcode я открыл окно Организатора, выбрал этот новый архив и выполнил обычный (в данном случае Enterprise) экспорт.

В результате получился хороший IPA, который работает.

person Gary Makin    schedule 05.10.2017
comment
Это гениальное решение, которое до сих пор работает с Xcode 9.2. В моем случае я просто скопировал старый файл .app под существующий .xcarchive. Я не менял Info.plist, поэтому версия приложения осталась прежней, но была подписана новым корпоративным сертификатом. - person dodgy_coder; 12.03.2018

В 2020 году я сделал это с Fastlane -

Вот команда, которую я использовал

$ fastlane run resign ipa:"/Users/my_user/path/to/app.ipa" signing_identity:"iPhone Distribution: MY Company (XXXXXXXX)" provisioning_profile:"/Users/my_user/path/to/profile.mobileprovision" bundle_id:com.company.new.bundle.name

Полная документация здесь - https://docs.fastlane.tools/actions/resign/

person Pankaj Saini    schedule 25.09.2020

С опцией отставки Fastlane вздоха вы можете сделать это очень легко.

sigh resign -p <path-to-profile-with-mobileprovision-ext> -i <code-sighning-identity-of-your-app>

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

person Vineeth    schedule 14.09.2017

Я перепробовал все решения, но, наконец, я могу создать отставку ipa с помощью этих команд

Свидетельства об увольнении

  • * - это имя ipa, а также имя приложения. $ PROVISION - это путь к профилю обеспечения. $ CERTIFICATE - это имя сертификата в цепочке ключей, полное имя (общее имя при двойном щелчке по сертификату)
  1. Перейдите в Каталог, в котором хотите создать новый ipa с сертификатами отставки. Поместите туда все файлы ipa, certificate и mobileprovision, а также установите сертификат

  2. security cms -D -i путь / к / MyProfile.mobileprovision ›provision.plist (Вызовите эту команду и замените мобильное обеспечение на путь к файлу)

  3. / usr / libexec / PlistBuddy -x -c 'Print: Entitlements' provision.plist ›grantlements.plist (нажмите эту команду)

  4. распаковать -q * .ipa

  5. rm -rf Payload / *. приложение / _CodeSignature /

  6. / usr / libexec / PlistBuddy Payload / *. app / Info.plist (после этой команды мы должны добавить новый идентификатор пакета, если нам не нужно менять идентификатор пакета, тогда мы можем игнорировать эти 3 шага)

7.  Set :CFBundleIdentifier “com.mycompany.newbundleidentifier” (This should be new bundle ID)
8.  save
9.  quit
  1. cp $ PROVISION Payload / *. app / embedded.mobileprovision

  2. codeign -d --entitlements: grantlements.plist Payload / *. app / (попробуйте проигнорировать эту команду, если приложение не работает, тогда используйте эту команду в следующий раз)

  3. codeign -f -s $ CERTIFICATE --entitlements grantlements.plist Payload / .app / Frameworks /

  4. codeign -f -s $ CERTIFICATE --entitlements grantlements.plist Payload / *. app /

  5. zip -qr resigned.ipa Полезная нагрузка

https://stackoverflow.com/a/37172815 https://stackoverflow.com/a/50392448 https://coderwall.com/p/qwqpnw/resign-ipa-with-new-cfbundleidentifier-and-certificate

person Gurinder Batth    schedule 31.08.2020
comment
Это решение сработало для меня. Ответ @InnisBrendan также работает, но сначала у нас есть фреймворки для подписи, а затем приложение, иначе оно не будет установлено на устройстве - person Anjaneyulu Battula; 02.06.2021

Спасибо, Эрик, за публикацию этого сообщения. Это сработало для меня. Я хотел бы добавить примечание о необходимом мне дополнительном шаге. В «Payload / Application.app /» был каталог с именем «CACertChains», в котором находился файл с именем «cacert.pem». Мне пришлось удалить каталог и .pem, чтобы выполнить эти шаги. Спасибо еще раз! -

person William Power    schedule 26.11.2014

Если ваше приложение создано с использованием инструментов Flutter, ознакомьтесь с информацией codesign для всех расширений модулей:

codesign -d --verbose=4 Runner.app/Frameworks/xxx.framework |& grep 'Authority='

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

Запустите сценарий оболочки, указанный ниже, для codesign всех расширений:

IDENTITY=<prefix of Team ID number>
ENTITLEMENTS=<entitlements.plist>
find Payload/Runner.app -type d -name '*framework' | xargs -I '{}' codesign -s $IDENTITY -f --entitlements $ENTITLEMENTS {} 

И, наконец, не забудьте codesign сам Runner.app

person wangkaibule    schedule 24.02.2021

Вы можете использовать приложение XReSign (простой инструмент с графическим интерфейсом) для повторной подписи вашего ipa, я использовал его для повторной подписи моего корпоративного приложения для распространения, и он работал нормально

https://github.com/xndrs/XReSign

Все что тебе нужно это

  1. ипа в отставку
  2. Mobileprovision
  3. права (для создания прав, пожалуйста, проверьте следующие шаги)
  4. сертификат распространения предприятия

Для создания прав:

Откройте терминал

$ security cms -D -i "your_path/Enterprise_Distribution.mobileprovision" > provision.plist

тогда

$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist

Спасибо

person kumar    schedule 24.03.2021

Если у вас есть приложение с расширениями и / или приложение для часов, и у вас есть несколько профилей подготовки для каждого приложения расширения / просмотра, вам следует использовать этот скрипт для повторной подписи файла ipa.

Скрипт повторной подписи на Github

Вот пример того, как использовать этот скрипт:

./resign.sh YourApp.ipa "iPhone Distribution: YourCompanyOrDeveloperName" -p <path_to_provisioning_profile_for_app>.mobileprovision -p <path_to_provisioning_profile_for_watchkitextension>.mobileprovision -p <path_to_provisioning_profile_for_watchkitapp>.mobileprovision -p <path_to_provisioning_profile_for_todayextension>.mobileprovision  resignedYourApp.ipa

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

Для меня - все профили обеспечения были подписаны одним и тем же удостоверением сертификата / подписи.

person RPM    schedule 16.02.2016
comment
Ваша ссылка не работает ... нашел эту альтернативу, посмотрев на github автора. github.com/fastbane/fastlane/fastlane/fastlane/fastlane/fastlane/fastlane а> - person jugutier; 18.01.2017
comment
это старый ответ и, вероятно, его следует удалить, так как он больше не работает, но нет возможности удалить его в StackOverflow - person RPM; 24.01.2017
comment
хорошо знать, что он все еще работает. Не могу больше редактировать исходный ответ, поэтому людям придется читать комментарии :) - person RPM; 25.01.2017
comment
Вместо этого используйте fastlane sigh resign YourApp.ipa --signing_identity "iPhone Distribution: YourCompanyOrDeveloperName" -p <path_to_provisioning_profile_for_app>.mobileprovision -p <path_to_provisioning_profile_for_watchkitextension>.mobileprovision. - person green0range; 04.02.2017