{"action":"created","comment":{"url":"https://api.github.com/repos/mapsme/omim/pulls/comments/208849895","pull_request_review_id":144742810,"id":208849895,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwODg0OTg5NQ==","diff_hunk":"@@ -0,0 +1,300 @@\n+#include \"generator/camera_info_collector.hpp\"\n+\n+#include \"coding/reader.hpp\"\n+#include \"coding/varint.hpp\"\n+\n+namespace generator\n+{\n+// TODO add \"inline static ...\" after moving to c++17\n+uint32_t constexpr CamerasInfoCollector::kLatestVersion;\n+double constexpr CamerasInfoCollector::Camera::kEqualityEps;\n+double constexpr CamerasInfoCollector::Camera::kSignificantPartOfSegmentCoef;\n+double constexpr CamerasInfoCollector::kMaxDistFromCameraToClosestSegmentMeters;\n+double constexpr CamerasInfoCollector::kSearchCameraRadiusMeters;\n+uint32_t constexpr CamerasInfoCollector::kMaxCameraSpeedKmpH;\n+\n+CamerasInfoCollector::CamerasInfoCollector(std::string const & dataFilePath,\n+                                           std::string const & camerasInfoPath,\n+                                           std::string const & osmIdsToFeatureIdsPath)\n+{\n+  std::map<osm::Id, uint32_t> osmIdToFeatureId;\n+  if (!routing::ParseOsmIdToFeatureIdMapping(osmIdsToFeatureIdsPath, osmIdToFeatureId))\n+  {\n+    LOG(LWARNING, (\"An error happened while parsing feature id to osm ids mapping from file:\",\n+      osmIdsToFeatureIdsPath));\n+\n+    m_valid = false;\n+    return;\n+  }\n+\n+  if (!ParseIntermediateInfo(camerasInfoPath))\n+  {\n+    LOG(LWARNING, (\"Unable to parse intermediate file(\", camerasInfoPath, \") about cameras info\"));\n+    m_valid = false;\n+    return;\n+  }\n+\n+  platform::LocalCountryFile file = platform::LocalCountryFile::MakeTemporary(dataFilePath);\n+  auto registerResult = m_dataSource.RegisterMap(file);\n+  if (registerResult.second != MwmSet::RegResult::Success)\n+  {\n+    LOG(LWARNING, (\"Unable to RegisterMap:\", dataFilePath));\n+    m_valid = false;\n+    return;\n+  }\n+\n+  for (auto & camera : m_cameras)\n+  {\n+    camera.ParseDirection();\n+    camera.TranslateWaysIdFromOsmId(osmIdToFeatureId);\n+    camera.FindClosestSegment(m_dataSource, registerResult.first);\n+  }\n+}\n+\n+void CamerasInfoCollector::Camera::FindClosestSegment(FrozenDataSource const & dataSource,\n+                                                      MwmSet::MwmId const & mwmId)\n+{\n+  if (!m_ways.empty())\n+  {\n+    // If m_ways is not empty. It means, that one of point it is our camera.\n+    // So we should find it in feature's points.\n+    for (auto it = m_ways.begin(); it != m_ways.end();)\n+    {\n+      if (auto id = FindMyself(static_cast<uint32_t>(it->m_featureId), dataSource, mwmId))\n+      {\n+        it->m_segmentId = *id;\n+        it->k = 0;  // Camera starts at the begin of segment.\n+        ++it;\n+      }\n+      else\n+      {\n+        m_ways.erase(it);\n+      }\n+    }\n+\n+    return;\n+  }\n+\n+  uint32_t bestFeatureId, segmentIdOfBestFeatureId;\n+  auto minDist = std::numeric_limits<double>::max();\n+  double coef = 0;\n+\n+  // Look at each segment of roads and find the closest.\n+  auto const updClosestFeatureCallback = [&](FeatureType & ft)\n+  {\n+    if (ft.GetFeatureType() != feature::GEOM_LINE)\n+      return;\n+\n+    if (!routing::IsCarRoad(feature::TypesHolder(ft)))\n+      return;\n+\n+    auto curMinDist = std::numeric_limits<double>::max();\n+\n+    ft.ParseGeometry(scales::GetUpperScale());\n+    std::vector<m2::PointD> points(ft.GetPointsCount());\n+    for (size_t i = 0; i < points.size(); ++i)\n+      points[i] = ft.GetPoint(i);\n+\n+    routing::FollowedPolyline polyline(points.begin(), points.end());\n+    m2::RectD rect = MercatorBounds::RectByCenterXYAndSizeInMeters(m_center, kSearchCameraRadiusMeters);\n+    auto bestSegment = polyline.UpdateProjection(rect);\n+    double tmpCoef = 0;\n+\n+    if (bestSegment.IsValid())\n+    {\n+      auto p1 = polyline.GetPolyline().GetPoint(bestSegment.m_ind);\n+      auto p2 = polyline.GetPolyline().GetPoint(bestSegment.m_ind + 1);\n+\n+      m2::ParametrizedSegment<m2::PointD> st(p1, p2);\n+      auto cameraProjOnSegment = st.ClosestPointTo(m_center);\n+      curMinDist = MercatorBounds::DistanceOnEarth(cameraProjOnSegment, m_center);\n+\n+      tmpCoef = MercatorBounds::DistanceOnEarth(p1, cameraProjOnSegment) / MercatorBounds::DistanceOnEarth(p1, p2);\n+    }\n+\n+    if (curMinDist < minDist && curMinDist < kMaxDistFromCameraToClosestSegmentMeters)\n+    {\n+      minDist = curMinDist;\n+      bestFeatureId = ft.GetID().m_index;\n+      segmentIdOfBestFeatureId = static_cast<uint32_t>(bestSegment.m_ind);\n+      coef = tmpCoef;\n+    }\n+  };\n+\n+  dataSource.ForEachInRect(\n+      updClosestFeatureCallback,\n+      MercatorBounds::RectByCenterXYAndSizeInMeters(m_center, kSearchCameraRadiusMeters),\n+      scales::GetUpperScale());\n+\n+  if (minDist != std::numeric_limits<double>::max())\n+    m_ways.emplace_back(bestFeatureId, segmentIdOfBestFeatureId, coef);\n+}\n+\n+boost::optional<uint32_t> CamerasInfoCollector::Camera::FindMyself(\n+    uint32_t wayId, FrozenDataSource const & dataSource, MwmSet::MwmId const & mwmId)\n+{\n+  FeatureID ft(mwmId, wayId);\n+  uint32_t result = 0;\n+  bool isRoad = true;\n+\n+  auto const readFeature = [&result, this, &isRoad, wayId](FeatureType & ft)\n+  {\n+    bool found = false;\n+    isRoad = routing::IsRoad(feature::TypesHolder(ft));\n+    if (!isRoad)\n+      return;\n+\n+    auto const forEachPoint = [&result, &found, this](m2::PointD const & pt)\n+    {\n+      if (found)\n+        return;\n+\n+      if (AlmostEqualAbs(m_center, pt, kEqualityEps))\n+        found = true;\n+\n+      result++;\n+    };\n+\n+    ft.ForEachPoint(forEachPoint, scales::GetUpperScale());\n+\n+    CHECK(found, (\"Cannot find camera point at the feature:\", wayId));\n+  };\n+\n+  dataSource.ReadFeature(readFeature, ft);\n+\n+  return isRoad ? boost::optional<uint32_t>(result) : boost::optional<uint32_t>();\n+}\n+\n+void CamerasInfoCollector::Camera::TranslateWaysIdFromOsmId(std::map<osm::Id, uint32_t> const & osmIdToFeatureId)\n+{\n+  for (auto it = m_ways.begin(); it != m_ways.end();)\n+  {\n+    auto const mapIt = osmIdToFeatureId.find(osm::Id::Way(it->m_featureId));\n+    if (mapIt == osmIdToFeatureId.cend())\n+    {\n+      // It means, that way was not valid, and didn't pass to mwm.\n+      // So we should also erase it from our set.\n+      m_ways.erase(it);\n+    }\n+    else\n+    {\n+      it->m_featureId = mapIt->second;  // osmId -> featureId\n+      ++it;\n+    }\n+  }\n+}\n+\n+void CamerasInfoCollector::Camera::Serialize(FileWriter & writer, CamerasInfoCollector::Camera const & camera)\n+{\n+  auto waysNumber = base::asserted_cast<uint8_t>(camera.m_ways.size());\n+  WriteVarUint(writer, waysNumber);\n+\n+  for (auto const & way : camera.m_ways)\n+  {\n+    auto const featureId = static_cast<uint32_t>(way.m_featureId);\n+    WriteVarUint(writer, featureId);\n+    WriteVarUint(writer, way.m_segmentId);\n+\n+    auto const coef = static_cast<uint32_t>(way.k * kSignificantPartOfSegmentCoef);\n+    WriteVarUint(writer, coef);\n+  }\n+\n+  auto const speed = static_cast<uint8_t>(camera.m_maxSpeed);\n+  WriteVarUint(writer, speed);\n+\n+  auto const direction = static_cast<uint8_t>(camera.m_direction);\n+  WriteVarUint(writer, direction);\n+\n+  // TODO add implementation of this feature\n+  WriteVarInt(writer, 0); // Time, from which camera is on\n+  WriteVarInt(writer, 0); // Time, from which camera is off\n+}\n+\n+bool CamerasInfoCollector::ParseIntermediateInfo(string const & camerasInfoPath)\n+{\n+  FileReader reader(camerasInfoPath);\n+  ReaderSource<FileReader> src(reader);\n+\n+  uint32_t maxSpeed, relatedWaysNumber;\n+\n+  // At first pair of ways osmId and None. Sometimes later become\n+  // pair of (feature_id, segment_id) - coord of camera, after\n+  // TranslateWaysIdFromOsmId() and FindClosestSegment().\n+  std::vector<Camera::SegmentCoord> ways;\n+  double lat, lon;\n+  m2::PointD center;\n+\n+  while (src.Size() > 0)\n+  {\n+    ReadPrimitiveFromSource(src, lat);\n+    ReadPrimitiveFromSource(src, lon);\n+    ReadPrimitiveFromSource(src, maxSpeed);\n+    ReadPrimitiveFromSource(src, relatedWaysNumber);\n+\n+    ways.resize(relatedWaysNumber);\n+    center = MercatorBounds::FromLatLon(lat, lon);\n+\n+    CHECK((0 <= maxSpeed && maxSpeed <= kMaxCameraSpeedKmpH), ());\n+    CHECK((0 <= relatedWaysNumber && relatedWaysNumber <= 255),\n+          (\"Number of related to camera ways should be interval from 0 to 255\"));\n+\n+    for (uint32_t i = 0; i < relatedWaysNumber; ++i)\n+      ReadPrimitiveFromSource(src, ways[i].m_featureId);\n+\n+    m_cameras.emplace_back(center, maxSpeed, std::move(ways));\n+  }\n+\n+  return true;\n+}\n+\n+void CamerasInfoCollector::Serialize(FileWriter & writer, std::vector<CamerasInfoCollector::Camera> const & cameras)\n+{\n+  WriteToSink(writer, CamerasInfoCollector::kLatestVersion);\n+\n+  auto amount = static_cast<uint32_t>(cameras.size());\n+  WriteVarUint(writer, amount);\n+\n+  std::map<uint64_t, int> counter;\n+\n+  for (auto const & camera : cameras)\n+  {\n+    for (auto & w : camera.m_ways) {\n+      if (counter.find(w.m_featureId) == counter.end()) {\n+        counter[w.m_featureId] = 0;\n+      }\n+      counter[w.m_featureId]++;\n+    }\n+    Camera::Serialize(writer, camera);\n+  }\n+\n+  int arr[10];\n+  for (int & i : arr) i = 0;","path":"generator/camera_info_collector.cpp","position":271,"original_position":271,"commit_id":"0674e5adf955f6fe3271438f3587056719ef5697","original_commit_id":"0674e5adf955f6fe3271438f3587056719ef5697","user":{"login":"gmoryes","id":17534533,"node_id":"MDQ6VXNlcjE3NTM0NTMz","avatar_url":"https://avatars2.githubusercontent.com/u/17534533?v=4","gravatar_id":"","url":"https://api.github.com/users/gmoryes","html_url":"https://github.com/gmoryes","followers_url":"https://api.github.com/users/gmoryes/followers","following_url":"https://api.github.com/users/gmoryes/following{/other_user}","gists_url":"https://api.github.com/users/gmoryes/gists{/gist_id}","starred_url":"https://api.github.com/users/gmoryes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gmoryes/subscriptions","organizations_url":"https://api.github.com/users/gmoryes/orgs","repos_url":"https://api.github.com/users/gmoryes/repos","events_url":"https://api.github.com/users/gmoryes/events{/privacy}","received_events_url":"https://api.github.com/users/gmoryes/received_events","type":"User","site_admin":false},"body":"ого, спасибо","created_at":"2018-08-09T08:43:05Z","updated_at":"2018-08-09T08:43:05Z","html_url":"https://github.com/mapsme/omim/pull/9255#discussion_r208849895","pull_request_url":"https://api.github.com/repos/mapsme/omim/pulls/9255","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/mapsme/omim/pulls/comments/208849895"},"html":{"href":"https://github.com/mapsme/omim/pull/9255#discussion_r208849895"},"pull_request":{"href":"https://api.github.com/repos/mapsme/omim/pulls/9255"}},"in_reply_to_id":208720806},"pull_request":{"url":"https://api.github.com/repos/mapsme/omim/pulls/9255","id":206244466,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA2MjQ0NDY2","html_url":"https://github.com/mapsme/omim/pull/9255","diff_url":"https://github.com/mapsme/omim/pull/9255.diff","patch_url":"https://github.com/mapsme/omim/pull/9255.patch","issue_url":"https://api.github.com/repos/mapsme/omim/issues/9255","number":9255,"state":"open","locked":false,"title":"[routing] add section for speed_cam","user":{"login":"gmoryes","id":17534533,"node_id":"MDQ6VXNlcjE3NTM0NTMz","avatar_url":"https://avatars2.githubusercontent.com/u/17534533?v=4","gravatar_id":"","url":"https://api.github.com/users/gmoryes","html_url":"https://github.com/gmoryes","followers_url":"https://api.github.com/users/gmoryes/followers","following_url":"https://api.github.com/users/gmoryes/following{/other_user}","gists_url":"https://api.github.com/users/gmoryes/gists{/gist_id}","starred_url":"https://api.github.com/users/gmoryes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gmoryes/subscriptions","organizations_url":"https://api.github.com/users/gmoryes/orgs","repos_url":"https://api.github.com/users/gmoryes/repos","events_url":"https://api.github.com/users/gmoryes/events{/privacy}","received_events_url":"https://api.github.com/users/gmoryes/received_events","type":"User","site_admin":false},"body":"Код добавляет секцию. \r\nПервый проход - строим соответствия `точка => id way, в котором есть эта точка`\r\nВторой проход - когда парсим точки, если текущая точка - камера, то с помощью данных из 1ого прохода находим все пути, к которых относится точка.\r\nТретий проход - для каждой камеры ищем ее featureId, segmentId, k ([0, 1]) - расположение на этом сегменте. \r\n\r\nВ случае если у камеры есть дороги к которым она привязана, то просто ищем среди точек дороги нашу камеру. Если дорог нет, то ищем ближайшую дорожный сегмент.","created_at":"2018-08-05T15:29:25Z","updated_at":"2018-08-09T08:43:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"424accfa883d74dd2ae91267284452b79b840425","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/mapsme/omim/pulls/9255/commits","review_comments_url":"https://api.github.com/repos/mapsme/omim/pulls/9255/comments","review_comment_url":"https://api.github.com/repos/mapsme/omim/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mapsme/omim/issues/9255/comments","statuses_url":"https://api.github.com/repos/mapsme/omim/statuses/0674e5adf955f6fe3271438f3587056719ef5697","head":{"label":"gmoryes:MAPSME-8120.speed_cam","ref":"MAPSME-8120.speed_cam","sha":"0674e5adf955f6fe3271438f3587056719ef5697","user":{"login":"gmoryes","id":17534533,"node_id":"MDQ6VXNlcjE3NTM0NTMz","avatar_url":"https://avatars2.githubusercontent.com/u/17534533?v=4","gravatar_id":"","url":"https://api.github.com/users/gmoryes","html_url":"https://github.com/gmoryes","followers_url":"https://api.github.com/users/gmoryes/followers","following_url":"https://api.github.com/users/gmoryes/following{/other_user}","gists_url":"https://api.github.com/users/gmoryes/gists{/gist_id}","starred_url":"https://api.github.com/users/gmoryes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gmoryes/subscriptions","organizations_url":"https://api.github.com/users/gmoryes/orgs","repos_url":"https://api.github.com/users/gmoryes/repos","events_url":"https://api.github.com/users/gmoryes/events{/privacy}","received_events_url":"https://api.github.com/users/gmoryes/received_events","type":"User","site_admin":false},"repo":{"id":141252817,"node_id":"MDEwOlJlcG9zaXRvcnkxNDEyNTI4MTc=","name":"omim","full_name":"gmoryes/omim","owner":{"login":"gmoryes","id":17534533,"node_id":"MDQ6VXNlcjE3NTM0NTMz","avatar_url":"https://avatars2.githubusercontent.com/u/17534533?v=4","gravatar_id":"","url":"https://api.github.com/users/gmoryes","html_url":"https://github.com/gmoryes","followers_url":"https://api.github.com/users/gmoryes/followers","following_url":"https://api.github.com/users/gmoryes/following{/other_user}","gists_url":"https://api.github.com/users/gmoryes/gists{/gist_id}","starred_url":"https://api.github.com/users/gmoryes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gmoryes/subscriptions","organizations_url":"https://api.github.com/users/gmoryes/orgs","repos_url":"https://api.github.com/users/gmoryes/repos","events_url":"https://api.github.com/users/gmoryes/events{/privacy}","received_events_url":"https://api.github.com/users/gmoryes/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/gmoryes/omim","description":"🗺️ MAPS.ME — Offline OpenStreetMap maps for iOS and Android","fork":true,"url":"https://api.github.com/repos/gmoryes/omim","forks_url":"https://api.github.com/repos/gmoryes/omim/forks","keys_url":"https://api.github.com/repos/gmoryes/omim/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gmoryes/omim/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gmoryes/omim/teams","hooks_url":"https://api.github.com/repos/gmoryes/omim/hooks","issue_events_url":"https://api.github.com/repos/gmoryes/omim/issues/events{/number}","events_url":"https://api.github.com/repos/gmoryes/omim/events","assignees_url":"https://api.github.com/repos/gmoryes/omim/assignees{/user}","branches_url":"https://api.github.com/repos/gmoryes/omim/branches{/branch}","tags_url":"https://api.github.com/repos/gmoryes/omim/tags","blobs_url":"https://api.github.com/repos/gmoryes/omim/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gmoryes/omim/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gmoryes/omim/git/refs{/sha}","trees_url":"https://api.github.com/repos/gmoryes/omim/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gmoryes/omim/statuses/{sha}","languages_url":"https://api.github.com/repos/gmoryes/omim/languages","stargazers_url":"https://api.github.com/repos/gmoryes/omim/stargazers","contributors_url":"https://api.github.com/repos/gmoryes/omim/contributors","subscribers_url":"https://api.github.com/repos/gmoryes/omim/subscribers","subscription_url":"https://api.github.com/repos/gmoryes/omim/subscription","commits_url":"https://api.github.com/repos/gmoryes/omim/commits{/sha}","git_commits_url":"https://api.github.com/repos/gmoryes/omim/git/commits{/sha}","comments_url":"https://api.github.com/repos/gmoryes/omim/comments{/number}","issue_comment_url":"https://api.github.com/repos/gmoryes/omim/issues/comments{/number}","contents_url":"https://api.github.com/repos/gmoryes/omim/contents/{+path}","compare_url":"https://api.github.com/repos/gmoryes/omim/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gmoryes/omim/merges","archive_url":"https://api.github.com/repos/gmoryes/omim/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gmoryes/omim/downloads","issues_url":"https://api.github.com/repos/gmoryes/omim/issues{/number}","pulls_url":"https://api.github.com/repos/gmoryes/omim/pulls{/number}","milestones_url":"https://api.github.com/repos/gmoryes/omim/milestones{/number}","notifications_url":"https://api.github.com/repos/gmoryes/omim/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gmoryes/omim/labels{/name}","releases_url":"https://api.github.com/repos/gmoryes/omim/releases{/id}","deployments_url":"https://api.github.com/repos/gmoryes/omim/deployments","created_at":"2018-07-17T07:57:11Z","updated_at":"2018-07-24T11:34:49Z","pushed_at":"2018-08-08T15:35:07Z","git_url":"git://github.com/gmoryes/omim.git","ssh_url":"git@github.com:gmoryes/omim.git","clone_url":"https://github.com/gmoryes/omim.git","svn_url":"https://github.com/gmoryes/omim","homepage":"","size":4000607,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"mapsme:master","ref":"master","sha":"c43305029839d5c7c9ab2eeed370e56bd777cc41","user":{"login":"mapsme","id":14185141,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE0MTg1MTQx","avatar_url":"https://avatars1.githubusercontent.com/u/14185141?v=4","gravatar_id":"","url":"https://api.github.com/users/mapsme","html_url":"https://github.com/mapsme","followers_url":"https://api.github.com/users/mapsme/followers","following_url":"https://api.github.com/users/mapsme/following{/other_user}","gists_url":"https://api.github.com/users/mapsme/gists{/gist_id}","starred_url":"https://api.github.com/users/mapsme/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mapsme/subscriptions","organizations_url":"https://api.github.com/users/mapsme/orgs","repos_url":"https://api.github.com/users/mapsme/repos","events_url":"https://api.github.com/users/mapsme/events{/privacy}","received_events_url":"https://api.github.com/users/mapsme/received_events","type":"Organization","site_admin":false},"repo":{"id":42798033,"node_id":"MDEwOlJlcG9zaXRvcnk0Mjc5ODAzMw==","name":"omim","full_name":"mapsme/omim","owner":{"login":"mapsme","id":14185141,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE0MTg1MTQx","avatar_url":"https://avatars1.githubusercontent.com/u/14185141?v=4","gravatar_id":"","url":"https://api.github.com/users/mapsme","html_url":"https://github.com/mapsme","followers_url":"https://api.github.com/users/mapsme/followers","following_url":"https://api.github.com/users/mapsme/following{/other_user}","gists_url":"https://api.github.com/users/mapsme/gists{/gist_id}","starred_url":"https://api.github.com/users/mapsme/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mapsme/subscriptions","organizations_url":"https://api.github.com/users/mapsme/orgs","repos_url":"https://api.github.com/users/mapsme/repos","events_url":"https://api.github.com/users/mapsme/events{/privacy}","received_events_url":"https://api.github.com/users/mapsme/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mapsme/omim","description":"🗺️ MAPS.ME — Offline OpenStreetMap maps for iOS and Android","fork":false,"url":"https://api.github.com/repos/mapsme/omim","forks_url":"https://api.github.com/repos/mapsme/omim/forks","keys_url":"https://api.github.com/repos/mapsme/omim/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mapsme/omim/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mapsme/omim/teams","hooks_url":"https://api.github.com/repos/mapsme/omim/hooks","issue_events_url":"https://api.github.com/repos/mapsme/omim/issues/events{/number}","events_url":"https://api.github.com/repos/mapsme/omim/events","assignees_url":"https://api.github.com/repos/mapsme/omim/assignees{/user}","branches_url":"https://api.github.com/repos/mapsme/omim/branches{/branch}","tags_url":"https://api.github.com/repos/mapsme/omim/tags","blobs_url":"https://api.github.com/repos/mapsme/omim/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mapsme/omim/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mapsme/omim/git/refs{/sha}","trees_url":"https://api.github.com/repos/mapsme/omim/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mapsme/omim/statuses/{sha}","languages_url":"https://api.github.com/repos/mapsme/omim/languages","stargazers_url":"https://api.github.com/repos/mapsme/omim/stargazers","contributors_url":"https://api.github.com/repos/mapsme/omim/contributors","subscribers_url":"https://api.github.com/repos/mapsme/omim/subscribers","subscription_url":"https://api.github.com/repos/mapsme/omim/subscription","commits_url":"https://api.github.com/repos/mapsme/omim/commits{/sha}","git_commits_url":"https://api.github.com/repos/mapsme/omim/git/commits{/sha}","comments_url":"https://api.github.com/repos/mapsme/omim/comments{/number}","issue_comment_url":"https://api.github.com/repos/mapsme/omim/issues/comments{/number}","contents_url":"https://api.github.com/repos/mapsme/omim/contents/{+path}","compare_url":"https://api.github.com/repos/mapsme/omim/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mapsme/omim/merges","archive_url":"https://api.github.com/repos/mapsme/omim/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mapsme/omim/downloads","issues_url":"https://api.github.com/repos/mapsme/omim/issues{/number}","pulls_url":"https://api.github.com/repos/mapsme/omim/pulls{/number}","milestones_url":"https://api.github.com/repos/mapsme/omim/milestones{/number}","notifications_url":"https://api.github.com/repos/mapsme/omim/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mapsme/omim/labels{/name}","releases_url":"https://api.github.com/repos/mapsme/omim/releases{/id}","deployments_url":"https://api.github.com/repos/mapsme/omim/deployments","created_at":"2015-09-20T02:57:13Z","updated_at":"2018-08-07T19:22:51Z","pushed_at":"2018-08-09T08:23:25Z","git_url":"git://github.com/mapsme/omim.git","ssh_url":"git@github.com:mapsme/omim.git","clone_url":"https://github.com/mapsme/omim.git","svn_url":"https://github.com/mapsme/omim","homepage":"","size":4029293,"stargazers_count":2735,"watchers_count":2735,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":596,"mirror_url":null,"archived":false,"open_issues_count":728,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":596,"open_issues":728,"watchers":2735,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mapsme/omim/pulls/9255"},"html":{"href":"https://github.com/mapsme/omim/pull/9255"},"issue":{"href":"https://api.github.com/repos/mapsme/omim/issues/9255"},"comments":{"href":"https://api.github.com/repos/mapsme/omim/issues/9255/comments"},"review_comments":{"href":"https://api.github.com/repos/mapsme/omim/pulls/9255/comments"},"review_comment":{"href":"https://api.github.com/repos/mapsme/omim/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mapsme/omim/pulls/9255/commits"},"statuses":{"href":"https://api.github.com/repos/mapsme/omim/statuses/0674e5adf955f6fe3271438f3587056719ef5697"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"gmoryes"}}