six-degrees 0.4.10 → 0.4.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +1 -0
  3. package/.next/standalone/.next/build-manifest.json +3 -3
  4. package/.next/standalone/.next/prerender-manifest.json +4 -4
  5. package/.next/standalone/.next/routes-manifest.json +6 -0
  6. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  12. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  14. package/.next/standalone/.next/server/app/_not-found.rsc +13 -13
  15. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +13 -13
  16. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +12 -12
  17. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  18. package/.next/standalone/.next/server/app/api/admin-delete/route.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/api/admin-update/route.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/api/bridges/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/bulk-import/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/company-scores/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/connections/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/data/export/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/data/import/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/data/restart/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/data/reveal/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/data/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/delete-cluster/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/ingest/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/api/network/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/api/outreach/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/queue/route.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/api/scraper/route.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/setup-profile/route.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/api/social/crm/route/app-paths-manifest.json +3 -0
  42. package/.next/standalone/.next/server/app/api/social/crm/route/build-manifest.json +12 -0
  43. package/.next/standalone/.next/server/app/api/social/crm/route/server-reference-manifest.json +4 -0
  44. package/.next/standalone/.next/server/app/api/social/crm/route.js +10 -0
  45. package/.next/standalone/.next/server/app/api/social/crm/route.js.map +5 -0
  46. package/.next/standalone/.next/server/app/api/social/crm/route.js.nft.json +1 -0
  47. package/.next/standalone/.next/server/app/api/social/crm/route_client-reference-manifest.js +3 -0
  48. package/.next/standalone/.next/server/app/api/social/messages/route.js +4 -3
  49. package/.next/standalone/.next/server/app/api/social/messages/route.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/api/social/route.js +4 -3
  51. package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/api/unlock/route.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  54. package/.next/standalone/.next/server/app/api/update-images/route.js.nft.json +1 -1
  55. package/.next/standalone/.next/server/app/api/users/route.js.nft.json +1 -1
  56. package/.next/standalone/.next/server/app/avatars/[file]/route.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/import/page.js.nft.json +1 -1
  58. package/.next/standalone/.next/server/app/import/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/import.html +1 -1
  60. package/.next/standalone/.next/server/app/import.rsc +15 -15
  61. package/.next/standalone/.next/server/app/import.segments/_full.segment.rsc +15 -15
  62. package/.next/standalone/.next/server/app/import.segments/_tree.segment.rsc +2 -2
  63. package/.next/standalone/.next/server/app/import.segments/import/__PAGE__.segment.rsc +14 -14
  64. package/.next/standalone/.next/server/app/index.html +1 -1
  65. package/.next/standalone/.next/server/app/index.rsc +15 -15
  66. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +14 -14
  67. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  68. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  69. package/.next/standalone/.next/server/app/launch/page.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/launch/page_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/launch.html +2 -2
  72. package/.next/standalone/.next/server/app/launch.rsc +15 -15
  73. package/.next/standalone/.next/server/app/launch.segments/_full.segment.rsc +15 -15
  74. package/.next/standalone/.next/server/app/launch.segments/_tree.segment.rsc +2 -2
  75. package/.next/standalone/.next/server/app/launch.segments/launch/__PAGE__.segment.rsc +14 -14
  76. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  77. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  78. package/.next/standalone/.next/server/app/paths/page.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/paths/page_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/paths.html +1 -1
  81. package/.next/standalone/.next/server/app/paths.rsc +15 -15
  82. package/.next/standalone/.next/server/app/paths.segments/_full.segment.rsc +15 -15
  83. package/.next/standalone/.next/server/app/paths.segments/_tree.segment.rsc +2 -2
  84. package/.next/standalone/.next/server/app/paths.segments/paths/__PAGE__.segment.rsc +14 -14
  85. package/.next/standalone/.next/server/app/profile/page.js.nft.json +1 -1
  86. package/.next/standalone/.next/server/app/profile/page_client-reference-manifest.js +1 -1
  87. package/.next/standalone/.next/server/app/profile.html +1 -1
  88. package/.next/standalone/.next/server/app/profile.rsc +15 -15
  89. package/.next/standalone/.next/server/app/profile.segments/_full.segment.rsc +15 -15
  90. package/.next/standalone/.next/server/app/profile.segments/_tree.segment.rsc +2 -2
  91. package/.next/standalone/.next/server/app/profile.segments/profile/__PAGE__.segment.rsc +14 -14
  92. package/.next/standalone/.next/server/app/queue/page.js.nft.json +1 -1
  93. package/.next/standalone/.next/server/app/queue/page_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/queue.html +1 -1
  95. package/.next/standalone/.next/server/app/queue.rsc +15 -15
  96. package/.next/standalone/.next/server/app/queue.segments/_full.segment.rsc +15 -15
  97. package/.next/standalone/.next/server/app/queue.segments/_tree.segment.rsc +2 -2
  98. package/.next/standalone/.next/server/app/queue.segments/queue/__PAGE__.segment.rsc +14 -14
  99. package/.next/standalone/.next/server/app/scores/page.js.nft.json +1 -1
  100. package/.next/standalone/.next/server/app/scores/page_client-reference-manifest.js +1 -1
  101. package/.next/standalone/.next/server/app/scores.html +1 -1
  102. package/.next/standalone/.next/server/app/scores.rsc +15 -15
  103. package/.next/standalone/.next/server/app/scores.segments/_full.segment.rsc +15 -15
  104. package/.next/standalone/.next/server/app/scores.segments/_tree.segment.rsc +2 -2
  105. package/.next/standalone/.next/server/app/scores.segments/scores/__PAGE__.segment.rsc +14 -14
  106. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  107. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/settings.html +1 -1
  109. package/.next/standalone/.next/server/app/settings.rsc +15 -15
  110. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +15 -15
  111. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  112. package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +14 -14
  113. package/.next/standalone/.next/server/app/setup/page.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/setup.html +1 -1
  116. package/.next/standalone/.next/server/app/setup.rsc +15 -15
  117. package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +15 -15
  118. package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  119. package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +14 -14
  120. package/.next/standalone/.next/server/app/social/page.js.nft.json +1 -1
  121. package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/social.html +1 -1
  123. package/.next/standalone/.next/server/app/social.rsc +15 -15
  124. package/.next/standalone/.next/server/app/social.segments/_full.segment.rsc +15 -15
  125. package/.next/standalone/.next/server/app/social.segments/_tree.segment.rsc +2 -2
  126. package/.next/standalone/.next/server/app/social.segments/social/__PAGE__.segment.rsc +14 -14
  127. package/.next/standalone/.next/server/app-paths-manifest.json +1 -0
  128. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__06mi9k2._.js → [root-of-the-server]__05_3-22._.js} +7 -2
  129. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t3v1a1._.js +1 -1
  130. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tir0vc._.js +8 -0
  131. package/.next/standalone/.next/server/chunks/_0ea9qwy._.js +1 -1
  132. package/.next/standalone/.next/server/chunks/_1_fynia._.js +4 -4
  133. package/.next/standalone/.next/server/chunks/_1itd1o_._.js +1 -1
  134. package/.next/standalone/.next/server/chunks/_1oqfuh8._.js +3 -0
  135. package/.next/standalone/.next/server/chunks/_1xh07bp._.js +1 -1
  136. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_social_crm_route_actions_0d1aflv.js +3 -0
  137. package/.next/standalone/.next/server/chunks/lib_db-client_15le7cw.js +7 -7
  138. package/.next/standalone/.next/server/chunks/lib_linkedin-export_12imqxg.js +3 -0
  139. package/.next/standalone/.next/server/chunks/lib_rpc_05gt5ya.js +3 -0
  140. package/.next/standalone/.next/server/chunks/ssr/_0-85h6g._.js +3 -0
  141. package/.next/standalone/.next/server/chunks/ssr/_08cfj2b._.js +3 -0
  142. package/.next/standalone/.next/server/chunks/ssr/_0c_y09g._.js +1 -1
  143. package/.next/standalone/.next/server/chunks/ssr/app_settings_page_1f8mjj_.js +1 -1
  144. package/.next/standalone/.next/server/chunks/ssr/app_social_page_0h7zxda.js +2 -1
  145. package/.next/standalone/.next/server/chunks/ssr/lib_galaxy-lab_108_lu-.js +3 -0
  146. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  147. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  148. package/.next/standalone/.next/server/pages/404.html +1 -1
  149. package/.next/standalone/.next/server/pages/500.html +1 -1
  150. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  152. package/.next/standalone/.next/static/chunks/15sjx07xhpn6p.js +1 -0
  153. package/.next/standalone/.next/static/chunks/1a74dky22dxd6.js +1 -0
  154. package/.next/standalone/.next/static/chunks/{1xptlvtcz6654.css → 1x_ysly42-teq.css} +1 -1
  155. package/.next/standalone/.next/static/chunks/297e1z34yi--z.js +1 -0
  156. package/.next/standalone/.next/static/chunks/2_ak6qjxb6oa5.js +1 -0
  157. package/.next/standalone/.next/static/chunks/3ui4d-uqkqj5d.js +2 -0
  158. package/.next/standalone/CHANGELOG.md +48 -0
  159. package/.next/standalone/app/api/data/export/route.js +2 -1
  160. package/.next/standalone/app/api/scraper/route.js +5 -1
  161. package/.next/standalone/app/api/social/crm/route.js +37 -0
  162. package/.next/standalone/app/api/social/messages/route.js +44 -8
  163. package/.next/standalone/app/api/social/route.js +80 -22
  164. package/.next/standalone/app/components/ScanStatusBar.js +1 -0
  165. package/.next/standalone/app/components/settings/DataSection.js +12 -3
  166. package/.next/standalone/app/globals.css +11 -0
  167. package/.next/standalone/app/social/Crm.js +683 -0
  168. package/.next/standalone/app/social/Thread.js +90 -0
  169. package/.next/standalone/app/social/page.js +71 -60
  170. package/.next/standalone/lib/data-export.js +10 -4
  171. package/.next/standalone/lib/data-folder.js +9 -0
  172. package/.next/standalone/lib/data-import.js +13 -3
  173. package/.next/standalone/lib/linkedin-export.js +267 -46
  174. package/.next/standalone/lib/social-crm.js +415 -0
  175. package/.next/standalone/lib/social-store.js +13 -6
  176. package/.next/standalone/package-lock.json +2 -2
  177. package/.next/standalone/package.json +1 -1
  178. package/.next/standalone/scripts/scrape.py +126 -22
  179. package/.next/static/chunks/15sjx07xhpn6p.js +1 -0
  180. package/.next/static/chunks/1a74dky22dxd6.js +1 -0
  181. package/.next/static/chunks/{1xptlvtcz6654.css → 1x_ysly42-teq.css} +1 -1
  182. package/.next/static/chunks/297e1z34yi--z.js +1 -0
  183. package/.next/static/chunks/2_ak6qjxb6oa5.js +1 -0
  184. package/.next/static/chunks/3ui4d-uqkqj5d.js +2 -0
  185. package/CHANGELOG.md +48 -0
  186. package/lib/data-export.js +10 -4
  187. package/lib/data-folder.js +9 -0
  188. package/lib/data-import.js +13 -3
  189. package/lib/linkedin-export.js +267 -46
  190. package/lib/social-crm.js +415 -0
  191. package/lib/social-store.js +13 -6
  192. package/package.json +1 -1
  193. package/scripts/scrape.py +126 -22
  194. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08f5awg._.js +0 -8
  195. package/.next/standalone/.next/server/chunks/lib_18cr1gi._.js +0 -8
  196. package/.next/standalone/.next/server/chunks/ssr/_0ezj4e0._.js +0 -3
  197. package/.next/standalone/.next/server/chunks/ssr/_1errbuf._.js +0 -3
  198. package/.next/standalone/.next/server/chunks/ssr/app_components_ui_0pdmz2z.js +0 -3
  199. package/.next/standalone/.next/static/chunks/07dyt47mp4s9-.js +0 -1
  200. package/.next/standalone/.next/static/chunks/206rm6j42gl_a.js +0 -1
  201. package/.next/standalone/.next/static/chunks/2coxzjm_k6ilr.js +0 -1
  202. package/.next/standalone/.next/static/chunks/2pw6_osz1n_te.js +0 -1
  203. package/.next/standalone/app/social/Conversations.js +0 -246
  204. package/.next/static/chunks/07dyt47mp4s9-.js +0 -1
  205. package/.next/static/chunks/206rm6j42gl_a.js +0 -1
  206. package/.next/static/chunks/2coxzjm_k6ilr.js +0 -1
  207. package/.next/static/chunks/2pw6_osz1n_te.js +0 -1
  208. /package/.next/standalone/.next/static/{7zWJnSkfSoRhRsqY6ZKtD → jqE2D3zWqSGz5su948Azf}/_buildManifest.js +0 -0
  209. /package/.next/standalone/.next/static/{7zWJnSkfSoRhRsqY6ZKtD → jqE2D3zWqSGz5su948Azf}/_clientMiddlewareManifest.js +0 -0
  210. /package/.next/standalone/.next/static/{7zWJnSkfSoRhRsqY6ZKtD → jqE2D3zWqSGz5su948Azf}/_ssgManifest.js +0 -0
  211. /package/.next/static/{7zWJnSkfSoRhRsqY6ZKtD → jqE2D3zWqSGz5su948Azf}/_buildManifest.js +0 -0
  212. /package/.next/static/{7zWJnSkfSoRhRsqY6ZKtD → jqE2D3zWqSGz5su948Azf}/_clientMiddlewareManifest.js +0 -0
  213. /package/.next/static/{7zWJnSkfSoRhRsqY6ZKtD → jqE2D3zWqSGz5su948Azf}/_ssgManifest.js +0 -0
@@ -59,7 +59,18 @@ _ENV_LOCAL = _load_env_local()
59
59
  # a server they don't control.
60
60
  APP_URL = os.getenv("APP_URL", "http://localhost:3000")
61
61
  MESSAGING_URL = "https://www.linkedin.com/messaging/"
62
+ # The daily sync reads the top of your messages list: this many scrolls.
62
63
  MESSAGE_SCROLLS = 15
64
+ # Full history (--messages --full-history, the Social tab's "Read my whole
65
+ # history"): keep scrolling until the list stops growing, but never past these
66
+ # ceilings, at the same fixed pace as everything else the scanner does.
67
+ MESSAGE_HISTORY_SCROLLS = 60
68
+ MESSAGE_HISTORY_MAX = 1000
69
+ # Scrolls in a row that bring no conversation it hadn't seen: the end of the list.
70
+ MESSAGE_HISTORY_STILL = 3
71
+ # Seconds after each scroll for the list to load. Fixed, on purpose: the
72
+ # scanner is openly slow, never made to look like a person with random waits.
73
+ MESSAGE_WAIT = 4
63
74
 
64
75
  CONNECTIONS_URL = "https://www.linkedin.com/mynetwork/invite-connect/connections/"
65
76
 
@@ -2068,14 +2079,54 @@ def voyager_conversations(payload):
2068
2079
  return out
2069
2080
 
2070
2081
 
2071
- def sync_messages(headless=False):
2082
+ def conversation_id(c):
2083
+ """One conversation, however many of LinkedIn's responses mention it: its link, else who's in it."""
2084
+ return c.get("url") or ",".join(c.get("people") or [])
2085
+
2086
+
2087
+ def tally_conversations(seen, convos):
2088
+ """Add these conversations to `seen` (id -> conversation, the newest activity
2089
+ kept) and say how many it didn't have before. The full-history read stops
2090
+ when scrolling stops bringing new ones."""
2091
+ new = 0
2092
+ for c in convos:
2093
+ k = conversation_id(c)
2094
+ if not k:
2095
+ continue
2096
+ if k not in seen:
2097
+ new += 1
2098
+ seen[k] = c
2099
+ elif c.get("at", 0) >= seen[k].get("at", 0):
2100
+ seen[k] = c
2101
+ return new
2102
+
2103
+
2104
+ def history_done(new_per_scroll, found, max_scrolls=MESSAGE_HISTORY_SCROLLS,
2105
+ max_found=MESSAGE_HISTORY_MAX, still=MESSAGE_HISTORY_STILL):
2106
+ """Why a full-history read should stop now, or None to scroll again.
2107
+ `new_per_scroll` is how many new conversations each scroll so far brought;
2108
+ `found` how many there are in all."""
2109
+ if found >= max_found:
2110
+ return f"reached {max_found:,} conversations, the most one read takes"
2111
+ if len(new_per_scroll) >= max_scrolls:
2112
+ return f"reached {max_scrolls} scrolls, the most one read takes"
2113
+ if len(new_per_scroll) >= still and not any(new_per_scroll[-still:]):
2114
+ return "the list stopped growing: that's the whole history"
2115
+ return None
2116
+
2117
+
2118
+ def sync_messages(headless=False, full_history=False):
2072
2119
  """Experimental: read your LinkedIn messages list once, for the Social tab. Opens
2073
2120
  Messaging in your own Chrome, scrolls the list a few times, and keeps from LinkedIn's
2074
- own data who each 1:1 conversation is with, when it was last active, whether it has
2075
- unread messages, its link and who wrote last. The newest message's words go to the
2076
- app only while Keep my messages is on there. No search budget."""
2121
+ own data who each conversation is with, when it was last active, whether it has
2122
+ unread messages, its link and who wrote last. The newest message's words (1:1 only)
2123
+ go to the app only while Keep my messages is on there. No search budget.
2124
+
2125
+ full_history: keep scrolling until no new conversations load (history_done), for
2126
+ the whole list rather than its top. Same fixed waits; opens no conversation."""
2077
2127
  from playwright.sync_api import sync_playwright
2078
2128
  kept = []
2129
+ seen = {}
2079
2130
  with sync_playwright() as p:
2080
2131
  browser = p.chromium.launch_persistent_context(
2081
2132
  user_data_dir=get_scraper_profile_path(), headless=headless, channel="chrome",
@@ -2086,13 +2137,38 @@ def sync_messages(headless=False):
2086
2137
  browser.close()
2087
2138
  return
2088
2139
  page.on("response", lambda r: kept.append(r) if "/voyager/api/" in r.url and "messag" in r.url.lower() else None)
2089
- print("Opening your messages list...")
2140
+
2141
+ def wait(seconds):
2142
+ # Playwright hands over the responses that came in only while it's
2143
+ # being called, so wait through it, not with time.sleep.
2144
+ try:
2145
+ page.wait_for_timeout(seconds * 1000)
2146
+ except Exception:
2147
+ time.sleep(seconds)
2148
+
2149
+ def read_new():
2150
+ got = kept[:]
2151
+ del kept[:len(got)]
2152
+ convos = []
2153
+ for r in got:
2154
+ try:
2155
+ data = r.json()
2156
+ except Exception:
2157
+ continue
2158
+ _wire_sample(data, prefix="messages")
2159
+ convos.extend(voyager_conversations(data))
2160
+ return tally_conversations(seen, convos)
2161
+
2162
+ print("Opening your messages list" + (", to read its whole history..." if full_history else "..."))
2090
2163
  try:
2091
2164
  page.goto(MESSAGING_URL, wait_until="domcontentloaded")
2092
2165
  except Exception:
2093
2166
  pass
2094
- time.sleep(6)
2095
- for i in range(MESSAGE_SCROLLS):
2167
+ wait(6)
2168
+ read_new()
2169
+ scrolls = MESSAGE_HISTORY_SCROLLS if full_history else MESSAGE_SCROLLS
2170
+ new_per_scroll = []
2171
+ for i in range(scrolls):
2096
2172
  if stop_requested() or _window_closed(page):
2097
2173
  break
2098
2174
  try:
@@ -2105,19 +2181,21 @@ def sync_messages(headless=False):
2105
2181
  if (l) l.scrollTop = l.scrollHeight; }""")
2106
2182
  except Exception:
2107
2183
  pass
2108
- print(f" Reading the list ({i + 1} of {MESSAGE_SCROLLS})...", flush=True)
2109
- time.sleep(4)
2110
- convos = []
2111
- for r in kept:
2112
- try:
2113
- data = r.json()
2114
- except Exception:
2115
- continue
2116
- _wire_sample(data, prefix="messages")
2117
- convos.extend(voyager_conversations(data))
2184
+ wait(MESSAGE_WAIT)
2185
+ new_per_scroll.append(read_new())
2186
+ if full_history:
2187
+ print(f" Reading the list (scroll {i + 1}, {len(seen):,} conversations so far)...", flush=True)
2188
+ why = history_done(new_per_scroll, len(seen))
2189
+ if why:
2190
+ print(f" Stopping: {why}.", flush=True)
2191
+ break
2192
+ else:
2193
+ print(f" Reading the list ({i + 1} of {scrolls})...", flush=True)
2118
2194
  browser.close()
2119
- _me, people = live_people(convos)
2120
- print(f" Found {len(convos)} conversations in LinkedIn's data, {len(people)} with one person.")
2195
+ convos = list(seen.values())
2196
+ me, people = live_people(convos)
2197
+ groups = live_groups(convos, me)
2198
+ print(f" Found {len(convos)} conversations in LinkedIn's data: {len(people)} with one person, {len(groups)} groups.")
2121
2199
  # The newest message's words go to the app only if Keep my messages is on
2122
2200
  # there. The app checks too; this way they don't even leave the scanner.
2123
2201
  keep = False
@@ -2131,14 +2209,37 @@ def sync_messages(headless=False):
2131
2209
  if v.get("preview"):
2132
2210
  v["preview"]["text"] = None
2133
2211
  try:
2134
- r = requests.put(f"{APP_URL}/api/social", json={"live": people}, headers=app_headers(), timeout=30)
2212
+ r = requests.put(f"{APP_URL}/api/social", json={"live": people, "groups": groups}, headers=app_headers(), timeout=60)
2135
2213
  got = r.json() if r.ok else {}
2136
2214
  matched, unmatched = got.get("people", 0), got.get("unmatched", 0)
2137
- print(f" Saved for the Social tab: {matched} matched to your connections, {unmatched} not.")
2215
+ print(f" Saved for the Social tab: {matched} of your connections, {unmatched} people who aren't connections, "
2216
+ f"{len(groups)} groups.")
2138
2217
  except Exception as e:
2139
2218
  print(f" Couldn't save them: {e}")
2140
2219
 
2141
2220
 
2221
+ def live_groups(convos, me):
2222
+ """The messages sync's group conversations: who's in them (everyone but you,
2223
+ with their names for the app to match to your connections; it keeps the names
2224
+ only of people who aren't), when each was last active, unread, its link and
2225
+ whether someone else wrote last. No words: a group's newest message isn't sent."""
2226
+ groups = {}
2227
+ for c in convos:
2228
+ others = [u for u in c["people"] if u != me]
2229
+ if len(others) < 2:
2230
+ continue
2231
+ k = conversation_id(c)
2232
+ if k in groups and c["at"] <= groups[k]["last"]:
2233
+ continue
2234
+ latest = c.get("latest")
2235
+ sender = latest.get("from") if latest else None
2236
+ groups[k] = {"threadUrl": c.get("url"), "people": others,
2237
+ "names": {u: n for u, n in (c.get("names") or {}).items() if u in others},
2238
+ "last": c["at"], "unread": c["unread"],
2239
+ "lastFromThem": (sender != me) if sender in c["people"] else None}
2240
+ return list(groups.values())
2241
+
2242
+
2142
2243
  def live_people(convos):
2143
2244
  """The messages sync's conversations, per person: you are the one in the most
2144
2245
  conversations, and only the 1:1 ones are kept. For each person, their newest
@@ -4207,6 +4308,9 @@ Examples:
4207
4308
  parser.add_argument("--company", type=str, help="Scan everyone the app can see at one company")
4208
4309
  parser.add_argument("--messages", action="store_true",
4209
4310
  help="Experimental: read your messages list once for the Social tab (who, when, unread; the newest message's words only if Keep my messages is on)")
4311
+ parser.add_argument("--full-history", action="store_true",
4312
+ help=f"With --messages: keep scrolling until the whole list has loaded (at most {MESSAGE_HISTORY_SCROLLS} scrolls "
4313
+ f"or {MESSAGE_HISTORY_MAX:,} conversations), not just its top")
4210
4314
  parser.add_argument("--experimental", action="store_true",
4211
4315
  help="Auto-Bridge, experimental: all-day pacing (sittings, rests, daytime only, "
4212
4316
  "waits for the daily budget) and reading LinkedIn's own data beside the page text")
@@ -4305,7 +4409,7 @@ Examples:
4305
4409
  done = sum(1 for r in results if r.get("status") == "done")
4306
4410
  print(f"\nDone. {done}/{len(results)} bridges mapped.")
4307
4411
  elif args.messages:
4308
- sync_messages(headless=args.headless)
4412
+ sync_messages(headless=args.headless, full_history=args.full_history)
4309
4413
  elif args.search:
4310
4414
  scrape_full(headless=args.headless)
4311
4415
  elif args.full:
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,40643,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(22016),o=e.i(40996),l=e.i(68792),u=e.i(99883);let i={full:"Scanning your network",refresh:"Checking for new connections",bridge:"Scanning a circle",resume:"Carrying on with a circle","resume-all":"Carrying on with circles","auto-bridge":"Auto-Bridge","auto-bridge-retry":"Auto-Bridge",rescrape:"Re-scanning a circle",login:"Signing in to LinkedIn",setup:"Setting up the scanner",company:"Scanning a company",photos:"Saving photos",messages:"Reading your messages list","messages-full":"Reading your whole messages history"};e.s(["default",0,function(){let e,s,[c,d]=(0,r.useState)(()=>(0,o.scannerNow)()),[f,p]=(0,r.useState)(!1),[h,g]=(0,r.useState)(!1),[y,m]=(0,r.useState)(!1),b=(0,r.useSyncExternalStore)(l.watchAllDay,l.allDayNow,()=>!1),v=(0,r.useSyncExternalStore)(u.watchActivities,u.activitiesNow,u.noActivities);(0,r.useEffect)(()=>(0,o.watchScanner)(()=>{let e=(0,o.scannerNow)();d(e),e.running||p(!1)}),[]);let x=(0,n.usePathname)(),[_,S]=(0,r.useState)(null);(0,r.useEffect)(()=>{let e=null,t=null,r=0,n=()=>{r=0;let n=document.querySelector("header");n!==e&&(t?.disconnect(),t=null,(e=n)&&(t=new ResizeObserver(a)).observe(e));let o=e?Math.round(e.getBoundingClientRect().bottom):null;S(e=>e===o?e:o)},a=()=>{r||(r=requestAnimationFrame(n))};a();let o=new MutationObserver(a);return o.observe(document.body,{childList:!0,subtree:!0}),window.addEventListener("resize",a),()=>{cancelAnimationFrame(r),t?.disconnect(),o.disconnect(),window.removeEventListener("resize",a)}},[x]);let j=!!c?.running,P=v[v.length-1]||null;if(!j&&!P&&!b)return null;let O=c?.progress,w=O?.kind==="batch"&&O.total?`${O.current||O.done||0} of ${O.total}`:O?.kind==="walk"&&O.total?`${(O.done||0).toLocaleString()} of ${O.total.toLocaleString()}`:O?.kind==="saving"?"saving":null,C=O?.total?Math.min(1,(O.current||O.done||0)/O.total):P?.progress??null,E=c?.budget,R=j?[...c.log||[]].reverse().find(e=>e&&e.trim())?.trim():null,T=h||y,A=j?"#00ff88":P?"warn"===P.tone?"#FFD700":"#3498DB":"#556",N=j?i[c.action]||"Scanning":P?P.label:"Auto scan",M=j?w:P?P.detail:null;return(0,t.jsxs)("div",{role:"status","aria-live":"polite",onMouseEnter:()=>g(!0),onMouseLeave:()=>g(!1),style:{position:"fixed",left:"50%",top:_??"var(--scan-bar-top, 94px)",transform:"translateX(-50%)",zIndex:60,maxWidth:"calc(100vw - 32px)",minWidth:j||P?180:0,padding:T?"8px 14px 10px":"4px 12px 6px",borderRadius:"0 0 16px 16px",borderTop:"none",border:`1px solid ${j?"rgba(0,255,136,0.25)":"rgba(255,255,255,0.1)"}`,background:"rgba(8,10,22,0.96)",color:"#cfd8d8",fontSize:12,opacity:j||P||T?1:.55,boxShadow:j?"0 6px 20px rgba(0,0,0,0.35)":"none",transition:"padding 0.18s ease, opacity 0.18s ease"},children:[(0,t.jsxs)("button",{onClick:()=>m(e=>!e),"aria-expanded":T,title:T?"Close":"Open",style:{display:"flex",alignItems:"center",gap:8,width:"100%",background:"none",border:"none",color:"inherit",font:"inherit",cursor:"pointer",padding:0,whiteSpace:"nowrap"},children:[(0,t.jsx)("span",{className:j?"notch-pulse":void 0,style:{width:7,height:7,borderRadius:"50%",background:A,flexShrink:0}}),(0,t.jsx)("b",{style:{color:j||P?"#fff":"#b8c4c4",fontWeight:600},children:N}),M&&(0,t.jsx)("span",{style:{color:"#8b9a9a"},children:M}),!j&&!P&&T&&(0,t.jsx)("span",{style:{color:"#8b9a9a"},children:"ready · press Auto scan beside Scan to start"})]}),null!=C&&(0,t.jsx)("div",{style:{height:2,marginTop:5,borderRadius:2,background:"rgba(255,255,255,0.08)",overflow:"hidden"},children:(0,t.jsx)("div",{style:{width:`${Math.round(100*C)}%`,height:"100%",background:j?"#00ff88":"#3498DB",transition:"width 0.4s ease"}})}),T&&j&&(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:12,marginTop:8,flexWrap:"wrap"},children:[c.target?.name&&(0,t.jsx)("span",{children:c.target.name}),E&&(0,t.jsxs)("span",{style:{color:(e=E.searches,(s=E.cap)?e/s>=.9?"#ff6b6b":e/s>=.6?"#FFD700":"#00ff88":"#8b9a9a")},title:"Searches on your LinkedIn account in the last 24 hours, and your daily budget",children:[E.searches,E.cap?` of ${E.cap}`:""," searches today"]}),R&&(0,t.jsx)("span",{style:{color:"#667",maxWidth:280,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:R,children:R}),(0,t.jsx)(a.default,{href:"/setup",style:{color:"#3498DB",textDecoration:"none"},children:"Details"}),(0,t.jsx)("button",{onClick:async()=>{p(!0);try{await (0,o.stopScrape)()}catch{p(!1)}},disabled:f,title:"Stops after saving what's been read; Resume on the Scan page carries on from the same page",style:{padding:"3px 10px",borderRadius:8,fontSize:12,cursor:f?"default":"pointer",background:"rgba(255,107,107,0.12)",color:"#ff9b9b",border:"1px solid rgba(255,107,107,0.35)"},children:f?"Stopping…":"Stop"})]}),T&&!j&&P?.detail&&(0,t.jsx)("div",{style:{marginTop:6,color:"#8b9a9a"},children:P.detail})]})}])},87915,e=>{"use strict";var t=e.i(71645),r=e.i(40996),n=e.i(64745);let a=!1;e.s(["default",0,function(){return(0,t.useEffect)(()=>{if(n.IS_DEMO||a)return;let e=()=>{};return fetch("/api/social").then(e=>e.json()).then(({social:t})=>{if(!t?.autoSync||a)return;let n=t.liveAt?Date.parse(t.liveAt):0,o=new Date().getHours();Date.now()-n<864e5||o<9||o>=19||(e=(0,r.watchScanner)(()=>{let t=(0,r.scannerNow)();t.known&&!a&&(a=!0,e(),t.running||(0,r.beginScrape)("messages").catch(()=>{}))}))}).catch(()=>{}),()=>e()},[]),null}])},37711,e=>{"use strict";var t=e.i(43476),r=e.i(71645);e.s(["default",0,function(){let[e,n]=(0,r.useState)(null);return((0,r.useEffect)(()=>{let e=!0;return fetch("/api/update").then(e=>e.json()).then(t=>{e&&t?.restartNeeded&&n(t)}).catch(()=>{}),()=>{e=!1}},[]),e)?(0,t.jsxs)("div",{role:"status",style:{position:"fixed",left:0,right:0,bottom:0,zIndex:9999,background:"linear-gradient(90deg, #FFD700, #FF6B35)",color:"#1a1200",padding:"9px 16px",fontSize:13,fontWeight:600,lineHeight:1.5,display:"flex",alignItems:"center",justifyContent:"center",gap:10,flexWrap:"wrap",textAlign:"center"},children:[(0,t.jsxs)("span",{children:["You have newer code on disk (",e.sha,") than this server is running (",e.bootSha,"). Restart it to see the changes — ",(0,t.jsx)("code",{style:{background:"rgba(0,0,0,0.16)",padding:"1px 6px",borderRadius:4},children:"Ctrl-C"})," in the terminal, then ",(0,t.jsx)("code",{style:{background:"rgba(0,0,0,0.16)",padding:"1px 6px",borderRadius:4},children:"npm run dev"}),"."]}),(0,t.jsx)("button",{onClick:()=>n(null),style:{border:"none",background:"rgba(0,0,0,0.18)",color:"#1a1200",borderRadius:6,padding:"3px 10px",fontWeight:700,cursor:"pointer"},children:"Dismiss"})]}):null}])},15812,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(65084),a=e.i(64745),o=e.i(7837);let l=(0,r.createContext)({userId:null,userName:null,userProfile:null,ready:!1});e.s(["default",0,function({children:e}){let[u,i]=(0,r.useState)(null),[s,c]=(0,r.useState)(null),[d,f]=(0,r.useState)(null),[p,h]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{if(a.IS_DEMO){i(a.DEMO_USER.id),c(a.DEMO_USER.name),f({name:a.DEMO_USER.name,headline:a.DEMO_USER.headline,role:"",company:"",industry:"",sectors:[],goals:[],linkedin_url:""}),h(!0);return}if((0,o.hasCsvNetwork)()){i(o.CSV_USER.id),c(o.CSV_USER.name),f({name:o.CSV_USER.name,headline:"Imported from your LinkedIn CSV",role:"",company:"",industry:"",sectors:[],goals:[],linkedin_url:""}),h(!0);return}fetch("/api/users?me=1").then(e=>e.json()).then(e=>{let t=e.user;if(!t)throw Error("no profile");(0,n.setUser)(t.id,t.name),i(t.id),c(t.name),f({name:t.name,headline:t.headline||"",role:t.role||"",company:t.company||"",industry:t.industry||"",sectors:t.sectors||[],goals:t.goals||[],linkedin_url:t.linkedin_url||""})}).catch(()=>{(0,n.hasUser)()&&(i((0,n.getUserId)()),c((0,n.getUserName)()))}).finally(()=>h(!0))},[]),(0,t.jsx)(l.Provider,{value:{userId:u,userName:s,userProfile:d,ready:p,login:(e,t)=>{(0,n.setUser)(e,t),i(e),c(t),fetch(`/api/users?id=${e}`).then(e=>e.json()).then(e=>{e.user&&f({name:e.user.name,headline:e.user.headline||"",role:e.user.role||"",company:e.user.company||"",industry:e.user.industry||"",sectors:e.user.sectors||[],goals:e.user.goals||[],linkedin_url:e.user.linkedin_url||""})}).catch(()=>{})}},children:e})},"useUser",0,function(){return(0,r.useContext)(l)}])},64745,e=>{"use strict";var t=e.i(47167),r=e.i(7837);let n="true"===t.default.env.NEXT_PUBLIC_DEMO_MODE,a=null;async function o(){if(a)return a;let e=await fetch("/demo-data.json",{cache:"no-cache"});if(!e.ok)throw Error("demo-data.json not found — run: node scripts/gen-synthetic.mjs");let t=await e.json();return a={degree1:t.degree1||[],degree2:t.degree2||[]}}async function l(){let e=await o();return(0,r.saveSessionNetwork)({degree1:e.degree1,degree2:e.degree2,source:"sample"}),{degree1:e.degree1.length,degree2:e.degree2.length}}e.s(["DEMO_USER",0,{id:"synthetic-demo-user",name:"You",headline:"Sample network"},"IS_DEMO",0,n,"loadDemoNetwork",0,o,"loadSampleIntoSession",0,l])},68792,99883,e=>{"use strict";var t=e.i(40996);let r=(e,t)=>{try{let r=localStorage.getItem(e);return null===r?t:JSON.parse(r)}catch{return t}};e.s(["allDayNow",0,function(){try{return"true"===localStorage.getItem("six-degrees-experimental-auto")}catch{return!1}},"startAutoScan",0,function(){let e=r("six-degrees-bridge-order","newest");return(0,t.beginScrape)("auto-bridge",{experimental:!0,maxBridges:10,order:e,tiers:"score"===e?["S","A"]:[],maxPages:r("six-degrees-bridge-pages-v2",100),deeper:r("six-degrees-bridge-finish",!0)})},"watchAllDay",0,function(e){return window.addEventListener("storage",e),window.addEventListener("six-degrees:experimental",e),()=>{window.removeEventListener("storage",e),window.removeEventListener("six-degrees:experimental",e)}}],68792);let n=new Set,a=[],o=[];e.s(["activitiesNow",0,()=>a,"noActivities",0,()=>o,"showActivity",0,function(e){return e?.id?(a=[...a.filter(t=>t.id!==e.id),e],n.forEach(e=>e()),()=>{var t;return t=e.id,void(a.some(e=>e.id===t)&&(a=a.filter(e=>e.id!==t),n.forEach(e=>e())))}):()=>{}},"watchActivities",0,function(e){return n.add(e),()=>n.delete(e)}],99883)},40996,e=>{"use strict";async function t(){let e=await fetch("/api/scraper");if(!e.ok)throw Error("Could not reach the app.");return e.json()}async function r(e,t,n={}){let a=await fetch("/api/scraper",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:e,...t?{name:t}:{},...n})}),o=await a.json().catch(()=>({}));if(!a.ok)throw Error(o.error||"Could not start the scanner.");return o}async function n(e){let t=await fetch(`/api/scraper?resume=${encodeURIComponent(e)}`);return t.ok?(await t.json()).resume??null:null}Symbol.for("six-degrees.scan-state");let a=Object.freeze({skips:[],read:[]});async function o(){try{let e=await fetch("/api/scraper?reach=1");if(!e.ok)return a;let t=await e.json();return{skips:Array.isArray(t.skips)?t.skips:[],read:Array.isArray(t.read)?t.read:[]}}catch{return a}}async function l(e){let t=await fetch(`/api/scraper?person=${encodeURIComponent(e)}`);return t.ok?t.json():{person:null}}async function u(){await fetch("/api/scraper",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"cancel"})})}let i=Object.freeze({known:!1,running:!1,pending:!1,action:null,target:null,startedAt:null,progress:null,log:[],finished:[]}),s=new Set,c=i,d=JSON.stringify(c),f=null,p=null,h=0,g=!1,y=new Set;function m(e){let t=JSON.stringify(e);if(t!==d)for(let r of(d=t,c=Object.freeze(e),[...s]))r()}async function b(){(!("u">typeof document&&document.hidden)||c.running)&&await function(){if(p&&p.epoch===h)return p.promise;let e=h,t=fetch("/api/scraper?job=1").then(e=>e.ok?e.json():null).then(t=>{e===h&&function(e){if(!e||"object"!=typeof e)return;let t=!0===e.running;t&&null!=e.startedAt&&y.add(e.startedAt);let r=(Array.isArray(e.recent)?e.recent:[]).filter(e=>y.has(e.startedAt)).map(r=>({...r,log:!t&&r.startedAt===e.startedAt&&Array.isArray(e.log)?e.log:[]}));m({known:!0,running:t||g,pending:g&&!t,action:t?e.action??null:g?c.action:null,target:t?e.target??null:g?c.target:null,startedAt:t?e.startedAt??null:null,progress:t?e.progress??null:null,budget:t?e.budget??null:null,log:t&&Array.isArray(e.log)?e.log:[],finished:r})}(t)}).catch(()=>{}).finally(()=>{p?.promise===t&&(p=null)});return p={epoch:e,promise:t},t}(),clearTimeout(f),f=s.size?setTimeout(b,c.running?1500:5e3):null}function v(e){return s.add(e),1===s.size&&b(),()=>{s.delete(e),s.size||(clearTimeout(f),f=null)}}async function x(e,{name:t,id:n,onLog:a,...o}={}){let l;h++,g=!0,m({...c,known:!0,running:!0,pending:!0,action:e,target:t||n?{id:n??null,name:t??null}:null,startedAt:null,progress:null,log:[]});try{let a=!1;try{a=!0===JSON.parse(localStorage.getItem("six-degrees-hide-chrome")||"false")}catch{}l=await r(e,t,{...n?{id:n}:{},...a?{headless:!0}:{},...o})}catch(e){throw g=!1,h++,c.pending&&m({...c,running:!1,pending:!1,action:null,target:null,log:[]}),b(),e}g=!1,h++;let u=l?.startedAt??null;null!=u&&y.add(u);let i=new Promise(e=>{let t=v(()=>{c.running&&c.startedAt===u&&a?.(c.log);let r=null==u?c.running?null:{exitCode:null,failure:null,log:[]}:c.finished.find(e=>e.startedAt===u);r&&(t(),r.log.length&&a?.(r.log),e(r))});b()});return{startedAt:u,ended:i}}function _(e){return!!e?.target&&["bridge","rescrape","resume"].includes(e.action)}e.s(["NO_SCAN_NOTES",0,a,"SCANNER_UNKNOWN",0,i,"beginScrape",0,x,"busyReason",0,function(e=c){if(!e?.running)return null;let t=e.target?.name;switch(e.action){case"bridge":case"rescrape":case"resume":return t?`${t}’s circle is being scanned`:"A circle is being scanned";case"company":return t?`${t} is being scanned`:"A company is being scanned";case"auto-bridge":case"auto-bridge-retry":case"resume-all":return"Your bridges are being mapped, one by one";case"full":case"refresh":return"Your own connections are being scanned";default:switch(e.action){case"install":return"The scanner's packages are being installed";case"setup":return"The scanner is being set up";case"login":return"The LinkedIn sign-in window is open";case"photos":return"Profile photos are being saved";default:return"A scan is running"}}},"isCircleScan",0,_,"loadScanNotes",0,o,"notReadyMessage",0,function(e){if(!e)return"Could not reach the app.";let t=e.checks||{};return t.scriptsFound?t.dependencies?t.chrome?null:"Google Chrome is not installed.":t.python||t.download?"The scanner is not set up yet — open Scan to set it up.":"No Python 3.10 to 3.14 is installed on this machine.":"The scanner files are missing from this install."},"pickedPerson",0,l,"resumePoint",0,n,"runScrape",0,function(e,t={}){return x(e,t).then(e=>e.ended)},"scannerNow",0,function(){return c},"scansCircleOf",0,function(e,t){if(!_(e)||!t)return!1;let{id:r,name:n}=e.target;return r&&t.id?r===t.id:!!n&&n===t.name},"scraperStatus",0,t,"stopScrape",0,u,"watchScanner",0,v],40996)},22016,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return m},useLinkStatus:function(){return v}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(90809),l=e.r(43476),u=o._(e.r(71645)),i=e.r(95057),s=e.r(8372),c=e.r(18581),d=e.r(18967),f=e.r(5550),p=e.r(88540),h=e.r(91949),g=e.r(73668),y=e.r(9396);function m(t){var r;let n,a,o,[m,v]=(0,u.useOptimistic)(h.IDLE_LINK_STATUS),x=(0,u.useRef)(null),{href:_,as:S,children:j,prefetch:P=null,passHref:O,replace:w,shallow:C,scroll:E,onClick:R,onMouseEnter:T,onTouchStart:A,legacyBehavior:N=!1,onNavigate:M,transitionTypes:k,ref:D,unstable_dynamicOnHover:F,...L}=t;n=j,N&&("string"==typeof n||"number"==typeof n)&&(n=(0,l.jsx)("a",{children:n}));let I=u.default.useContext(s.AppRouterContext),B=!1!==P,U=!1===P?"none":!0===P?"full":"auto",$="none"!==U?"auto"===U?y.FetchStrategy.PPR:y.FetchStrategy.Full:y.FetchStrategy.PPR,z="string"==typeof(r=S||_)?r:(0,i.formatUrl)(r);if(N){if(n?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});a=u.default.Children.only(n)}let H=N?a&&"object"==typeof a&&a.ref:D,V,K=u.default.useCallback(e=>(null!==I&&(x.current=(0,h.mountLinkInstance)(e,z,I,$,B,v,V)),()=>{x.current&&((0,h.unmountLinkForCurrentNavigation)(x.current),x.current=null),(0,h.unmountPrefetchableInstance)(e)}),[B,z,I,$,v,V]),W={ref:(0,c.useMergedRef)(K,H),onClick(t){N||"function"!=typeof R||R(t),N&&a.props&&"function"==typeof a.props.onClick&&a.props.onClick(t),!I||t.defaultPrevented||function(t,r,n,a,o,l,i,s="none"){if("u">typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,g.isLocalURL)(r)){a&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),l){let e=!1;if(l({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:f}=e.r(99781);u.default.startTransition(()=>{f(r,a?"replace":"push",!1===o?p.ScrollBehavior.NoScroll:p.ScrollBehavior.Default,n.current,i,s)})}}(t,z,x,w,E,M,k,U)},onMouseEnter(e){N||"function"!=typeof T||T(e),N&&a.props&&"function"==typeof a.props.onMouseEnter&&a.props.onMouseEnter(e),I&&B&&(0,h.onNavigationIntent)(e.currentTarget,!0===F)},onTouchStart:function(e){N||"function"!=typeof A||A(e),N&&a.props&&"function"==typeof a.props.onTouchStart&&a.props.onTouchStart(e),I&&B&&(0,h.onNavigationIntent)(e.currentTarget,!0===F)}};return(0,d.isAbsoluteUrl)(z)?W.href=z:N&&!O&&("a"!==a.type||"href"in a.props)||(W.href=(0,f.addBasePath)(z)),o=N?u.default.cloneElement(a,W):(0,l.jsx)("a",{...L,...W,children:n}),(0,l.jsx)(b.Provider,{value:m,children:o})}let b=(0,u.createContext)(h.IDLE_LINK_STATUS),v=()=>(0,u.useContext)(b);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},28298,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useRouterBFCache",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t,r){let[a,o]=(0,n.useState)(()=>({tree:e,cacheNode:t,stateKey:r,next:null}));if(a.tree===e)return a;let l={tree:e,cacheNode:t,stateKey:r,next:null},u=1,i=a,s=l;for(;null!==i&&u<1;){if(i.stateKey===r){s.next=i.next;break}{u++;let e={tree:i.tree,cacheNode:i.cacheNode,stateKey:i.stateKey,next:null};s.next=e,s=e}i=i.next}return o(l),l}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},47257,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ClientPageRoot",{enumerable:!0,get:function(){return s}});let n=e.r(43476),a=e.r(8372),o=e.r(71645),l=e.r(33906),u=e.r(61994),i=e.r(15783);function s({Component:e,serverProvidedParams:t}){let r,c;if(null!==t)r=t.searchParams,c=t.params;else{let e=(0,o.use)(a.LayoutRouterContext);c=null!==e?e.parentParams:{},r=(0,l.urlSearchParamsToParsedUrlQuery)((0,o.use)(u.SearchParamsContext))}let d=(0,i.createClientSearchParams)(r),f=(0,i.createClientParams)(c);return(0,n.jsx)(e,{params:f,searchParams:d})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92825,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ClientSegmentRoot",{enumerable:!0,get:function(){return u}});let n=e.r(43476),a=e.r(8372),o=e.r(71645),l=e.r(15783);function u({Component:e,slots:t,serverProvidedParams:r}){let i;if(null!==r)i=r.params;else{let e=(0,o.use)(a.LayoutRouterContext);i=null!==e?e.parentParams:{}}let s=(0,l.createClientParams)(i);return(0,n.jsx)(e,{...t,params:s})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},68017,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"HTTPAccessFallbackBoundary",{enumerable:!0,get:function(){return c}});let n=e.r(90809),a=e.r(43476),o=n._(e.r(71645)),l=e.r(90373),u=e.r(54394),i=e.r(8372);class s extends o.default.Component{constructor(e){super(e),this.state={triggeredStatus:void 0,previousPathname:e.pathname}}componentDidCatch(){}static getDerivedStateFromError(e){if((0,u.isHTTPAccessFallbackError)(e))return{triggeredStatus:(0,u.getAccessFallbackHTTPStatus)(e)};throw e}static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPathname&&t.triggeredStatus?{triggeredStatus:void 0,previousPathname:e.pathname}:{triggeredStatus:t.triggeredStatus,previousPathname:e.pathname}}render(){let{notFound:e,forbidden:t,unauthorized:r,children:n}=this.props,{triggeredStatus:o}=this.state,l={[u.HTTPAccessErrorStatus.NOT_FOUND]:e,[u.HTTPAccessErrorStatus.FORBIDDEN]:t,[u.HTTPAccessErrorStatus.UNAUTHORIZED]:r};if(o){let i=o===u.HTTPAccessErrorStatus.NOT_FOUND&&e,s=o===u.HTTPAccessErrorStatus.FORBIDDEN&&t,c=o===u.HTTPAccessErrorStatus.UNAUTHORIZED&&r;return i||s||c?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("meta",{name:"robots",content:"noindex"}),!1,l[o]]}):n}return n}}function c({notFound:e,forbidden:t,unauthorized:r,children:n}){let u=(0,l.useUntrackedPathname)(),d=(0,o.useContext)(i.MissingSlotContext);return e||t||r?(0,a.jsx)(s,{pathname:u,notFound:e,forbidden:t,unauthorized:r,missingSlots:d,children:n}):(0,a.jsx)(a.Fragment,{children:n})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},22976,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={InstantValidationBoundaryContext:function(){return o},PlaceValidationBoundaryBelowThisLevel:function(){return l},RenderValidationBoundaryAtThisLevel:function(){return u},SlotMarker:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=null,l=null,u=null,i=null;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},77694,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={InstantValidationBoundaryContext:function(){return o.InstantValidationBoundaryContext},PlaceValidationBoundaryBelowThisLevel:function(){return o.PlaceValidationBoundaryBelowThisLevel},RenderValidationBoundaryAtThisLevel:function(){return o.RenderValidationBoundaryAtThisLevel},SlotMarker:function(){return o.SlotMarker}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(22976);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},39756,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={LoadingBoundaryProvider:function(){return O},default:function(){return C}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(55682),l=e.r(90809),u=e.r(43476),i=l._(e.r(71645)),s=o._(e.r(74080)),c=e.r(8372),d=e.r(1244),f=e.r(72383),p=e.r(91915),h=e.r(58442),g=e.r(68017);e.r(77694);let y=e.r(70725),m=e.r(28298);e.r(74180);let b=e.r(61994),v=e.r(33906),x=e.r(95871);s.default.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function _(e,t,r){let n=e.getClientRects();if(0===n.length)return 0;let a=1/0;for(let e=0;e<n.length;e++){let t=n[e];t.top<a&&(a=t.top)}return a>=r()&&a<=t?1:2}i.default.Component;let S=function(e){let t=i.default.useRef(null);return(0,i.useLayoutEffect)(()=>{let{focusAndScrollRef:r,cacheNode:n}=e,a=r.forceScroll?r.scrollRef:n.scrollRef;if(null===a||!a.current)return;let o=null,l=r.hashFragment;if(l){var u;if(null===(o="top"===(u=l)?document.body:document.getElementById(u)??document.getElementsByName(u)[0]??null)){a.current=!1,r.onlyHashChange=!1,r.hashFragment=null;return}}else o=t.current;if(null===o)return;let i=!1;(0,p.disableSmoothScrollDuringRouteTransition)(()=>{let e=document.documentElement,t=null,r=null,n=null,u=()=>{var r,a;let o,l;return null===n&&(r=e,a=t,n=!Number.isFinite(l=Number.parseFloat(o=getComputedStyle(r).scrollPaddingTop))||l<0?0:o.endsWith("px")?l:o.endsWith("%")?l/100*a:0),n};(l||(t=e.clientHeight,0!==(r=_(o,t,u))))&&((i=!0,a.current=!1,l)?o.scrollIntoView():1!==r&&(e.scrollTop=0,2===_(o,t,u)&&o.scrollIntoView()))},{dontForceLayout:!0,onlyHashChange:r.onlyHashChange}),i&&(r.onlyHashChange=!1,r.hashFragment=null)},void 0),(0,u.jsx)(i.Fragment,{ref:t,children:e.children})};function j({children:e,cacheNode:t}){let r=(0,i.useContext)(c.GlobalLayoutRouterContext);if(!r)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});return(0,u.jsx)(S,{focusAndScrollRef:r.focusAndScrollRef,cacheNode:t,children:e})}function P({tree:e,segmentPath:t,debugNameContext:r,cacheNode:n,params:a,url:o,isActive:l}){let s,f=(0,i.useContext)(c.GlobalLayoutRouterContext);if((0,i.useContext)(b.NavigationPromisesContext),!f)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});let p=null!==n?n:(0,i.use)(d.unresolvedThenable),h=null!==p.prefetchRsc?p.prefetchRsc:p.rsc,g=(0,i.useDeferredValue)(p.rsc,h);if((0,x.isDeferredRsc)(g)){let e=(0,i.use)(g);null===e&&(0,i.use)(d.unresolvedThenable),s=e}else null===g&&(0,i.use)(d.unresolvedThenable),s=g;let y=s;return(0,u.jsx)(c.LayoutRouterContext.Provider,{value:{parentTree:e,parentCacheNode:p,parentSegmentPath:t,parentParams:a,parentLoadingData:null,debugNameContext:r,url:o,isActive:l},children:y})}function O({loading:e,children:t}){let r=(0,i.use)(c.LayoutRouterContext);return null===r?t:(0,u.jsx)(c.LayoutRouterContext.Provider,{value:{parentTree:r.parentTree,parentCacheNode:r.parentCacheNode,parentSegmentPath:r.parentSegmentPath,parentParams:r.parentParams,parentLoadingData:e,debugNameContext:r.debugNameContext,url:r.url,isActive:r.isActive},children:t})}function w({name:e,loading:t,children:r}){if(null!==t){let n=t[0],a=t[1],o=t[2];return(0,u.jsx)(i.Suspense,{name:e,fallback:(0,u.jsxs)(u.Fragment,{children:[a,o,n]}),children:r})}return(0,u.jsx)(u.Fragment,{children:r})}function C({parallelRouterKey:e,error:t,errorStyles:r,errorScripts:n,templateStyles:a,templateScripts:o,template:l,notFound:s,forbidden:p,unauthorized:b,segmentViewBoundaries:x}){let _=(0,i.useContext)(c.LayoutRouterContext);if(!_)throw Object.defineProperty(Error("invariant expected layout router to be mounted"),"__NEXT_ERROR_CODE",{value:"E56",enumerable:!1,configurable:!0});let{parentTree:S,parentCacheNode:O,parentSegmentPath:E,parentParams:R,parentLoadingData:T,url:A,isActive:N,debugNameContext:M}=_,k=S[0],D=null===E?[e]:E.concat([k,e]),F=S[1][e],L=O.slots;(void 0===F||null===L)&&(0,i.use)(d.unresolvedThenable);let I=F[0],B=L[e]??null,U=(0,y.createRouterCacheKey)(I,!0),$=(0,m.useRouterBFCache)(F,B,U),z=[];do{let e=$.tree,i=$.cacheNode,d=$.stateKey,y=e[0],m=R;if(Array.isArray(y)){let e=y[0],t=y[1],r=y[2],n=(0,v.getParamValueFromCacheKey)(t,r);null!==n&&(m={...R,[e]:n})}let x=function(e){if("/"===e)return"/";if("string"==typeof e)if("(__SLOT__)"===e)return;else return e+"/";return e[1]+"/"}(y),_=x??M,S=void 0===x?void 0:M,O=(0,u.jsxs)(j,{cacheNode:i,children:[(0,u.jsx)(f.ErrorBoundary,{errorComponent:t,errorStyles:r,errorScripts:n,children:(0,u.jsx)(w,{name:S,loading:T,children:(0,u.jsx)(g.HTTPAccessFallbackBoundary,{notFound:s,forbidden:p,unauthorized:b,children:(0,u.jsxs)(h.RedirectBoundary,{children:[(0,u.jsx)(P,{url:A,tree:e,params:m,cacheNode:i,segmentPath:D,debugNameContext:_,isActive:N&&d===U}),null]})})})}),null]}),C=(0,u.jsxs)(c.TemplateContext.Provider,{value:O,children:[a,o,l]},d);z.push(C),$=$.next}while(null!==$)return z}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},37457,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return u}});let n=e.r(90809),a=e.r(43476),o=n._(e.r(71645)),l=e.r(8372);function u(){let e=(0,o.useContext)(l.TemplateContext);return(0,a.jsx)(a.Fragment,{children:e})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},6831,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderParamsFromClient",{enumerable:!0,get:function(){return a}});let n=new WeakMap;function a(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},97689,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(6831).createRenderParamsFromClient;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},93504,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return a}});let n=new WeakMap;function a(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},66996,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(93504).createRenderSearchParamsFromClient;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},15783,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={createClientParams:function(){return o.createRenderParamsFromClient},createClientSearchParams:function(){return l.createRenderSearchParamsFromClient}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(97689),l=e.r(66996);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t){let r=(0,n.useRef)(null),a=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(r.current=o(e,n)),t&&(a.current=o(t,n))},[e,t])}function o(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18967,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={DecodeError:function(){return m},MiddlewareNotFoundError:function(){return _},MissingStaticPage:function(){return x},NormalizeError:function(){return b},PageNotFoundError:function(){return v},SP:function(){return g},ST:function(){return y},WEB_VITALS:function(){return o},execOnce:function(){return l},getDisplayName:function(){return d},getLocationOrigin:function(){return s},getURL:function(){return c},isAbsoluteUrl:function(){return i},isResSent:function(){return f},loadGetInitialProps:function(){return h},normalizeRepeatedSlashes:function(){return p},stringifyError:function(){return S}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=["CLS","FCP","FID","INP","LCP","TTFB"];function l(e){let t,r=!1;return(...n)=>(r||(r=!0,t=e(...n)),t)}let u=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,i=e=>{let t=e.charCodeAt(0);return!!(t>=65&&t<=90||t>=97&&t<=122)&&u.test(e)};function s(){let{protocol:e,hostname:t,port:r}=window.location;return`${e}//${t}${r?":"+r:""}`}function c(){let{href:e}=window.location,t=s();return e.substring(t.length)}function d(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function f(e){return e.finished||e.headersSent}function p(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function h(e,t){let r=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await h(t.Component,t.ctx)}:{};let n=await e.getInitialProps(t);if(r&&f(r))return n;if(!n)throw Object.defineProperty(Error(`"${d(e)}.getInitialProps()" should resolve to an object. But found "${n}" instead.`),"__NEXT_ERROR_CODE",{value:"E1025",enumerable:!1,configurable:!0});return n}let g="u">typeof performance,y=g&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class m extends Error{}class b extends Error{}class v extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class x extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class _ extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function S(e){return JSON.stringify({message:e.message,stack:e.stack})}},27201,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"IconMark",{enumerable:!0,get:function(){return a}});let n=e.r(43476),a=()=>"u">typeof window?null:(0,n.jsx)("meta",{name:"«nxt-icon»"})},91915,(e,t,r)=>{"use strict";function n(e,t={}){if(t.onlyHashChange)return void e();let r=document.documentElement;if("smooth"!==r.dataset.scrollBehavior)return void e();let a=r.style.scrollBehavior;r.style.scrollBehavior="auto",t.dontForceLayout||r.getClientRects(),e(),r.style.scrollBehavior=a}e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"disableSmoothScrollDuringRouteTransition",{enumerable:!0,get:function(){return n}})},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return o}});let n=e.r(18967),a=e.r(52817);function o(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,a.hasBasePath)(r.pathname)}catch(e){return!1}}},98183,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={assign:function(){return i},searchParamsToUrlQuery:function(){return o},urlQueryToSearchParams:function(){return u}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});function o(e){let t={};for(let[r,n]of e.entries()){let e=t[r];void 0===e?t[r]=n:Array.isArray(e)?e.push(n):t[r]=[e,n]}return t}function l(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function u(e){let t=new URLSearchParams;for(let[r,n]of Object.entries(e))if(Array.isArray(n))for(let e of n)t.append(r,l(e));else t.set(r,l(n));return t}function i(e,...t){for(let r of t){for(let t of r.keys())e.delete(t);for(let[t,n]of r.entries())e.append(t,n)}return e}},95057,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return u},formatWithValidation:function(){return s},urlObjectKeys:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(90809)._(e.r(98183)),l=/https?|ftp|gopher|file/;function u(e){let{auth:t,hostname:r}=e,n=e.protocol||"",a=e.pathname||"",u=e.hash||"",i=e.query||"",s=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?s=t+e.host:r&&(s=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(s+=":"+e.port)),i&&"object"==typeof i&&(i=String(o.urlQueryToSearchParams(i)));let c=e.search||i&&`?${i}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||l.test(n))&&!1!==s?(s="//"+(s||""),a&&"/"!==a[0]&&(a="/"+a)):s||(s=""),u&&"#"!==u[0]&&(u="#"+u),c&&"?"!==c[0]&&(c="?"+c),a=a.replace(/[?#]/g,encodeURIComponent),c=c.replace("#","%23"),`${n}${s}${a}${c}${u}`}let i=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function s(e){return u(e)}},18566,(e,t,r)=>{t.exports=e.r(76562)}]);
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,2776,e=>{"use strict";var t=e.i(43476),n=e.i(15812);e.s(["default",0,function({children:e}){let{userId:r,ready:l}=(0,n.useUser)();return l&&r?e:(0,t.jsx)("div",{style:{minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",background:"#0a0a1a",color:"#fff",padding:24,textAlign:"center",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:l?(0,t.jsxs)("div",{style:{maxWidth:420},children:[(0,t.jsx)("div",{style:{fontSize:18,fontWeight:700,marginBottom:8},children:"Can’t reach Six Degrees’ local server"}),(0,t.jsx)("div",{style:{color:"#888",fontSize:14,lineHeight:1.6},children:"The page loaded but the app behind it is not answering. If you started it from a terminal, check that window for an error, then reload this page."})]}):(0,t.jsx)("div",{style:{fontSize:18,fontWeight:600},children:"Loading…"})})}])},8819,e=>{"use strict";var t=e.i(43476);let n="1px solid rgba(255,255,255,0.1)";function r({children:e,style:n}){return(0,t.jsx)("div",{style:{fontSize:13.5,color:"#8b9a9a",lineHeight:1.6,marginTop:4,...n},children:e})}e.s(["Body",0,r,"Btn",0,function({children:e,onClick:r,disabled:l,primary:o,tone:i,type:a="button"}){return(0,t.jsx)("button",{type:a,onClick:r,disabled:l,style:{padding:"9px 18px",borderRadius:7,fontSize:13.5,fontWeight:650,color:l?"#667":"#fff",border:n,background:l?"rgba(255,255,255,0.05)":"bad"===i?"rgba(255,80,80,0.15)":o?"linear-gradient(135deg, #9B59B6, #3498DB)":"rgba(255,255,255,0.08)",cursor:l?"not-allowed":"pointer"},children:e})},"FONT",0,'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',"LINE",0,n,"Mono",0,function({children:e}){return(0,t.jsx)("code",{style:{background:"rgba(255,255,255,0.08)",padding:"1px 5px",borderRadius:4,wordBreak:"break-all"},children:e})},"Section",0,function({id:e,title:l,intro:o,children:i}){return(0,t.jsxs)("section",{id:e,style:{padding:"24px 0",borderBottom:n,scrollMarginTop:16},children:[(0,t.jsx)("h2",{style:{fontSize:16,fontWeight:650,margin:"0 0 6px"},children:l}),o&&(0,t.jsx)(r,{style:{marginTop:0,marginBottom:12},children:o}),i]})},"Status",0,function({children:e,tone:n}){return(0,t.jsxs)("div",{role:"status",style:{marginTop:10,padding:"10px 14px",borderRadius:8,fontSize:13.5,lineHeight:1.6,color:"ok"===n?"#00ff88":"bad"===n?"#ff7676":"#e8e8ee",background:"ok"===n?"rgba(0,255,136,0.08)":"bad"===n?"rgba(255,80,80,0.08)":"rgba(255,255,255,0.05)",border:`1px solid ${"ok"===n?"rgba(0,255,136,0.3)":"bad"===n?"rgba(255,80,80,0.3)":"rgba(255,255,255,0.12)"}`},children:["ok"===n&&"✓ ",e]})}])},39160,84278,e=>{"use strict";var t=e.i(7214),n=e.i(7837);function r(e){let t=String(e||"").trim();if(!t)return null;let n=t.match(/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2})(?::(\d{2}))?(?:\s*UTC)?$/);if(n)return Date.UTC(+n[1],n[2]-1,+n[3],+n[4],+n[5],+(n[6]||0));if(n=t.match(/^(\d{1,2})\/(\d{1,2})\/(\d{2,4}),?\s+(\d{1,2}):(\d{2})\s*(AM|PM)?$/i)){let e=100>+n[3]?2e3+ +n[3]:+n[3],t=n[4]%12;return"PM"===(n[6]||"").toUpperCase()&&(t+=12),Date.UTC(e,n[1]-1,+n[2],t,+n[5])}if(n=t.match(/^([A-Za-z]{3,9})\s+(\d{4})$/)){let e=Date.parse(`1 ${n[1]} ${n[2]} UTC`);return Number.isNaN(e)?null:e}let r=Date.parse(/\d{4}$/.test(t)?`${t} UTC`:t);return Number.isNaN(r)?null:r}let l=e=>(0,t.keyFor)({profile_url:e});function o(e=[]){let t=new Map;for(let n of e){let e=l(n["sender profile url"]),r=n["conversation id"];r&&e&&(t.has(e)||t.set(e,new Set),t.get(e).add(r))}let n=null;for(let[e,r]of t)(!n||r.size>t.get(n).size)&&(n=e);return n}let i=e=>{let t=c(e);return t?`name:${t}`:null},a=/sponsored/i,s=/in\s?mail/i,u=/linkedin\.com\/(company|showcase|school)\//i,d=e=>/^(yes|true|1)$/i.test(String(e||"").trim());function f(e,t){if(!e||!e.total)return"never";let n=t-e.last;return n<=2592e6||e.recent>=3?"warm":n<=31536e6?"cool":"dormant"}let c=e=>String(e||"").split(",")[0].normalize("NFD").replace(/[̀-ͯ]/g,"").toLowerCase().replace(/[^a-z0-9 ]+/g," ").replace(/\s+/g," ").trim();e.s(["buildConversations",0,function(e=[],{keepText:t=!1}={}){let n=o(e),f=new Map;for(let t of e)n&&l(t["sender profile url"])===n&&t.from&&f.set(t.from,(f.get(t.from)||0)+1);let m=c([...f].sort((e,t)=>t[1]-e[1])[0]?.[0]||""),g=e=>!!e&&(e===n||!!m&&e===`name:${m}`),p={},h=new Map,y=0,b=0;for(let n of e){let e=n["conversation id"],o=r(n.date);if(!e||null==o){b+=1;continue}if(d(n["is message draft"])){y+=1;continue}let f=l(n["sender profile url"])||i(n.from);f&&n.from&&!p[f]&&(p[f]=String(n.from).trim());let c=String(n["recipient profile urls"]||"").split(/[,;\s]+/).filter(Boolean).map(l),m=String(n.to||"").split(",").map(e=>e.trim()).filter(Boolean),w=c.length?c:m.map(i).filter(Boolean);c.length&&c.length===m.length&&c.forEach((e,t)=>{p[e]||(p[e]=m[t])}),c.length||m.forEach(e=>{let t=i(e);t&&!p[t]&&(p[t]=e)}),h.has(e)||h.set(e,{id:e,title:"",everyone:new Set,messages:[],kind:null,folder:"",newest:-1/0});let S=h.get(e);f&&S.everyone.add(f),w.forEach(e=>S.everyone.add(e)),S.kind=S.kind||function(e){let t=String(e.folder||""),n=String(e["conversation title"]||"");return a.test(t)||a.test(n)||u.test(String(e["sender profile url"]||""))?"sponsored":s.test(t)||s.test(n)?"inmail":null}(n),o>=S.newest&&(S.newest=o,S.folder=String(n.folder||"").trim().toLowerCase().slice(0,30));let v={t:o,fromMe:g(f)};t&&(v.text=[n.subject,n.content].map(e=>String(e||"").trim()).filter(Boolean).join("\n\n"),!S.title&&n["conversation title"]&&(S.title=String(n["conversation title"]).trim())),S.messages.push(v)}let w=[];for(let e of h.values()){let n=[...e.everyone].filter(e=>e&&!g(e)).sort();e.messages.sort((e,t)=>e.t-t.t);let r={id:e.id,people:n,group:n.length>1,kind:e.kind,folder:e.folder,messages:e.messages};t&&(r.title=e.title),w.push(r)}for(let e of Object.keys(p))g(e)&&delete p[e];return{self:n,conversations:w,names:p,drafts:y,skipped:b}},"buildInvitations",0,function(e=[],{keepText:t=!1}={}){let n=[];for(let o of e){let e=String(o.direction||"").toUpperCase();if("INCOMING"!==e&&"OUTGOING"!==e)continue;let a="INCOMING"===e?"in":"out",s=String(("in"===a?o.from:o.to)||"").trim(),u=l("in"===a?o.inviterprofileurl:o.inviteeprofileurl),d=(u&&/\/in\//.test(u)?u:null)||i(s);if(!d)continue;let f=r(o["sent at"]),c={id:`${a}|${d}|${f??""}`,dir:a,key:d,name:s.slice(0,120),t:f};t&&String(o.message||"").trim()&&(c.note=String(o.message).trim().slice(0,2e3)),n.push(c)}return n.sort((e,t)=>(t.t||0)-(e.t||0))},"careerChapters",0,function(e=[],t=[],n=Date.now()){let o=e.map(e=>({company:e["company name"]||"",title:e.title||"",from:r(e["started on"]),to:r(e["finished on"])})).filter(e=>e.company&&null!=e.from).sort((e,t)=>e.from-t.from),i=t.map(e=>({url:l(e.url||e.profile_url),t:r(e["connected on"]||e.connected_on)})).filter(e=>null!=e.t);return o.map(e=>{let t=e.to??n,r=i.filter(n=>n.t>=e.from&&n.t<t);return{...e,to:e.to,made:r.length,people:r.map(e=>e.url)}})},"conversationSummary",0,function(e){let t=e.messages[e.messages.length-1];return{id:e.id,people:e.people,group:e.group,kind:e.kind||null,folder:e.folder||"",last:t?t.t:null,lastFromThem:t?!t.fromMe:null,count:e.messages.length,mine:e.messages.filter(e=>e.fromMe).length}},"invitationSplit",0,function(e=[]){let t=0,n=0;for(let r of e){let e=String(r.direction||"").toUpperCase();"INCOMING"===e?t+=1:"OUTGOING"===e&&(n+=1)}return{incoming:t,outgoing:n,total:t+n}},"messageStats",0,function(e=[]){let t=o(e),n=new Map;for(let t of e){let e=l(t["sender profile url"]),o=t["conversation id"];if(!o||!e)continue;let i=String(t["recipient profile urls"]||"").split(/[,;\s]+/).filter(Boolean).map(l),a=r(t.date);if(null==a)continue;n.has(o)||n.set(o,{people:new Set,msgs:[]});let s=n.get(o);s.people.add(e),i.forEach(e=>s.people.add(e)),s.msgs.push({from:e,t:a})}let i=0,a=new Map;for(let e of n.values()){let n=[...e.people].filter(e=>e!==t);if(1!==n.length||!e.people.has(t))continue;let r=n[0],l=a.get(r)||{last:0,lastFromThem:!1,total:0,times:[]};for(let n of e.msgs)l.total+=1,l.times.push(n.t),n.t>=l.last&&(l.last=n.t,l.lastFromThem=n.from!==t),n.t>i&&(i=n.t);a.set(r,l)}for(let e of a.values())e.recent=e.times.filter(e=>e>i-7776e6).length,delete e.times;return{self:t,asOf:i||null,people:a}},"nameKey",0,c,"postingEffect",0,function(e=[],t=[]){let n=e.map(e=>({t:r(e.date),link:e.sharelink||e["share link"]||""})).filter(e=>null!=e.t).sort((e,t)=>e.t-t.t),l=t.map(e=>r(e["connected on"]||e.connected_on)).filter(e=>null!=e).sort((e,t)=>e-t);if(!l.length)return{posts:[],usualWeek:0,afterPosts:0};let o=Math.max(6048e5,l[l.length-1]-l[0]),i=l.length/o*6048e5,a=n.map(e=>({...e,week:l.filter(t=>t>=e.t&&t<e.t+6048e5).length})),s=a.length?a.reduce((e,t)=>e+t.week,0)/a.length:0;return{posts:a,usualWeek:i,afterPosts:s}},"readTable",0,function(e,t){let r=(0,n.parseCsv)(String(e||"")),l=r.findIndex(e=>e.some(e=>e.trim().toLowerCase()===t.toLowerCase()));if(l<0)return[];let o=r[l].map(e=>e.trim().toLowerCase());return r.slice(l+1).filter(e=>e.some(e=>e.trim())).map(e=>Object.fromEntries(o.map((t,n)=>[t,(e[n]??"").trim()])))},"warmthOf",0,f],84278);let m="six-degrees-galaxy-lab",g="six-degrees-galaxy-layouts",p=Object.freeze({on:!1,gravity:0,rings:1,push:15,pull:1,distance:1,dotSize:1,lines:1,sizeBy:"power",names:"key",branch:!0,colourBy:"tier",speed:15,loop:!1,labels:!0}),h=["gravity","rings","push","pull","distance","dotSize","lines","sizeBy","names","branch","colourBy","speed","loop"],y=Object.freeze({gravity:.25,rings:0,push:25,pull:2.5,distance:.35,sizeBy:"reach"}),b=new Set,w=null;function S(){return w||(w=function(){try{let e=JSON.parse(localStorage.getItem(m)||"null");return e&&"object"==typeof e?{...p,...e}:p}catch{return p}}()),w}function v(e){w=null===e?{...p,on:S().on,labels:S().labels}:{...S(),...e};try{localStorage.setItem(m,JSON.stringify(w))}catch{}b.forEach(e=>e())}let k=null,x=new Set;function M(){if(!k){try{k=JSON.parse(localStorage.getItem(g)||"[]")}catch{k=[]}Array.isArray(k)||(k=[])}return k}function C(e){k=e;try{localStorage.setItem(g,JSON.stringify(e))}catch{}x.forEach(e=>e())}let F=new Set,I={at:null,playing:!1,min:null,max:null,of:0,find:"",fly:0,found:0,social:void 0},N=null;function B(e){let t={...I,...e};Object.keys(e).every(e=>Object.is(t[e],I[e]))||(I=t,F.forEach(e=>e()))}function j(){cancelAnimationFrame(N),N=null,B({playing:!1})}let T=null;function O(e){let n=new Map;for(let[r,l]of Object.entries(e?.people||{}))n.set((0,t.keyFor)({profile_url:r}),{...l});for(let[r,l]of Object.entries(e?.live||{})){let e=(0,t.keyFor)({profile_url:r}),o=n.get(e)||{total:0,recent:0};l.last&&(!o.last||l.last>o.last)&&(o.last=l.last,"boolean"==typeof l.lastFromThem&&(o.lastFromThem=l.lastFromThem)),o.unread=l.unread,o.total=Math.max(o.total||0,1),n.set(e,o)}let r=Math.max(e?.asOf||0,e?.liveAt&&Date.parse(e.liveAt)||0);for(let e of n.values())(e.last||0)>r&&(r=e.last);return{merged:n,asOf:r,chapters:e?.chapters||[],posts:e?.posts?.posts||[]}}let $={1:"#4FC3F7",2:"#BA68C8",3:"#FFB74D"},A=["#FF6B6B","#4ECDC4","#FFD93D","#A29BFE","#00B894","#FD79A8","#74B9FF","#E17055"],E={warm:"#FF7043",cool:"#4FC3F7",dormant:"#8D6E63",never:"#546E7A"},z="#4a5568",L=e=>String(e||"").trim().toLowerCase();e.s(["CLUSTERS",0,y,"LAB_DEFAULTS",0,p,"applyLayout",0,function(e){let t=M().find(t=>t.name===e);t&&v(Object.fromEntries(h.filter(e=>e in t.settings).map(e=>[e,t.settings[e]])))},"bornTimes",0,function(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Map,l=(e,o=0)=>{if(r.has(e.id))return r.get(e.id);let i=-1/0,a=t.get(e.id);if(1===e.degree||null==a||o>6){let t=e.connected_date?Date.parse(e.connected_date):NaN;i=Number.isNaN(t)?-1/0:t}return null!=a&&n.has(a)&&o<=6&&(i=Math.max(i,l(n.get(a),o+1))),r.set(e.id,i),i};return e.map(e=>l(e))},"chapterAt",0,function(e,t){let n=null;for(let r of e?.chapters||[])Number.isFinite(r.from)&&r.from<=t&&(!n||r.from>n.from)&&(n=r);return n&&(!Number.isFinite(n.to)||n.to>t)?n:null},"clockNow",0,()=>I,"colourScheme",0,function(e,n,r,l){if("degree"===e)return{of:e=>$[Math.min(e.degree||1,3)],legend:[["1st",$[1]],["2nd",$[2]],["3rd+",$[3]]]};if("company"===e){let e=new Map;for(let t of n){let n=L(t.company);if(!n)continue;let r=e.get(n)||{name:String(t.company).trim(),n:0};r.n+=1,e.set(n,r)}let t=[...e.entries()].filter(([,e])=>e.n>1).sort((e,t)=>t[1].n-e[1].n).slice(0,A.length),r=new Map(t.map(([e],t)=>[e,A[t]]));return{of:e=>r.get(L(e.company))||z,legend:[...t.map(([,e],t)=>[e.name,A[t]]),["Other",z]]}}return"warmth"===e&&l?{of:e=>1===(e.degree||1)?E[f(l.merged.get((0,t.keyFor)(e)),l.asOf)]:"#2d3748",legend:[["Warm",E.warm],["Cool",E.cool],["Dormant",E.dormant],["Never messaged",E.never]]}:{of:e=>r[e.tier]||"#666",legend:Object.entries(r)}},"effectiveLab",0,e=>e.on?e:e.labels===p.labels?p:{...p,labels:e.labels},"findMatches",0,function(e,t){let n=String(t||"").trim().toLowerCase();if(n.length<2)return null;let r=new Set;for(let t of e)[t.name,t.company,t.role,t.headline].some(e=>e&&String(e).toLowerCase().includes(n))&&r.add(t.id);return r},"forgetLayout",0,function(e){C(M().filter(t=>t.name!==e))},"labNow",0,S,"layoutsNow",0,M,"loadSocial",0,function(){return T||(T=fetch("/api/social").then(e=>e.ok?e.json():{}).then(e=>{B({social:e.social?O(e.social):null})}).catch(()=>B({social:null}))),T},"mergeSocial",0,O,"milestones",0,function(e){let t=[];for(let n of e?.chapters||[])Number.isFinite(n.from)&&t.push({t:n.from,kind:"job",label:n.company});for(let n of e?.posts||[])Number.isFinite(n.t)&&t.push({t:n.t,kind:"post",label:"You posted"});return t.sort((e,t)=>e.t-t.t)},"pause",0,j,"play",0,function e(){if(null==I.min||null==I.max||I.max<=I.min)return;let t=I.max-I.min,n=1e3*Math.max(1,Number(S().speed)||15),r=null==I.at||I.at>=I.max?I.min:I.at,l=performance.now()-(r-I.min)/t*n;B({at:r,playing:!0});let o=r=>{let i=Math.min(I.max,I.min+(r-l)/n*t);if(B({at:i}),i>=I.max){N=null,B({playing:!1}),S().loop&&setTimeout(()=>{N||I.at!==I.max||(B({at:I.min}),e())},1200);return}N=requestAnimationFrame(o)};cancelAnimationFrame(N),N=requestAnimationFrame(o)},"reachCounts",0,function(e,t){let n=new Map(e.map(e=>[e.id,0]));for(let r of e){let e=t.get(r.id);for(let r=0;null!=e&&r<7;r++)n.set(e,(n.get(e)||0)+1),e=t.get(e)}return n},"saveLayout",0,function(e){let t=String(e||"").trim().slice(0,40);if(!t)return;let n=S(),r=Object.fromEntries(h.map(e=>[e,n[e]]));C([...M().filter(e=>e.name!==t),{name:t,settings:r}])},"setClock",0,B,"setLab",0,v,"stopReplay",0,function(){j(),B({at:null})},"watchClock",0,function(e){return F.add(e),()=>F.delete(e)},"watchLab",0,function(e){b.add(e);let t=t=>{t.key===m&&(w=null,e())};return window.addEventListener("storage",t),()=>{b.delete(e),window.removeEventListener("storage",t)}},"watchLayouts",0,function(e){return x.add(e),()=>x.delete(e)}],39160)},19821,e=>{"use strict";async function t(e){let t=e?`/api/network?userId=${encodeURIComponent(e)}`:"/api/network",n=await fetch(t);if(!n.ok)throw Error(`Failed to load network (${n.status})`);let r=await n.json();return{degree1:r.degree1||[],degree2:r.degree2||[],degree3:r.degree3||[],ties:Number(r.ties)||0}}e.s(["loadNetwork",0,t])},36774,e=>{"use strict";let t=/^[A-Za-z0-9_-]+\.(webp|jpg|jpeg|png)$/,n="/avatars/";e.s(["localPhoto",0,function(e){return"string"==typeof e&&e.startsWith(n)&&t.test(e.slice(n.length))?e:null}])},7214,e=>{"use strict";var t=e.i(36774);let n={S:0,A:1,B:2,C:3,D:4};function r(e){let t=parseFloat(e?.power_score);return Number.isFinite(t)?t:0}function l(e){return Math.round(10*r(e))/10}function o(e){return String(e?.profile_url||"").split(/[?#]/)[0].replace(/\/+$/,"")||`id:${e?.id}`}let i=(e,t)=>String(e??"").localeCompare(String(t??""),void 0,{numeric:!0});function a(e,t){return(n[e.tier]??9)-(n[t.tier]??9)||r(t)-r(e)||String(e.name||"").localeCompare(String(t.name||""))||i(e.id,t.id)}function s(e,t){return e.bridge&&t.bridge?a(e.bridge,t.bridge):e.bridge?-1:t.bridge?1:i(e.id,t.id)}function u(e,t){return t.score-e.score||t.waysIn-e.waysIn||s(e.routes[0]||d,t.routes[0]||d)||String(e.person.name||"").localeCompare(String(t.person.name||""))||(e.key<t.key?-1:+(e.key>t.key))}let d={id:null,bridge:null};function f(e){let t=String(e||"").trim().split(/\s+/).filter(Boolean);return t.length<2?t[0]||"":`${t[0]} ${t[t.length-1].charAt(0)}.`}function c(e,t){let n=String(e||"");return t<=1?n?"…":"":n.length>t?`${n.slice(0,t-1)}…`:n}e.s(["TIERS",0,["S","A","B","C","D"],"compareBridges",0,a,"compareWaysIn",0,function(e,t){return t.waysIn-e.waysIn||u(e,t)},"keyFor",0,o,"routeIndex",0,function(e=[]){let t=new Map;for(let n of e||[]){let e=o(n),r=t.get(e);r||(r=new Set,t.set(e,r)),r.add(n.source_connection_id??null)}return t},"routesFor",0,function(e,t,n){return e?[...t?.get(o(e))??(null!=e.source_connection_id?new Set([e.source_connection_id]):new Set)].map(e=>({id:e,bridge:n?.get(e)??null})).sort(s):[]},"score",0,r,"score1",0,l,"separationPeople",0,function(e=[],n=[]){let r=new Map;for(let e of n||[])r.set(e.id,e);let a=new Map,d=new Map;for(let n of e||[]){let e=o(n);d.set(n.id,e);let r=a.get(e);r?function(e,n){let r=l(e)-l(n);if(r)return r>0;let o=!!(0,t.localPhoto)(e.profile_image_url);return!!(0,t.localPhoto)(n.profile_image_url)!==o?o:0>i(e.id,n.id)}(n,r.person)&&(r.person=n):(r={key:e,person:n,rowIds:[],routeIds:new Set},a.set(e,r)),r.rowIds.push(n.id),r.routeIds.add(n.source_connection_id??null)}let f={people:a.size,byTier:{S:0,A:0,B:0,C:0,D:0},multi:0,bridges:0,unresolvedIds:0,peopleOnlyUnresolved:0,onlyUnresolvedVia:0},c=new Set,m=new Set,g=new Set,p=[];for(let e of a.values()){let t=[...e.routeIds].map(e=>({id:e,bridge:r.get(e)??null}));t.sort(s);let n=t.filter(e=>e.bridge);for(let e of t)(e.bridge?c:m).add(e.id);if(!n.length)for(let e of(f.peopleOnlyUnresolved++,t))g.add(e.id);let{person:o}=e,i=o.tier;void 0!==f.byTier[i]&&f.byTier[i]++,t.length>1&&f.multi++,p.push({key:e.key,person:o,score:l(o),tier:i,routes:t,waysIn:t.length,rowIds:e.rowIds,haystack:[o.name,o.headline,o.company,o.role,...n.map(e=>e.bridge.name)].filter(Boolean).join("\n").toLowerCase(),rank:0,tied:!1})}return f.bridges=c.size,f.unresolvedIds=m.size,f.onlyUnresolvedVia=g.size,p.sort(u),function(e){for(let t=0;t<e.length;t++){let n=e[t],r=e[t-1],l=r&&r.score===n.score&&r.waysIn===n.waysIn;n.rank=l?r.rank:t+1,l&&(n.tied=!0,r.tied=!0)}}(p),{people:p,rowToKey:d,summary:f}},"shortName",0,f,"summitLayout",0,function(e=[],t=800,n=!1){let r=n?36:26,l=Math.round(.42*t),o=Math.round(.58*t),i=e.map((e,n)=>{var l;return{key:e.key,p:e,x:o,y:16+n*r,r:(l=e.waysIn)>=4?8.5:3===l?7:2===l?5.5:4,label:c(`#${e.rank}${e.tied?"=":""} ${e.person.name||""}`,Math.floor((t-o-60)/6.2))}}),s=new Map,u="\0unresolved";for(let e of i)for(let t of e.p.routes){let n=t.bridge?t.id:u,r=s.get(n);r||(r={id:t.bridge?t.id:null,bridge:t.bridge,unresolved:!t.bridge,ys:[],count:0},s.set(n,r)),r.count++,r.ys.push(e.y)}let d=[...s.values()].map(e=>({...e,bary:e.ys.reduce((e,t)=>e+t,0)/e.ys.length}));d.sort((e,t)=>e.bary-t.bary||e.unresolved-t.unresolved||(e.bridge&&t.bridge?a(e.bridge,t.bridge):0));let m=i.length?i[i.length-1].y:16,g=d.length>1?Math.max(18,(m-16)/(d.length-1)):0,p=Math.max(4,Math.floor((l-10-42)/6));d.forEach((e,t)=>{if(e.x=l,e.y=1===d.length?(16+m)/2:16+t*g,e.r=5,e.unresolved)e.label=c(`can't be named (${e.count})`,p);else{let t=e.bridge.name||"";e.label=t.length<=p?t:c(f(t),p)}delete e.ys});let h=new Map(d.map(e=>[e.unresolved?u:e.id,e])),y=[];for(let e of i){let t=new Set;e.p.routes.forEach((n,r)=>{let l=n.bridge?n.id:u;if(t.has(l))return;t.add(l);let o=h.get(l);y.push({key:e.key,bridgeId:o.id,primary:0===r&&!o.unresolved,unresolved:o.unresolved,tier:o.bridge?.tier??null,x1:o.x,y1:o.y,x2:e.x,y2:e.y})})}let b=Math.max(m,d.length?d[d.length-1].y:0),w=i.length?Math.ceil(b+16):0,S={x:20,y:i.length?(16+Math.max(m,b))/2:16,r:14},v=d.map(e=>({id:e.id,x1:S.x,y1:S.y,x2:e.x,y2:e.y}));return{width:t,height:w,you:S,people:i,bridges:d,links:y,spokes:v}}])}]);
@@ -1,3 +1,3 @@
1
1
  @font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/fef07dbb0973bf53-s.3p2_lha1f2xer.woff2)format("woff2");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/8a480f0b521d4e75-s.1qq4vpdcun5oj.woff2)format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/53b9e256198e5412-s.390ncx5urfkfu.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/7178b3e590c64307-s.21jp631_3pja2.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Fallback;src:local(Arial);ascent-override:95.94%;descent-override:28.16%;line-gap-override:0.0%;size-adjust:104.76%}.geist_2ae47f08-module__h69qWW__className{font-family:Geist,Geist Fallback;font-style:normal}.geist_2ae47f08-module__h69qWW__variable{--font-geist-sans:"Geist", "Geist Fallback"}
2
2
  @font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/5ce348bf30bf5439-s.31988l_ccedte.woff2)format("woff2");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/4fa387ec64143e14-s.2tuy5pz7dlieh.woff2)format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/6306c77e7c8268e4-s.2dbetqa9o8jxf.woff2)format("woff2");unicode-range:U+2000-2001,U+2004-2008,U+200A,U+23B8-23BD,U+2500-259F}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/7d817b4c03b0c5f1-s.1uyisp29ctx0d.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/bbc41e54d2fcbd21-s.1rgnod-3esatf.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(../media/797e433ab948586e-s.p.0r6juujl39pe6.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono Fallback;src:local(Arial);ascent-override:74.67%;descent-override:21.92%;line-gap-override:0.0%;size-adjust:134.59%}.geist_mono_eb58308d-module__w_p2Lq__className{font-family:Geist Mono,Geist Mono Fallback;font-style:normal}.geist_mono_eb58308d-module__w_p2Lq__variable{--font-geist-mono:"Geist Mono", "Geist Mono Fallback"}
3
- *{box-sizing:border-box;margin:0;padding:0}body{color:#fff;background:#0a0a1a;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}body:has(>div>[data-map]){overflow:hidden}html:has([data-field-question]){scroll-padding-bottom:80px}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#ffffff26;border-radius:3px}:root{--scan-bar-top:94px}@media (max-width:767px){:root{--scan-bar-top:66px}}@keyframes notch-pulse{50%{opacity:.35}}@media (prefers-reduced-motion:no-preference){.notch-pulse{animation:1.6s ease-in-out infinite notch-pulse}}
3
+ *{box-sizing:border-box;margin:0;padding:0}body{color:#fff;background:#0a0a1a;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}body:has(>div>[data-map]){overflow:hidden}html:has([data-field-question]){scroll-padding-bottom:80px}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#ffffff26;border-radius:3px}:root{--scan-bar-top:94px}@media (max-width:767px){:root{--scan-bar-top:66px}}@keyframes notch-pulse{50%{opacity:.35}}@media (prefers-reduced-motion:no-preference){.notch-pulse{animation:1.6s ease-in-out infinite notch-pulse}}.crm-grid{grid-template-columns:minmax(280px,400px) minmax(0,1fr);align-items:start;gap:10px;display:grid}.crm-grid>.crm-wide{grid-column:1/-1}.crm-board{grid-template-columns:repeat(6,minmax(150px,1fr));gap:10px;padding:10px;display:grid;overflow-x:auto}@media (max-width:760px){.crm-grid,.crm-board{grid-template-columns:minmax(0,1fr)}}
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,2776,e=>{"use strict";var t=e.i(43476),n=e.i(15812);e.s(["default",0,function({children:e}){let{userId:o,ready:i}=(0,n.useUser)();return i&&o?e:(0,t.jsx)("div",{style:{minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",background:"#0a0a1a",color:"#fff",padding:24,textAlign:"center",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:i?(0,t.jsxs)("div",{style:{maxWidth:420},children:[(0,t.jsx)("div",{style:{fontSize:18,fontWeight:700,marginBottom:8},children:"Can’t reach Six Degrees’ local server"}),(0,t.jsx)("div",{style:{color:"#888",fontSize:14,lineHeight:1.6},children:"The page loaded but the app behind it is not answering. If you started it from a terminal, check that window for an error, then reload this page."})]}):(0,t.jsx)("div",{style:{fontSize:18,fontWeight:600},children:"Loading…"})})}])},8819,e=>{"use strict";var t=e.i(43476);let n="1px solid rgba(255,255,255,0.1)";function o({children:e,style:n}){return(0,t.jsx)("div",{style:{fontSize:13.5,color:"#8b9a9a",lineHeight:1.6,marginTop:4,...n},children:e})}e.s(["Body",0,o,"Btn",0,function({children:e,onClick:o,disabled:i,primary:a,tone:s,type:r="button"}){return(0,t.jsx)("button",{type:r,onClick:o,disabled:i,style:{padding:"9px 18px",borderRadius:7,fontSize:13.5,fontWeight:650,color:i?"#667":"#fff",border:n,background:i?"rgba(255,255,255,0.05)":"bad"===s?"rgba(255,80,80,0.15)":a?"linear-gradient(135deg, #9B59B6, #3498DB)":"rgba(255,255,255,0.08)",cursor:i?"not-allowed":"pointer"},children:e})},"FONT",0,'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',"LINE",0,n,"Mono",0,function({children:e}){return(0,t.jsx)("code",{style:{background:"rgba(255,255,255,0.08)",padding:"1px 5px",borderRadius:4,wordBreak:"break-all"},children:e})},"Section",0,function({id:e,title:i,intro:a,children:s}){return(0,t.jsxs)("section",{id:e,style:{padding:"24px 0",borderBottom:n,scrollMarginTop:16},children:[(0,t.jsx)("h2",{style:{fontSize:16,fontWeight:650,margin:"0 0 6px"},children:i}),a&&(0,t.jsx)(o,{style:{marginTop:0,marginBottom:12},children:a}),s]})},"Status",0,function({children:e,tone:n}){return(0,t.jsxs)("div",{role:"status",style:{marginTop:10,padding:"10px 14px",borderRadius:8,fontSize:13.5,lineHeight:1.6,color:"ok"===n?"#00ff88":"bad"===n?"#ff7676":"#e8e8ee",background:"ok"===n?"rgba(0,255,136,0.08)":"bad"===n?"rgba(255,80,80,0.08)":"rgba(255,255,255,0.05)",border:`1px solid ${"ok"===n?"rgba(0,255,136,0.3)":"bad"===n?"rgba(255,80,80,0.3)":"rgba(255,255,255,0.12)"}`},children:["ok"===n&&"✓ ",e]})}])},5445,e=>{"use strict";var t=e.i(43476),n=e.i(71645),o=e.i(22016),i=e.i(18566),a=e.i(2776),s=e.i(8819);function r(){let[e,o]=(0,n.useState)(null);return((0,n.useEffect)(()=>{fetch("/api/update").then(e=>e.json()).then(o).catch(()=>{})},[]),e)?e.installed?(0,t.jsx)(h,{local:e}):(0,t.jsx)(d,{local:e}):null}async function l(e){let t=await fetch("/api/update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),n=await t.json().catch(()=>({}));return{ok:t.ok,d:n}}function d({local:e}){let[o,i]=(0,n.useState)(null),[a,r]=(0,n.useState)(null),[c,h]=(0,n.useState)(null),[p,u]=(0,n.useState)(null);async function y(e){r(e),h(null);try{let{ok:t,d:n}=await l({action:e});if(!t){h(n.error||"Something went wrong."),n.dirty&&i({dirty:n.dirty});return}"check"===e?i(n):(u(n),i(null))}catch(e){h(e.message)}finally{r(null)}}return(0,n.useEffect)(()=>{"updates"===new URLSearchParams(window.location.search).get("check")&&(document.getElementById("updates")?.scrollIntoView({block:"center"}),y("check"),window.history.replaceState(null,"",window.location.pathname))},[]),(0,t.jsxs)(s.Section,{id:"updates",title:"Updates",children:[p?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(s.Body,{children:["Updated to ",(0,t.jsx)(s.Mono,{children:p.sha})," — “",p.subject,"”."]}),(0,t.jsx)(s.Body,{style:{color:p.needsRestart?"#FFD700":void 0},children:p.needsRestart?"Stop the app in your terminal and start it again — this update changed how it starts.":"The page will pick up most changes on its own. Restart the app if anything looks odd."})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(s.Body,{children:["You are on ",(0,t.jsx)(s.Mono,{children:e.sha})," — “",e.subject,"”."]}),o&&0===o.behind&&(0,t.jsx)(s.Status,{tone:"ok",children:"You’re up to date."}),o&&o.behind>0&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(s.Body,{style:{color:"#00ff88"},children:[o.behind," update",1===o.behind?"":"s"," available."]}),(0,t.jsx)("pre",{style:x,children:o.commits.join("\n")})]}),o?.dirty?.length>0&&(0,t.jsxs)(s.Body,{children:["Changed files here:"," ",(0,t.jsx)(s.Mono,{children:o.dirty.join(", ")}),". Commit or discard them first — this will not throw away your work."]}),(0,t.jsxs)(f,{children:[(0,t.jsx)(s.Btn,{onClick:()=>y("check"),disabled:!!a,children:"check"===a?"Checking…":"Check for updates"}),o?.behind>0&&(0,t.jsx)(s.Btn,{onClick:()=>y("pull"),disabled:!!a,primary:!0,children:"pull"===a?"Updating…":`Install ${o.behind} update${1===o.behind?"":"s"}`})]})]}),c&&(0,t.jsx)(s.Body,{style:{color:"#ff7676"},children:c}),(0,t.jsxs)(s.Body,{style:{fontSize:12,color:"#667",marginTop:12},children:["Nothing is checked automatically and nothing about you is sent — this runs the same ",(0,t.jsx)(s.Mono,{children:"git fetch"})," and ",(0,t.jsx)(s.Mono,{children:"git pull"})," you would type yourself."]})]})}let c=["checking","downloading","verifying","preparing","restarting"];function h({local:e}){let o="mac-app"===e.kind,[i,a]=(0,n.useState)(!1),[r,d]=(0,n.useState)(null),[m,b]=(0,n.useState)(null),[j,w]=(0,n.useState)(!1),[k,S]=(0,n.useState)(null),[v,B]=(0,n.useState)(e.job||null),[T,C]=(0,n.useState)(!1),[I,D]=(0,n.useState)(null),[M,R]=(0,n.useState)(null),[$,F]=(0,n.useState)(void 0),[z,E]=(0,n.useState)(0),[L,N]=(0,n.useState)(!1),A=!!(v&&c.includes(v.phase)),O=A&&("restarting"===v.phase||z>0);async function U(){a(!0),d(null),b(null),D(null),R(null),F(void 0),B(e=>e&&c.includes(e.phase)?e:null);try{let{ok:e,d:t}=await l({action:"check-release"});e?(d(t),S(new Date)):b(t.error||"Could not check.")}catch(e){b(e.message)}finally{a(!1)}}async function W(){C(!0),D(null),R(null),F(void 0),E(0),N(!1);try{let{ok:e,d:t}=await l({action:"install-release"});t.job&&B(t.job),!e&&(D(t.error||"The update could not start."),R(t.refusal||null),"fallback"in t&&F(t.fallback))}catch(e){D(e.message)}finally{C(!1)}}async function Y(){try{let{d:e}=await l({action:"cancel-install"});e.job&&B(e.job)}catch{}}async function P(){try{await navigator.clipboard.writeText(e.command),w(!0),setTimeout(()=>w(!1),1600)}catch{b("Could not copy — select the line and copy it by hand.")}}(0,n.useEffect)(()=>{"#updates"===window.location.hash&&document.getElementById("updates")?.scrollIntoView({block:"start"}),"updates"!==new URLSearchParams(window.location.search).get("check")||(window.history.replaceState(null,"",window.location.pathname),e.job&&c.includes(e.job.phase)||(document.getElementById("updates")?.scrollIntoView({block:"center"}),U().then(()=>document.getElementById("updates")?.scrollIntoView({block:"end",behavior:"smooth"}))))},[e.job]),(0,n.useEffect)(()=>{if(!A)return;let e=!0,t=setTimeout(async()=>{try{if(O){let t=await fetch("/api/update",{cache:"no-store"}),n=await t.json();if(!e)return;if(!n.job||n.job.id!==v.id)return void window.location.reload();E(0),B(n.job)}else{let{ok:t,d:n}=await l({action:"update-status"});e&&t&&n.job&&B(n.job)}}catch{e&&E(e=>e+1)}},O?1500:600);return()=>{e=!1,clearTimeout(t)}},[v,z,A,O]),(0,n.useEffect)(()=>{if(!O)return;let e=setTimeout(()=>N(!0),6e4);return()=>clearTimeout(e)},[O]);let H=v?.phase==="failed",V=o&&r?.install?.possible,G=H&&"stale-check"===v.code||"not-checked"===M,K=void 0!==$?$:r?.fallback,_=r?.newer&&(!o||K)&&(!V||H||I||e.lastUpdate?.tone==="bad"),q=function({mac:e,kind:t,canInstall:n,fallback:o}){if(!e)return"source"===t?"A copy built from the source code updates by fetching the code and building it again, which it can't do while it runs. Stop it (Ctrl-C), then run this in the six-degrees folder. Your network stays where it is.":"This copy runs inside the terminal that started it, so it can't replace itself while it runs. Stop it first (Ctrl-C), then run this to start the newest version. Your network stays where it is.";if(!o)return null;let i=o.dataDir?` It opens the new version on the usual data folder, not on ${o.dataDir}: to use that one, quit it and open it again with --data-dir, as you opened this one.`:"";return"replace"===o.mode?`${n?"Or paste this into Terminal.":"Paste this into Terminal instead."} It closes this app, puts the new version in its place and opens it. Your network stays where it is.${i}`:`${n?"Or copy":"Copy"} this line, quit Six Degrees, then paste it into Terminal. It installs the new version at ${o.installsTo}, not where this copy is, and opens it: use that one from then on. Your network stays where it is.${i}`}({mac:o,kind:e.kind,canInstall:V,fallback:K});return(0,t.jsxs)(s.Section,{id:"updates",title:"Updates",children:[e.lastUpdate&&!A&&(0,t.jsx)(y,{report:e.lastUpdate}),(0,t.jsxs)(s.Body,{children:["You have version ",(0,t.jsx)(s.Mono,{children:e.version}),"."]}),A?(0,t.jsx)(u,{job:v,restarting:O,slow:L,onCancel:Y}):(0,t.jsxs)(t.Fragment,{children:[H&&(0,t.jsxs)(s.Status,{tone:"bad",children:[(0,t.jsx)("strong",{children:"The update didn’t finish."})," ",v.error," Nothing was changed."]}),v?.phase==="cancelled"&&(0,t.jsx)(s.Status,{children:"Cancelled. Nothing was changed."}),I&&(0,t.jsx)(s.Status,{tone:"bad",children:I}),r&&!r.latest&&(0,t.jsx)(s.Status,{children:"No release has been published yet."}),r?.latest&&!r.newer&&(0,t.jsxs)(s.Status,{tone:"ok",children:["You’re up to date: ",r.latest.version," is the newest version.",k&&(0,t.jsxs)("span",{style:{color:"#8b9a9a"},children:[" Checked at ",k.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),"."]})]}),r?.newer&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(s.Body,{style:{color:"#00ff88"},children:["Version ",r.latest.version," is available."]}),V&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(s.Body,{children:["It downloads ",r.install.size?`about ${p(r.install.size)} MB`:"the new version"," from GitHub, checks it, then closes, replaces itself and reopens. Your network isn’t touched, and a backup of it is made first."]}),(0,t.jsxs)(f,{children:[G?(0,t.jsx)(s.Btn,{onClick:U,disabled:i,primary:!0,children:i?"Checking…":"Check again"}):(0,t.jsx)(s.Btn,{onClick:W,disabled:T,primary:!0,children:T?"Starting…":H||I?"Try again":"Install and restart"}),(0,t.jsx)(g,{url:r.latest.url})]})]}),o&&!V&&r.install?.reason&&(0,t.jsx)(s.Body,{children:r.install.reason}),_&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.Body,{children:q}),e.testReleases?(0,t.jsx)("pre",{style:x,children:"Not shown in test mode: it would install the real release from GitHub into Applications."}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("pre",{style:x,children:e.command}),(0,t.jsxs)(f,{children:[(0,t.jsx)(s.Btn,{onClick:P,primary:!V,children:j?"Copied":"Copy"}),!V&&(0,t.jsx)(g,{url:r.latest.url})]})]})]}),!V&&!_&&(0,t.jsx)(f,{children:(0,t.jsx)(g,{url:r.latest.url})})]}),!r?.newer&&(0,t.jsx)(f,{children:(0,t.jsx)(s.Btn,{onClick:U,disabled:i,children:i?"Checking…":r?"Check again":"Check for updates"})})]}),m&&(0,t.jsx)(s.Body,{style:{color:"#ff7676"},children:m}),(0,t.jsxs)(s.Body,{style:{fontSize:12,color:"#667",marginTop:12},children:["Nothing is checked automatically. The button asks GitHub for the newest version number, and nothing about you is sent.",o&&" Only a second click, Install and restart, downloads the new version."]}),e.testReleases&&(0,t.jsxs)(s.Body,{style:{fontSize:12,color:"#FFD700",marginTop:6},children:["Test mode: releases are read from ",(0,t.jsx)(s.Mono,{children:e.testReleases})," on this computer, not from GitHub."]})]})}let p=e=>Math.max(1,Math.round(e/1e6));function u({job:e,restarting:n,slow:o,onCancel:i}){let a=e.total?Math.min(100,Math.round(e.received/e.total*100)):null,r=n?"Restarting… Six Degrees closes and opens again in a moment.":"checking"===e.phase?"Asking GitHub for the newest version…":"downloading"===e.phase?`Downloading ${e.version}…${null!==a?` ${a}% (${p(e.received)} of ${p(e.total)} MB)`:""}`:"verifying"===e.phase?"Checking the download…":"Preparing the new version…";return(0,t.jsxs)("div",{role:"status","aria-live":"polite",style:{marginTop:12},children:[(0,t.jsx)(s.Body,{style:{color:"#e8e8ee"},children:r}),"downloading"===e.phase&&null!==a&&(0,t.jsx)("div",{role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":a,"aria-label":"Download",style:{height:6,borderRadius:3,background:"rgba(255,255,255,0.08)",marginTop:10,overflow:"hidden",maxWidth:420},children:(0,t.jsx)("div",{style:{width:`${a}%`,height:"100%",background:"linear-gradient(90deg, #9B59B6, #3498DB)",transition:"width 0.4s ease"}})}),o&&(0,t.jsx)(s.Body,{children:"This is taking longer than it should. If Six Degrees doesn’t open again by itself, open it from your Applications folder."}),!n&&(0,t.jsx)(f,{children:(0,t.jsx)(s.Btn,{onClick:i,children:"Cancel"})})]})}function y({report:e}){let n=new Date(e.at).toLocaleString([],{dateStyle:"medium",timeStyle:"short"});return(0,t.jsxs)(s.Status,{tone:"ok"===e.tone?"ok":"bad",children:[e.text," ",(0,t.jsxs)("span",{style:{color:"#8b9a9a"},children:["(",n,")"]}),"ok"===e.tone&&e.previous&&(0,t.jsxs)("span",{style:{display:"block",fontSize:12.5,color:"#8b9a9a",marginTop:4},children:["A copy of the version you had is kept in ",(0,t.jsx)(s.Mono,{children:e.previous})," until the next update. To go back to it, open that file and drag the app it gives you into your Applications folder."]})]})}function g({url:e}){return e?(0,t.jsx)("a",{href:e,target:"_blank",rel:"noreferrer",style:{color:"#3498DB",fontSize:13.5},children:"What changed →"}):null}function f({children:e}){return(0,t.jsx)("div",{style:{display:"flex",gap:10,marginTop:12,flexWrap:"wrap",alignItems:"center"},children:e})}let x={background:"rgba(0,0,0,0.45)",border:s.LINE,borderRadius:8,padding:12,margin:"8px 0 0",fontSize:12,lineHeight:1.7,color:"#b9c6c6",fontFamily:"ui-monospace, SFMono-Regular, Menlo, monospace",whiteSpace:"pre-wrap",maxHeight:180,overflow:"auto"};function m(e){if(!e)return"0 KB";if(e<1048576)return`${Math.max(1,Math.round(e/1024))} KB`;let t=e/1048576;return`${t<10?t.toFixed(1):Math.round(t)} MB`}let b=e=>Number(e||0).toLocaleString("en-US"),j=(e,t,n=`${t}s`)=>`${b(e)} ${1===Number(e)?t:n}`;function w(e,t=!0){if(!e)return null;let n=new Date(e);return Number.isNaN(n.getTime())?null:n.toLocaleString(void 0,t?{dateStyle:"medium",timeStyle:"short"}:{dateStyle:"medium"})}let k={auto:"before a new version",import:"before an import",manual:"made by hand"};async function S(e,t){let n=await e.json().catch(()=>({}));if(!e.ok)throw Object.assign(Error(n.error||t),{data:n});return n}let v={display:"flex",gap:10,marginTop:12,flexWrap:"wrap",alignItems:"center"},B={fontSize:12,color:"#667",marginTop:10},T={fontSize:14,fontWeight:650,margin:"26px 0 4px",color:"#e8e8ee"},C={display:"flex",gap:8,alignItems:"flex-start",marginTop:12,fontSize:13,color:"#c8d0d0",lineHeight:1.5,cursor:"pointer"};function I({label:e,children:n}){return(0,t.jsxs)("div",{style:{display:"flex",gap:12,justifyContent:"space-between",padding:"7px 0",borderTop:s.LINE,fontSize:13.5},children:[(0,t.jsx)("span",{style:{color:"#8b9a9a"},children:e}),(0,t.jsx)("span",{style:{color:"#e8e8ee",textAlign:"right"},children:n})]})}function D(){return(0,t.jsx)("a",{href:"https://github.com/blakeb056/six-degrees#undo-an-import",target:"_blank",rel:"noreferrer",style:{color:"inherit",textDecoration:"underline"},children:"Undo an import"})}function M(){let[e,o]=(0,n.useState)(null),[i,a]=(0,n.useState)(null),[r,l]=(0,n.useState)(null),[d,c]=(0,n.useState)(null),[h,p]=(0,n.useState)(null),[u,y]=(0,n.useState)(null),[g,f]=(0,n.useState)(!0),[x,M]=(0,n.useState)(!0),[R,$]=(0,n.useState)(null),[F,z]=(0,n.useState)(!1),[E,L]=(0,n.useState)(!1),N=(0,n.useRef)(null),A=(0,n.useRef)(!1),O=(0,n.useCallback)(()=>fetch("/api/data",{cache:"no-store"}).then(e=>S(e,"The data folder could not be read.")).then(e=>{let t=Date.parse(e.lastImport?.appliedAt||"");o({...e,importIsRecent:Number.isFinite(t)&&Date.now()-t<864e5}),a(null)}).catch(e=>a(e.message)),[]);async function U(){c(null);try{await navigator.clipboard.writeText(e.dataDir),c({tone:"ok",text:"Copied the folder’s path."})}catch{c({tone:"bad",text:"This window can’t copy. Select the path above and copy it instead."})}}async function W(){l("reveal"),c(null);try{await S(await fetch("/api/data/reveal",{method:"POST"}),"The folder could not be opened."),c({tone:"ok",text:"darwin"===e.platform?"Opened in Finder.":"Opened in your file browser."})}catch(e){c({tone:"bad",text:e.message})}finally{l(null)}}async function Y(){l("export"),p(null);try{let e,t=await fetch("/api/data/export",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({photos:g,social:x})});t.ok||await S(t,"The copy could not be made.");let n=await t.blob(),o=/filename="([^"]+)"/.exec(t.headers.get("content-disposition")||"")?.[1]||"Six Degrees backup.sixdegrees",i=URL.createObjectURL(n),a=document.createElement("a");a.href=i,a.download=o,a.style.position="fixed",a.style.left="-9999px",document.body.appendChild(a),a.click(),a.remove(),setTimeout(()=>URL.revokeObjectURL(i),6e4);let s=[(e=Number(t.headers.get("x-six-degrees-people")),j(e,"person","people"))];s.push(g?j(Number(t.headers.get("x-six-degrees-photos")),"photo"):"no photos"),p({tone:"ok",text:`Made “${o}” (${m(n.size)}: ${s.join(", ")}). Look for it in your Downloads folder, or wherever you chose to save it.`})}catch(e){p({tone:"bad",text:e.message})}finally{l(null)}}async function P(){if(R){l("import"),y(null);try{let t={"Content-Type":"application/octet-stream","X-Six-Degrees-Size":String(R.size)};e.people>0&&(t["X-Six-Degrees-Replace"]=String(e.people)),await S(await fetch("/api/data/import",{method:"POST",headers:t,body:R}),"The file could not be imported."),$(null),z(!1),N.current&&(N.current.value=""),await O()}catch(e){e.data?.needsConfirm&&(z(!1),await O()),y({tone:"bad",text:e.message})}finally{l(null)}}}async function H(){l("cancel"),y(null);try{await S(await fetch("/api/data/import",{method:"DELETE"}),"The import could not be cancelled."),await O(),y({tone:"ok",text:"Cancelled. The network here stays as it is."})}catch(e){y({tone:"bad",text:e.message})}finally{l(null)}}async function V(){l("restart"),y(null);try{await S(await fetch("/api/data/restart",{method:"POST"}),"Six Degrees could not restart."),L(!0);let e=e=>new Promise(t=>setTimeout(t,e)),t=Date.now()+9e4;for(await e(2500);Date.now()<t;){try{if((await fetch("/api/data",{cache:"no-store"})).ok)return void window.location.reload()}catch{}await e(1e3)}L(!1),y({tone:"bad",text:"Six Degrees didn’t come back. Quit it and open it again: the import finishes as it starts."})}catch(e){y({tone:"bad",text:e.message})}finally{l(null)}}if((0,n.useEffect)(()=>{O()},[O]),(0,n.useEffect)(()=>{e&&!A.current&&(A.current=!0,"#data"===window.location.hash&&document.getElementById("data")?.scrollIntoView({block:"start"}))},[e]),!e)return(0,t.jsx)(s.Section,{id:"data",title:"Your data",children:i?(0,t.jsx)(s.Status,{tone:"bad",children:i}):(0,t.jsx)(s.Body,{children:"Loading…"})});let G=e.pending,K=e.photosInCopy||e.photos,_=e.backups||[],q=_.reduce((e,t)=>e+(t.bytes||0),0),J=!!(R&&R.size>e.maxImportBytes),X=e.people>0,Q=e.lastImport;return(0,t.jsxs)(s.Section,{id:"data",title:"Your data",intro:"Everything Six Degrees knows about your network is in one folder on this computer.",children:[(0,t.jsx)(s.Body,{children:(0,t.jsx)(s.Mono,{children:e.dataDir})}),(0,t.jsxs)("div",{style:v,children:[(0,t.jsx)(s.Btn,{onClick:U,children:"Copy the path"}),(0,t.jsx)(s.Btn,{onClick:W,disabled:"reveal"===r,children:"reveal"===r?"Opening…":"darwin"===e.platform?"Show in Finder":"Open the folder"})]}),d&&(0,t.jsx)(s.Status,{tone:d.tone,children:d.text}),(0,t.jsxs)("div",{style:{marginTop:16,borderBottom:s.LINE},children:[(0,t.jsxs)(I,{label:"Your network",children:[j(e.people,"person","people")," · ",m(e.databaseBytes)]}),(0,t.jsx)(I,{label:"Profile photos",children:e.photos.count?`${b(e.photos.count)} \xb7 ${m(e.photos.bytes)}`:"none saved yet"}),(0,t.jsx)(I,{label:"Backups",children:_.length?`${j(_.length,"copy","copies")} \xb7 ${m(q)}`:"none yet"}),(0,t.jsx)(I,{label:"LinkedIn sign-in for scanning",children:e.linkedinSignIn?"kept here, never put in a copy":"not signed in on this computer"})]}),_.length>0&&(0,t.jsxs)("details",{style:{marginTop:10,fontSize:13,color:"#8b9a9a"},children:[(0,t.jsx)("summary",{style:{cursor:"pointer"},children:"The backups"}),(0,t.jsx)("div",{style:{display:"grid",gridTemplateColumns:"minmax(0, 1fr) auto auto",gap:"6px 14px",marginTop:8},children:_.map(e=>(0,t.jsxs)("div",{style:{display:"contents"},children:[(0,t.jsxs)("span",{style:{wordBreak:"break-all",color:"#c8d0d0"},children:[e.name,e.folder?"/":"",(0,t.jsxs)("span",{style:{color:"#667"},children:[" · ",e.folder?"its photos and files":k[e.kind]||e.kind]})]}),(0,t.jsx)("span",{children:w(e.modifiedAt)}),(0,t.jsx)("span",{style:{textAlign:"right"},children:m(e.bytes)})]},e.name))})]}),(0,t.jsx)(s.Body,{style:B,children:"Backups are copies of your network from before a new version or an import. The newest five from new versions are kept; copies from before an import stay until you delete them."}),(0,t.jsx)(s.Body,{style:B,children:"The folder can’t be moved from here. A database that a sync service (iCloud Drive, Dropbox) copies while it’s open can be damaged, and this folder also holds your LinkedIn sign-in, which should never be synced. To use your network on another computer, save a copy below and import it there."}),(0,t.jsx)("h3",{style:T,children:"Move your network to another computer"}),(0,t.jsx)(s.Body,{children:"Save a copy here, then on the new computer install Six Degrees, open Settings → Your data and import the copy. Sign in to LinkedIn again there before you scan: your sign-in never goes into a copy."}),(0,t.jsxs)("label",{style:C,children:[(0,t.jsx)("input",{type:"checkbox",checked:g,onChange:e=>f(e.target.checked),style:{marginTop:3}}),(0,t.jsxs)("span",{children:["Include profile photos",K.count?` (${b(K.count)}, ${m(K.bytes)})`:"",". They can’t be downloaded again without a new scan."]})]}),(0,t.jsxs)("label",{style:C,children:[(0,t.jsx)("input",{type:"checkbox",checked:x,onChange:e=>M(e.target.checked),style:{marginTop:3}}),(0,t.jsx)("span",{children:"Include the Social tab: its findings, your CRM notes, stages and follow-ups, and any messages you keep there."})]}),(0,t.jsxs)("div",{style:v,children:[(0,t.jsx)(s.Btn,{primary:!0,onClick:Y,disabled:!!r||E||0===e.people,children:"export"===r?"Saving…":"Save a copy of my network"}),0===e.people&&(0,t.jsx)("span",{style:{fontSize:13,color:"#8b9a9a"},children:"There’s no network here to save yet."})]}),h&&(0,t.jsx)(s.Status,{tone:h.tone,children:h.text}),(0,t.jsx)(s.Body,{style:B,children:"The copy holds the names, headlines and photos of the people in your network. Keep it private: don’t post it or share it, and delete it once it has been imported. A network opened from a LinkedIn CSV lives only in its browser tab, so it isn’t in the copy; import the CSV again on the new computer. With the Social tab included, the copy also holds your CRM notes and any messages you keep, so it’s as private as your inbox."}),(0,t.jsx)("h3",{style:T,children:"Bring in a network from another computer"}),G?(0,t.jsxs)(s.Status,{children:[(0,t.jsx)("div",{style:{fontWeight:650},children:"An import is waiting to finish."}),(0,t.jsxs)("div",{children:["The network in the copy",G.exportedAt?` saved ${w(G.exportedAt,!1)}`:""," ","(",j(G.people,"person","people"),G.photos?`, ${j(G.photos,"photo")}`:"",G.fromVersion?`, from Six Degrees ${G.fromVersion}`:"",")",G.replacedPeople>0?` replaces the ${j(G.replacedPeople,"person","people")} here the next time Six Degrees starts. A copy of what’s here now is kept in backups first, so the import can be undone.`:" becomes the network here the next time Six Degrees starts."," ","Your LinkedIn search budget and any pause on scanning are kept."]}),G.error&&(0,t.jsxs)("div",{style:{color:"#ff7676",marginTop:6},children:["The last try stopped: ",G.error.replace(/\.$/,""),". It tries again the next time Six Degrees starts."]}),E?(0,t.jsx)("div",{style:{marginTop:8},children:"Restarting… this page comes back in a few seconds."}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{style:{marginTop:8},children:e.restart.how}),e.restart.command&&(0,t.jsx)("div",{style:{marginTop:6},children:(0,t.jsx)(s.Mono,{children:e.restart.command})}),(0,t.jsxs)("div",{style:v,children:[e.restart.canRestart&&(0,t.jsx)(s.Btn,{primary:!0,onClick:V,disabled:!!r,children:"restart"===r?"Restarting…":"Restart now"}),!G.started&&(0,t.jsx)(s.Btn,{onClick:H,disabled:!!r,children:"cancel"===r?"Cancelling…":"Cancel the import"})]})]})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.Body,{children:"Pick the copy you saved on the other computer (a .sixdegrees file). It replaces the network here; the two networks are never merged. Your LinkedIn search budget and any pause on scanning are kept, with the other computer’s searches added."}),(0,t.jsx)("input",{ref:N,type:"file",accept:".sixdegrees",onChange:function(e){y(null),z(!1),$(e.target.files?.[0]||null)},style:{display:"none"}}),(0,t.jsxs)("div",{style:v,children:[(0,t.jsx)(s.Btn,{onClick:()=>N.current?.click(),disabled:!!r,children:"Choose a file…"}),R&&(0,t.jsxs)("span",{style:{fontSize:13,color:"#c8d0d0",wordBreak:"break-all"},children:[R.name," · ",m(R.size)]})]}),J&&(0,t.jsxs)(s.Status,{tone:"bad",children:["That file is ",m(R.size),". This copy can import files up to ",m(e.maxImportBytes),"."]}),R&&X&&!J&&(0,t.jsxs)("label",{style:C,children:[(0,t.jsx)("input",{type:"checkbox",checked:F,onChange:e=>z(e.target.checked),style:{marginTop:3}}),(0,t.jsxs)("span",{children:["Replace the ",j(e.people,"person","people")," in this copy’s network with the network in this file. A copy of what’s here is kept in backups first. Your search budget and any pause on scanning are kept too."]})]}),(0,t.jsx)("div",{style:v,children:(0,t.jsx)(s.Btn,{primary:!0,onClick:P,disabled:!R||J||X&&!F||!!r,children:"import"===r?"Checking the file…":"Import"})})]}),u&&(0,t.jsx)(s.Status,{tone:u.tone,children:u.text}),Q&&!G&&(e.importIsRecent?(0,t.jsxs)(s.Status,{tone:"ok",children:["Imported ",w(Q.appliedAt),": ",j(Q.people,"person","people"),Q.exportedAt?` from the copy saved ${w(Q.exportedAt,!1)}`:"",".",Q.keptDatabase&&(0,t.jsxs)(t.Fragment,{children:[" ","What was here before is kept in ",(0,t.jsx)(s.Mono,{children:Q.keptDatabase}),Q.keptFiles?", with its photos and files beside it":"",".",Q.keptAsIs&&" It couldn’t be read, so it was kept exactly as it was."," ","To go back to it, see ",(0,t.jsx)(D,{}),"."]})]}):(0,t.jsxs)(s.Body,{style:B,children:["Last import: ",w(Q.appliedAt)," (",j(Q.people,"person","people"),").",Q.keptDatabase&&(0,t.jsxs)(t.Fragment,{children:[" What was here before is kept in ",(0,t.jsx)(s.Mono,{children:Q.keptDatabase})," (",(0,t.jsx)(D,{}),")."]})]}))]})}var R=e.i(64745);let $={"mac-app":"the Mac app",npm:"the npm package (npx six-degrees)",source:"a copy built from the source code",git:"a git checkout of the source code"};function F(){let[e,a]=(0,n.useState)(null),[l,d]=(0,n.useState)(null),c=(0,i.useRouter)();if((0,n.useEffect)(()=>{let e=window.location.hash;("#sector"===e||"#tiers"===e)&&c.replace(`/scores${e}`)},[c]),(0,n.useEffect)(()=>{fetch("/api/settings").then(e=>e.json().then(t=>e.ok?t:Promise.reject(Error(t.error||"Could not load settings.")))).then(a).catch(e=>d(e.message))},[]),R.IS_DEMO)return(0,t.jsxs)("div",{style:{minHeight:"100vh",background:"#0a0a1a",color:"rgba(255,255,255,0.7)",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:12,textAlign:"center",padding:24,fontFamily:s.FONT},children:[(0,t.jsx)("h2",{style:{margin:0,fontSize:20,fontWeight:700,color:"#fff"},children:"Not part of the demo"}),(0,t.jsx)("p",{style:{margin:0,fontSize:13},children:"The public demo includes the Network Circle and Degrees views only."}),(0,t.jsx)(o.default,{href:"/",style:{fontSize:12,color:"rgba(255,255,255,0.5)",textDecoration:"none"},children:"← Back to the network"})]});let h=e?.about;return(0,t.jsxs)("div",{style:{minHeight:"100vh",background:"#0a0a1a",color:"#fff",fontFamily:s.FONT},children:[(0,t.jsxs)("header",{style:{padding:"16px 24px",borderBottom:s.LINE,display:"flex",alignItems:"center",gap:16},children:[(0,t.jsx)(o.default,{href:"/",style:{display:"flex",alignItems:"center",gap:6,color:"#888",textDecoration:"none",fontSize:13,fontWeight:600,padding:"6px 14px",borderRadius:6,background:"rgba(255,255,255,0.06)",border:s.LINE},children:"← Back to Map"}),(0,t.jsx)("h1",{style:{fontSize:22,fontWeight:700,margin:0,background:"linear-gradient(135deg, #FFD700, #9B59B6, #3498DB)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"},children:"Settings"})]}),(0,t.jsxs)("main",{style:{maxWidth:720,margin:"0 auto",padding:"8px 24px 64px"},children:[l&&(0,t.jsx)(s.Body,{style:{color:"#ff7676",marginTop:16},children:l}),(0,t.jsx)(r,{}),(0,t.jsx)(s.Section,{id:"scoring",title:"Your field and tiers",children:(0,t.jsxs)(s.Body,{children:["They’re on the ",(0,t.jsx)(o.default,{href:"/scores",style:{color:"#3498DB"},children:"Scores"})," tab now, beside every company’s score: ",(0,t.jsx)(o.default,{href:"/scores#sector",style:{color:"#3498DB"},children:"your field"})," and"," ",(0,t.jsx)(o.default,{href:"/scores#tiers",style:{color:"#3498DB"},children:"how tiers are graded"}),"."]})}),(0,t.jsx)(M,{}),(0,t.jsx)(s.Section,{id:"about",title:"About this copy",children:h?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(s.Body,{children:["Version ",(0,t.jsx)(s.Mono,{children:h.version}),", running as ",$[h.kind]||h.kind,"."]}),(0,t.jsxs)(s.Body,{children:["Your network is kept in ",(0,t.jsx)(s.Mono,{children:h.dataDir}),h.customDataDir?" (a folder you chose).":".","mac-app"===h.kind&&" Help → Show the Data Folder opens it."]}),(0,t.jsx)(s.Body,{style:{fontSize:12,color:"#667",marginTop:10},children:"Settings are saved with your network, on this computer. Nothing here is sent anywhere."})]}):!l&&(0,t.jsx)(s.Body,{children:"Loading…"})})]})]})}e.s(["default",0,function(){return(0,t.jsx)(a.default,{children:(0,t.jsx)(F,{})})}],5445)}]);
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,2776,e=>{"use strict";var t=e.i(43476),n=e.i(15812);e.s(["default",0,function({children:e}){let{userId:r,ready:l}=(0,n.useUser)();return l&&r?e:(0,t.jsx)("div",{style:{minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",background:"#0a0a1a",color:"#fff",padding:24,textAlign:"center",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:l?(0,t.jsxs)("div",{style:{maxWidth:420},children:[(0,t.jsx)("div",{style:{fontSize:18,fontWeight:700,marginBottom:8},children:"Can’t reach Six Degrees’ local server"}),(0,t.jsx)("div",{style:{color:"#888",fontSize:14,lineHeight:1.6},children:"The page loaded but the app behind it is not answering. If you started it from a terminal, check that window for an error, then reload this page."})]}):(0,t.jsx)("div",{style:{fontSize:18,fontWeight:600},children:"Loading…"})})}])},28867,86106,e=>{"use strict";var t=e.i(71645),n=e.i(7214);let r=Object.freeze({known:!1,sent:new Set,mine:new Map,version:0}),l=new Set,o=r,i=null,a=new Map;function s(e=o.sent,t=o.known){for(let n of(o=Object.freeze({known:t,sent:e,mine:new Map(a),version:o.version+1}),[...l]))n()}function u(e){return l.add(e),i||o.known||(i=fetch("/api/outreach").then(e=>e.ok?e.json():null).then(e=>{e&&s(new Set((e.pending||[]).map(n.keyFor)),!0)}).catch(()=>{}).finally(()=>{i=null})),()=>l.delete(e)}function f(){return o}async function c(e){let t=await fetch("/api/outreach",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),n=await t.json().catch(()=>({}));if(!t.ok)throw Error(n.error||"Could not save that.");return n}async function d(e,{bridgeId:t}={}){let r=(0,n.keyFor)(e),l=a.has(r)?a.get(r):void 0;a.set(r,!0),s();try{return await c({action:"mark-sent",connectionId:e.id,profileUrl:e.profile_url,bridgeId:t})}catch(e){throw void 0===l?a.delete(r):a.set(r,l),s(),e}}async function m(e){let t=(0,n.keyFor)(e),r=a.has(t)?a.get(t):void 0;a.set(t,!1),s();try{return await c({action:"undo",connectionId:e.id,profileUrl:e.profile_url})}catch(e){throw void 0===r?a.delete(t):a.set(t,r),s(),e}}e.s(["REQUESTS_UNKNOWN",0,r,"hasRequest",0,function(e,t=o){if(!e)return!1;let r=(0,n.keyFor)(e);return t.mine.has(r)?t.mine.get(r):t.known?t.sent.has(r):"pending"===e.unlock_status||"sent"===e.outreach_status},"markRequested",0,d,"requestCount",0,function(e=o){let t=new Set(e.known?e.sent:[]);for(let[n,r]of e.mine)r?t.add(n):t.delete(n);return t.size},"requestsNow",0,f,"undoRequest",0,m,"watchRequests",0,u],86106),e.s(["default",0,function(){return(0,t.useSyncExternalStore)(u,f,()=>r)}],28867)},64666,e=>{"use strict";var t=e.i(7214);function n(e=[],r=[]){let l=new Set((r||[]).map(t.keyFor)),o=new Map;for(let n of e||[]){let e=n?.source_connection_id;if(null==e)continue;let r=(0,t.keyFor)(n);if(l.has(r))continue;let i=o.get(r);i||o.set(r,i=new Set),i.add(e)}let i=new Map;for(let e of o.values())for(let t of e){let n=i.get(t)||{reach:0,only:0,total:0};n.reach+=1/e.size,n.total+=1,1===e.size&&(n.only+=1),i.set(t,n)}return i}e.s(["bridgeOverlap",0,function(e=[],r=[]){let l=n(e,r),o=new Set((r||[]).map(t.keyFor)),i=new Map;for(let n of e||[]){let e=n?.source_connection_id;if(null==e)continue;let r=(0,t.keyFor)(n);if(o.has(r))continue;let l=i.get(r);l||i.set(r,l=new Set),l.add(e)}let a=new Map;for(let e of i.values()){if(e.size<2)continue;let t=[...e];for(let e=0;e<t.length;e++)for(let n=e+1;n<t.length;n++){let r=t[e]<t[n]?`${t[e]}|${t[n]}`:`${t[n]}|${t[e]}`;a.set(r,(a.get(r)||0)+1)}}let s=new Map;for(let[e,t]of a){let[n,r]=e.split("|"),o=l.get(n).total+l.get(r).total-t,i=o?t/o:0;for(let[e,l]of[[n,r],[r,n]]){let n=s.get(e);(!n||i>n.share)&&s.set(e,{with:l,share:i,shared:t})}}return s},"exclusiveReach",0,n,"redundancy",0,function(e=[],t=[]){let r=n(e,t),l=0,o=0;for(let e of r.values())l+=e.reach,o+=e.only;return l?1-o/l:0}])},39160,84278,e=>{"use strict";var t=e.i(7214),n=e.i(7837);function r(e){let t=String(e||"").trim();if(!t)return null;let n=t.match(/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2})(?::(\d{2}))?(?:\s*UTC)?$/);if(n)return Date.UTC(+n[1],n[2]-1,+n[3],+n[4],+n[5],+(n[6]||0));if(n=t.match(/^(\d{1,2})\/(\d{1,2})\/(\d{2,4}),?\s+(\d{1,2}):(\d{2})\s*(AM|PM)?$/i)){let e=100>+n[3]?2e3+ +n[3]:+n[3],t=n[4]%12;return"PM"===(n[6]||"").toUpperCase()&&(t+=12),Date.UTC(e,n[1]-1,+n[2],t,+n[5])}if(n=t.match(/^([A-Za-z]{3,9})\s+(\d{4})$/)){let e=Date.parse(`1 ${n[1]} ${n[2]} UTC`);return Number.isNaN(e)?null:e}let r=Date.parse(/\d{4}$/.test(t)?`${t} UTC`:t);return Number.isNaN(r)?null:r}let l=e=>(0,t.keyFor)({profile_url:e});function o(e=[]){let t=new Map;for(let n of e){let e=l(n["sender profile url"]),r=n["conversation id"];r&&e&&(t.has(e)||t.set(e,new Set),t.get(e).add(r))}let n=null;for(let[e,r]of t)(!n||r.size>t.get(n).size)&&(n=e);return n}let i=e=>{let t=d(e);return t?`name:${t}`:null},a=/sponsored/i,s=/in\s?mail/i,u=/linkedin\.com\/(company|showcase|school)\//i,f=e=>/^(yes|true|1)$/i.test(String(e||"").trim());function c(e,t){if(!e||!e.total)return"never";let n=t-e.last;return n<=2592e6||e.recent>=3?"warm":n<=31536e6?"cool":"dormant"}let d=e=>String(e||"").split(",")[0].normalize("NFD").replace(/[̀-ͯ]/g,"").toLowerCase().replace(/[^a-z0-9 ]+/g," ").replace(/\s+/g," ").trim();e.s(["buildConversations",0,function(e=[],{keepText:t=!1}={}){let n=o(e),c=new Map;for(let t of e)n&&l(t["sender profile url"])===n&&t.from&&c.set(t.from,(c.get(t.from)||0)+1);let m=d([...c].sort((e,t)=>t[1]-e[1])[0]?.[0]||""),p=e=>!!e&&(e===n||!!m&&e===`name:${m}`),g={},h=new Map,y=0,w=0;for(let n of e){let e=n["conversation id"],o=r(n.date);if(!e||null==o){w+=1;continue}if(f(n["is message draft"])){y+=1;continue}let c=l(n["sender profile url"])||i(n.from);c&&n.from&&!g[c]&&(g[c]=String(n.from).trim());let d=String(n["recipient profile urls"]||"").split(/[,;\s]+/).filter(Boolean).map(l),m=String(n.to||"").split(",").map(e=>e.trim()).filter(Boolean),S=d.length?d:m.map(i).filter(Boolean);d.length&&d.length===m.length&&d.forEach((e,t)=>{g[e]||(g[e]=m[t])}),d.length||m.forEach(e=>{let t=i(e);t&&!g[t]&&(g[t]=e)}),h.has(e)||h.set(e,{id:e,title:"",everyone:new Set,messages:[],kind:null,folder:"",newest:-1/0});let b=h.get(e);c&&b.everyone.add(c),S.forEach(e=>b.everyone.add(e)),b.kind=b.kind||function(e){let t=String(e.folder||""),n=String(e["conversation title"]||"");return a.test(t)||a.test(n)||u.test(String(e["sender profile url"]||""))?"sponsored":s.test(t)||s.test(n)?"inmail":null}(n),o>=b.newest&&(b.newest=o,b.folder=String(n.folder||"").trim().toLowerCase().slice(0,30));let v={t:o,fromMe:p(c)};t&&(v.text=[n.subject,n.content].map(e=>String(e||"").trim()).filter(Boolean).join("\n\n"),!b.title&&n["conversation title"]&&(b.title=String(n["conversation title"]).trim())),b.messages.push(v)}let S=[];for(let e of h.values()){let n=[...e.everyone].filter(e=>e&&!p(e)).sort();e.messages.sort((e,t)=>e.t-t.t);let r={id:e.id,people:n,group:n.length>1,kind:e.kind,folder:e.folder,messages:e.messages};t&&(r.title=e.title),S.push(r)}for(let e of Object.keys(g))p(e)&&delete g[e];return{self:n,conversations:S,names:g,drafts:y,skipped:w}},"buildInvitations",0,function(e=[],{keepText:t=!1}={}){let n=[];for(let o of e){let e=String(o.direction||"").toUpperCase();if("INCOMING"!==e&&"OUTGOING"!==e)continue;let a="INCOMING"===e?"in":"out",s=String(("in"===a?o.from:o.to)||"").trim(),u=l("in"===a?o.inviterprofileurl:o.inviteeprofileurl),f=(u&&/\/in\//.test(u)?u:null)||i(s);if(!f)continue;let c=r(o["sent at"]),d={id:`${a}|${f}|${c??""}`,dir:a,key:f,name:s.slice(0,120),t:c};t&&String(o.message||"").trim()&&(d.note=String(o.message).trim().slice(0,2e3)),n.push(d)}return n.sort((e,t)=>(t.t||0)-(e.t||0))},"careerChapters",0,function(e=[],t=[],n=Date.now()){let o=e.map(e=>({company:e["company name"]||"",title:e.title||"",from:r(e["started on"]),to:r(e["finished on"])})).filter(e=>e.company&&null!=e.from).sort((e,t)=>e.from-t.from),i=t.map(e=>({url:l(e.url||e.profile_url),t:r(e["connected on"]||e.connected_on)})).filter(e=>null!=e.t);return o.map(e=>{let t=e.to??n,r=i.filter(n=>n.t>=e.from&&n.t<t);return{...e,to:e.to,made:r.length,people:r.map(e=>e.url)}})},"conversationSummary",0,function(e){let t=e.messages[e.messages.length-1];return{id:e.id,people:e.people,group:e.group,kind:e.kind||null,folder:e.folder||"",last:t?t.t:null,lastFromThem:t?!t.fromMe:null,count:e.messages.length,mine:e.messages.filter(e=>e.fromMe).length}},"invitationSplit",0,function(e=[]){let t=0,n=0;for(let r of e){let e=String(r.direction||"").toUpperCase();"INCOMING"===e?t+=1:"OUTGOING"===e&&(n+=1)}return{incoming:t,outgoing:n,total:t+n}},"messageStats",0,function(e=[]){let t=o(e),n=new Map;for(let t of e){let e=l(t["sender profile url"]),o=t["conversation id"];if(!o||!e)continue;let i=String(t["recipient profile urls"]||"").split(/[,;\s]+/).filter(Boolean).map(l),a=r(t.date);if(null==a)continue;n.has(o)||n.set(o,{people:new Set,msgs:[]});let s=n.get(o);s.people.add(e),i.forEach(e=>s.people.add(e)),s.msgs.push({from:e,t:a})}let i=0,a=new Map;for(let e of n.values()){let n=[...e.people].filter(e=>e!==t);if(1!==n.length||!e.people.has(t))continue;let r=n[0],l=a.get(r)||{last:0,lastFromThem:!1,total:0,times:[]};for(let n of e.msgs)l.total+=1,l.times.push(n.t),n.t>=l.last&&(l.last=n.t,l.lastFromThem=n.from!==t),n.t>i&&(i=n.t);a.set(r,l)}for(let e of a.values())e.recent=e.times.filter(e=>e>i-7776e6).length,delete e.times;return{self:t,asOf:i||null,people:a}},"nameKey",0,d,"postingEffect",0,function(e=[],t=[]){let n=e.map(e=>({t:r(e.date),link:e.sharelink||e["share link"]||""})).filter(e=>null!=e.t).sort((e,t)=>e.t-t.t),l=t.map(e=>r(e["connected on"]||e.connected_on)).filter(e=>null!=e).sort((e,t)=>e-t);if(!l.length)return{posts:[],usualWeek:0,afterPosts:0};let o=Math.max(6048e5,l[l.length-1]-l[0]),i=l.length/o*6048e5,a=n.map(e=>({...e,week:l.filter(t=>t>=e.t&&t<e.t+6048e5).length})),s=a.length?a.reduce((e,t)=>e+t.week,0)/a.length:0;return{posts:a,usualWeek:i,afterPosts:s}},"readTable",0,function(e,t){let r=(0,n.parseCsv)(String(e||"")),l=r.findIndex(e=>e.some(e=>e.trim().toLowerCase()===t.toLowerCase()));if(l<0)return[];let o=r[l].map(e=>e.trim().toLowerCase());return r.slice(l+1).filter(e=>e.some(e=>e.trim())).map(e=>Object.fromEntries(o.map((t,n)=>[t,(e[n]??"").trim()])))},"warmthOf",0,c],84278);let m="six-degrees-galaxy-lab",p="six-degrees-galaxy-layouts",g=Object.freeze({on:!1,gravity:0,rings:1,push:15,pull:1,distance:1,dotSize:1,lines:1,sizeBy:"power",names:"key",branch:!0,colourBy:"tier",speed:15,loop:!1,labels:!0}),h=["gravity","rings","push","pull","distance","dotSize","lines","sizeBy","names","branch","colourBy","speed","loop"],y=Object.freeze({gravity:.25,rings:0,push:25,pull:2.5,distance:.35,sizeBy:"reach"}),w=new Set,S=null;function b(){return S||(S=function(){try{let e=JSON.parse(localStorage.getItem(m)||"null");return e&&"object"==typeof e?{...g,...e}:g}catch{return g}}()),S}function v(e){S=null===e?{...g,on:b().on,labels:b().labels}:{...b(),...e};try{localStorage.setItem(m,JSON.stringify(S))}catch{}w.forEach(e=>e())}let k=null,M=new Set;function F(){if(!k){try{k=JSON.parse(localStorage.getItem(p)||"[]")}catch{k=[]}Array.isArray(k)||(k=[])}return k}function C(e){k=e;try{localStorage.setItem(p,JSON.stringify(e))}catch{}M.forEach(e=>e())}let _=new Set,x={at:null,playing:!1,min:null,max:null,of:0,find:"",fly:0,found:0,social:void 0},I=null;function N(e){let t={...x,...e};Object.keys(e).every(e=>Object.is(t[e],x[e]))||(x=t,_.forEach(e=>e()))}function O(){cancelAnimationFrame(I),I=null,N({playing:!1})}let B=null;function T(e){let n=new Map;for(let[r,l]of Object.entries(e?.people||{}))n.set((0,t.keyFor)({profile_url:r}),{...l});for(let[r,l]of Object.entries(e?.live||{})){let e=(0,t.keyFor)({profile_url:r}),o=n.get(e)||{total:0,recent:0};l.last&&(!o.last||l.last>o.last)&&(o.last=l.last,"boolean"==typeof l.lastFromThem&&(o.lastFromThem=l.lastFromThem)),o.unread=l.unread,o.total=Math.max(o.total||0,1),n.set(e,o)}let r=Math.max(e?.asOf||0,e?.liveAt&&Date.parse(e.liveAt)||0);for(let e of n.values())(e.last||0)>r&&(r=e.last);return{merged:n,asOf:r,chapters:e?.chapters||[],posts:e?.posts?.posts||[]}}let A={1:"#4FC3F7",2:"#BA68C8",3:"#FFB74D"},j=["#FF6B6B","#4ECDC4","#FFD93D","#A29BFE","#00B894","#FD79A8","#74B9FF","#E17055"],E={warm:"#FF7043",cool:"#4FC3F7",dormant:"#8D6E63",never:"#546E7A"},D="#4a5568",U=e=>String(e||"").trim().toLowerCase();e.s(["CLUSTERS",0,y,"LAB_DEFAULTS",0,g,"applyLayout",0,function(e){let t=F().find(t=>t.name===e);t&&v(Object.fromEntries(h.filter(e=>e in t.settings).map(e=>[e,t.settings[e]])))},"bornTimes",0,function(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Map,l=(e,o=0)=>{if(r.has(e.id))return r.get(e.id);let i=-1/0,a=t.get(e.id);if(1===e.degree||null==a||o>6){let t=e.connected_date?Date.parse(e.connected_date):NaN;i=Number.isNaN(t)?-1/0:t}return null!=a&&n.has(a)&&o<=6&&(i=Math.max(i,l(n.get(a),o+1))),r.set(e.id,i),i};return e.map(e=>l(e))},"chapterAt",0,function(e,t){let n=null;for(let r of e?.chapters||[])Number.isFinite(r.from)&&r.from<=t&&(!n||r.from>n.from)&&(n=r);return n&&(!Number.isFinite(n.to)||n.to>t)?n:null},"clockNow",0,()=>x,"colourScheme",0,function(e,n,r,l){if("degree"===e)return{of:e=>A[Math.min(e.degree||1,3)],legend:[["1st",A[1]],["2nd",A[2]],["3rd+",A[3]]]};if("company"===e){let e=new Map;for(let t of n){let n=U(t.company);if(!n)continue;let r=e.get(n)||{name:String(t.company).trim(),n:0};r.n+=1,e.set(n,r)}let t=[...e.entries()].filter(([,e])=>e.n>1).sort((e,t)=>t[1].n-e[1].n).slice(0,j.length),r=new Map(t.map(([e],t)=>[e,j[t]]));return{of:e=>r.get(U(e.company))||D,legend:[...t.map(([,e],t)=>[e.name,j[t]]),["Other",D]]}}return"warmth"===e&&l?{of:e=>1===(e.degree||1)?E[c(l.merged.get((0,t.keyFor)(e)),l.asOf)]:"#2d3748",legend:[["Warm",E.warm],["Cool",E.cool],["Dormant",E.dormant],["Never messaged",E.never]]}:{of:e=>r[e.tier]||"#666",legend:Object.entries(r)}},"effectiveLab",0,e=>e.on?e:e.labels===g.labels?g:{...g,labels:e.labels},"findMatches",0,function(e,t){let n=String(t||"").trim().toLowerCase();if(n.length<2)return null;let r=new Set;for(let t of e)[t.name,t.company,t.role,t.headline].some(e=>e&&String(e).toLowerCase().includes(n))&&r.add(t.id);return r},"forgetLayout",0,function(e){C(F().filter(t=>t.name!==e))},"labNow",0,b,"layoutsNow",0,F,"loadSocial",0,function(){return B||(B=fetch("/api/social").then(e=>e.ok?e.json():{}).then(e=>{N({social:e.social?T(e.social):null})}).catch(()=>N({social:null}))),B},"mergeSocial",0,T,"milestones",0,function(e){let t=[];for(let n of e?.chapters||[])Number.isFinite(n.from)&&t.push({t:n.from,kind:"job",label:n.company});for(let n of e?.posts||[])Number.isFinite(n.t)&&t.push({t:n.t,kind:"post",label:"You posted"});return t.sort((e,t)=>e.t-t.t)},"pause",0,O,"play",0,function e(){if(null==x.min||null==x.max||x.max<=x.min)return;let t=x.max-x.min,n=1e3*Math.max(1,Number(b().speed)||15),r=null==x.at||x.at>=x.max?x.min:x.at,l=performance.now()-(r-x.min)/t*n;N({at:r,playing:!0});let o=r=>{let i=Math.min(x.max,x.min+(r-l)/n*t);if(N({at:i}),i>=x.max){I=null,N({playing:!1}),b().loop&&setTimeout(()=>{I||x.at!==x.max||(N({at:x.min}),e())},1200);return}I=requestAnimationFrame(o)};cancelAnimationFrame(I),I=requestAnimationFrame(o)},"reachCounts",0,function(e,t){let n=new Map(e.map(e=>[e.id,0]));for(let r of e){let e=t.get(r.id);for(let r=0;null!=e&&r<7;r++)n.set(e,(n.get(e)||0)+1),e=t.get(e)}return n},"saveLayout",0,function(e){let t=String(e||"").trim().slice(0,40);if(!t)return;let n=b(),r=Object.fromEntries(h.map(e=>[e,n[e]]));C([...F().filter(e=>e.name!==t),{name:t,settings:r}])},"setClock",0,N,"setLab",0,v,"stopReplay",0,function(){O(),N({at:null})},"watchClock",0,function(e){return _.add(e),()=>_.delete(e)},"watchLab",0,function(e){w.add(e);let t=t=>{t.key===m&&(S=null,e())};return window.addEventListener("storage",t),()=>{w.delete(e),window.removeEventListener("storage",t)}},"watchLayouts",0,function(e){return M.add(e),()=>M.delete(e)}],39160)},19821,e=>{"use strict";async function t(e){let t=e?`/api/network?userId=${encodeURIComponent(e)}`:"/api/network",n=await fetch(t);if(!n.ok)throw Error(`Failed to load network (${n.status})`);let r=await n.json();return{degree1:r.degree1||[],degree2:r.degree2||[],degree3:r.degree3||[],ties:Number(r.ties)||0}}e.s(["loadNetwork",0,t])},36774,e=>{"use strict";let t=/^[A-Za-z0-9_-]+\.(webp|jpg|jpeg|png)$/,n="/avatars/";e.s(["localPhoto",0,function(e){return"string"==typeof e&&e.startsWith(n)&&t.test(e.slice(n.length))?e:null}])},48235,e=>{"use strict";var t=e.i(7214);function n(e,n){return e?n.scanned.has(e.id)||e.profile_url&&n.read?.has((0,t.keyFor)(e))?"scanned":e.profile_url&&n.hidden.has((0,t.keyFor)(e))?"hidden":"todo":"todo"}function r(e,t){if(!e||1!==e.degree||null==e.unlocked_from_bridge_id)return null;let r=n(e,t);return"todo"===r?"ready":r}e.s(["circleScanCost",0,function(e=100){let t=Math.max(1,Math.min(100,Math.round(e)||100));return{profileViews:1,searches:t,minutes:t>=100?55:Math.max(5,Math.round(.55*t))}},"circleState",0,n,"reachIndex",0,function(e=[],n=[],r={}){let l=new Set;for(let e of n||[])e?.source_connection_id!=null&&l.add(e.source_connection_id);let o=new Set;for(let e of r?.skips||[])e?.profileUrl&&o.add((0,t.keyFor)({profile_url:e.profileUrl}));let i=new Set;for(let e of r?.read||[])e&&i.add((0,t.keyFor)({profile_url:e}));let a=new Map;for(let[e,n]of Object.entries(r?.lists||{}))e&&n&&a.set((0,t.keyFor)({profile_url:e}),n);let s=new Map;for(let t of e||[]){let e=t?.unlocked_from_bridge_id;if(null==e||1!==t.degree)continue;let n=s.get(e);n||s.set(e,n=[]),n.push(t)}return{scanned:l,read:i,hidden:o,reachedFrom:s,lists:a}},"reachState",0,r,"readyByCircle",0,function(e){let t=new Map;for(let[n,l]of e.reachedFrom){let o=l.filter(t=>"ready"===r(t,e)).length;o&&t.set(n,o)}return t},"readyToScan",0,function(e,n){return(e||[]).filter(e=>"ready"===r(e,n)).sort(t.compareBridges)},"scanBars",0,function(e,r){let l=n(e,r),o=e?.profile_url?r.lists?.get((0,t.keyFor)(e)):null;return"hidden"===l?null:o?o.more?o.total?Math.max(1,Math.min(4,Math.round(5*Math.min(1,10*o.pages/o.total)))):2:5:"scanned"===l?2:null}])},7214,e=>{"use strict";var t=e.i(36774);let n={S:0,A:1,B:2,C:3,D:4};function r(e){let t=parseFloat(e?.power_score);return Number.isFinite(t)?t:0}function l(e){return Math.round(10*r(e))/10}function o(e){return String(e?.profile_url||"").split(/[?#]/)[0].replace(/\/+$/,"")||`id:${e?.id}`}let i=(e,t)=>String(e??"").localeCompare(String(t??""),void 0,{numeric:!0});function a(e,t){return(n[e.tier]??9)-(n[t.tier]??9)||r(t)-r(e)||String(e.name||"").localeCompare(String(t.name||""))||i(e.id,t.id)}function s(e,t){return e.bridge&&t.bridge?a(e.bridge,t.bridge):e.bridge?-1:t.bridge?1:i(e.id,t.id)}function u(e,t){return t.score-e.score||t.waysIn-e.waysIn||s(e.routes[0]||f,t.routes[0]||f)||String(e.person.name||"").localeCompare(String(t.person.name||""))||(e.key<t.key?-1:+(e.key>t.key))}let f={id:null,bridge:null};function c(e){let t=String(e||"").trim().split(/\s+/).filter(Boolean);return t.length<2?t[0]||"":`${t[0]} ${t[t.length-1].charAt(0)}.`}function d(e,t){let n=String(e||"");return t<=1?n?"…":"":n.length>t?`${n.slice(0,t-1)}…`:n}e.s(["TIERS",0,["S","A","B","C","D"],"compareBridges",0,a,"compareWaysIn",0,function(e,t){return t.waysIn-e.waysIn||u(e,t)},"keyFor",0,o,"routeIndex",0,function(e=[]){let t=new Map;for(let n of e||[]){let e=o(n),r=t.get(e);r||(r=new Set,t.set(e,r)),r.add(n.source_connection_id??null)}return t},"routesFor",0,function(e,t,n){return e?[...t?.get(o(e))??(null!=e.source_connection_id?new Set([e.source_connection_id]):new Set)].map(e=>({id:e,bridge:n?.get(e)??null})).sort(s):[]},"score",0,r,"score1",0,l,"separationPeople",0,function(e=[],n=[]){let r=new Map;for(let e of n||[])r.set(e.id,e);let a=new Map,f=new Map;for(let n of e||[]){let e=o(n);f.set(n.id,e);let r=a.get(e);r?function(e,n){let r=l(e)-l(n);if(r)return r>0;let o=!!(0,t.localPhoto)(e.profile_image_url);return!!(0,t.localPhoto)(n.profile_image_url)!==o?o:0>i(e.id,n.id)}(n,r.person)&&(r.person=n):(r={key:e,person:n,rowIds:[],routeIds:new Set},a.set(e,r)),r.rowIds.push(n.id),r.routeIds.add(n.source_connection_id??null)}let c={people:a.size,byTier:{S:0,A:0,B:0,C:0,D:0},multi:0,bridges:0,unresolvedIds:0,peopleOnlyUnresolved:0,onlyUnresolvedVia:0},d=new Set,m=new Set,p=new Set,g=[];for(let e of a.values()){let t=[...e.routeIds].map(e=>({id:e,bridge:r.get(e)??null}));t.sort(s);let n=t.filter(e=>e.bridge);for(let e of t)(e.bridge?d:m).add(e.id);if(!n.length)for(let e of(c.peopleOnlyUnresolved++,t))p.add(e.id);let{person:o}=e,i=o.tier;void 0!==c.byTier[i]&&c.byTier[i]++,t.length>1&&c.multi++,g.push({key:e.key,person:o,score:l(o),tier:i,routes:t,waysIn:t.length,rowIds:e.rowIds,haystack:[o.name,o.headline,o.company,o.role,...n.map(e=>e.bridge.name)].filter(Boolean).join("\n").toLowerCase(),rank:0,tied:!1})}return c.bridges=d.size,c.unresolvedIds=m.size,c.onlyUnresolvedVia=p.size,g.sort(u),function(e){for(let t=0;t<e.length;t++){let n=e[t],r=e[t-1],l=r&&r.score===n.score&&r.waysIn===n.waysIn;n.rank=l?r.rank:t+1,l&&(n.tied=!0,r.tied=!0)}}(g),{people:g,rowToKey:f,summary:c}},"shortName",0,c,"summitLayout",0,function(e=[],t=800,n=!1){let r=n?36:26,l=Math.round(.42*t),o=Math.round(.58*t),i=e.map((e,n)=>{var l;return{key:e.key,p:e,x:o,y:16+n*r,r:(l=e.waysIn)>=4?8.5:3===l?7:2===l?5.5:4,label:d(`#${e.rank}${e.tied?"=":""} ${e.person.name||""}`,Math.floor((t-o-60)/6.2))}}),s=new Map,u="\0unresolved";for(let e of i)for(let t of e.p.routes){let n=t.bridge?t.id:u,r=s.get(n);r||(r={id:t.bridge?t.id:null,bridge:t.bridge,unresolved:!t.bridge,ys:[],count:0},s.set(n,r)),r.count++,r.ys.push(e.y)}let f=[...s.values()].map(e=>({...e,bary:e.ys.reduce((e,t)=>e+t,0)/e.ys.length}));f.sort((e,t)=>e.bary-t.bary||e.unresolved-t.unresolved||(e.bridge&&t.bridge?a(e.bridge,t.bridge):0));let m=i.length?i[i.length-1].y:16,p=f.length>1?Math.max(18,(m-16)/(f.length-1)):0,g=Math.max(4,Math.floor((l-10-42)/6));f.forEach((e,t)=>{if(e.x=l,e.y=1===f.length?(16+m)/2:16+t*p,e.r=5,e.unresolved)e.label=d(`can't be named (${e.count})`,g);else{let t=e.bridge.name||"";e.label=t.length<=g?t:d(c(t),g)}delete e.ys});let h=new Map(f.map(e=>[e.unresolved?u:e.id,e])),y=[];for(let e of i){let t=new Set;e.p.routes.forEach((n,r)=>{let l=n.bridge?n.id:u;if(t.has(l))return;t.add(l);let o=h.get(l);y.push({key:e.key,bridgeId:o.id,primary:0===r&&!o.unresolved,unresolved:o.unresolved,tier:o.bridge?.tier??null,x1:o.x,y1:o.y,x2:e.x,y2:e.y})})}let w=Math.max(m,f.length?f[f.length-1].y:0),S=i.length?Math.ceil(w+16):0,b={x:20,y:i.length?(16+Math.max(m,w))/2:16,r:14},v=f.map(e=>({id:e.id,x1:b.x,y1:b.y,x2:e.x,y2:e.y}));return{width:t,height:S,you:b,people:i,bridges:f,links:y,spokes:v}}])},5258,e=>{"use strict";e.s(["TIER_COLORS",0,{S:"#f6c344",A:"#a78bfa",B:"#60a5fa",C:"#94a3b8",D:"#6b7280"},"TIER_COLORS_CLASSIC",0,{S:"#FFD700",A:"#9B59B6",B:"#3498DB",C:"#95A5A6",D:"#BDC3C7"},"TIER_ORDER",0,["S","A","B","C","D"],"TIER_RING_RADIUS",0,{S:150,A:230,B:310,C:390,D:470},"initialsFor",0,function(e){let t=String(e||"").trim().split(/\s+/).filter(Boolean);return 0===t.length?"?":(t[0].charAt(0)+(t.length>1?t[t.length-1].charAt(0):"")).toUpperCase()}])}]);