posix4e commited on
Commit
00218eb
·
1 Parent(s): 41d90ff

add ios client

Browse files
Files changed (42) hide show
  1. backend/backend.py +13 -23
  2. earth/.gitignore +2 -0
  3. earth/earth Extension/Info.plist +13 -0
  4. earth/earth Extension/Resources/_locales/en/messages.json +10 -0
  5. earth/earth Extension/Resources/background.js +31 -0
  6. earth/earth Extension/Resources/content.js +5 -0
  7. earth/earth Extension/Resources/images/icon-128.png +3 -0
  8. earth/earth Extension/Resources/images/icon-256.png +3 -0
  9. earth/earth Extension/Resources/images/icon-48.png +3 -0
  10. earth/earth Extension/Resources/images/icon-512.png +3 -0
  11. earth/earth Extension/Resources/images/icon-64.png +3 -0
  12. earth/earth Extension/Resources/images/icon-96.png +3 -0
  13. earth/earth Extension/Resources/images/toolbar-icon-16.png +3 -0
  14. earth/earth Extension/Resources/images/toolbar-icon-19.png +3 -0
  15. earth/earth Extension/Resources/images/toolbar-icon-32.png +3 -0
  16. earth/earth Extension/Resources/images/toolbar-icon-38.png +3 -0
  17. earth/earth Extension/Resources/images/toolbar-icon-48.png +3 -0
  18. earth/earth Extension/Resources/images/toolbar-icon-72.png +3 -0
  19. earth/earth Extension/Resources/manifest.json +45 -0
  20. earth/earth Extension/Resources/popup.css +15 -0
  21. earth/earth Extension/Resources/popup.html +27 -0
  22. earth/earth Extension/Resources/popup.js +17 -0
  23. earth/earth Extension/SafariWebExtensionHandler.swift +24 -0
  24. earth/earth.xcodeproj/project.pbxproj +849 -0
  25. earth/earth.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  26. earth/earth.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  27. earth/earth/AppDelegate.swift +24 -0
  28. earth/earth/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  29. earth/earth/Assets.xcassets/AppIcon.appiconset/Contents.json +13 -0
  30. earth/earth/Assets.xcassets/Contents.json +6 -0
  31. earth/earth/Assets.xcassets/LargeIcon.imageset/Contents.json +20 -0
  32. earth/earth/Base.lproj/LaunchScreen.storyboard +36 -0
  33. earth/earth/Base.lproj/Main.html +15 -0
  34. earth/earth/Base.lproj/Main.storyboard +38 -0
  35. earth/earth/Info.plist +25 -0
  36. earth/earth/Resources/Icon.png +3 -0
  37. earth/earth/Resources/Style.css +29 -0
  38. earth/earth/SceneDelegate.swift +18 -0
  39. earth/earth/ViewController.swift +34 -0
  40. earth/earthTests/earthTests.swift +36 -0
  41. earth/earthUITests/earthUITests.swift +41 -0
  42. earth/earthUITests/earthUITestsLaunchTests.swift +32 -0
backend/backend.py CHANGED
@@ -176,16 +176,15 @@ async def assist(item: AssistItem):
176
 
177
  # Call OpenAI
178
  openai.api_key = user.openai_key
179
- response = generate_quick_completion(item.prompt, item.version)
180
 
181
  # Update the last time assist was called
182
  user.last_assist = datetime.now()
183
 
184
  # Store the history
185
  new_history = AndroidHistory(
186
- uid=item.uid, question=item.prompt, answer=json.loads(str(response))
187
  )
188
-
189
  db.add(new_history)
190
  db.commit()
191
 
@@ -225,24 +224,6 @@ async def saveurl(item: SaveURLItem):
225
  return {"message": "Browser history saved"}
226
 
227
 
228
- def generate_quick_completion(prompt, model):
229
- dropdrown = model.split(":")
230
- engine = dropdrown[0]
231
- max_tokens = int(dropdrown[1])
232
- if "gpt" in model:
233
- message = [{"role": "user", "content": prompt}]
234
- response = openai.ChatCompletion.create(
235
- model=engine,
236
- messages=message,
237
- temperature=0.2,
238
- max_tokens=max_tokens,
239
- frequency_penalty=0.0,
240
- )
241
- else:
242
- raise Exception("Unknown model")
243
- return response
244
-
245
-
246
  def assist_interface(uid, prompt, gpt_version):
247
  client = TestClient(app)
248
 
@@ -313,6 +294,8 @@ def get_db_interface():
313
  )
314
 
315
 
 
 
316
  def register_interface(openai_key):
317
  client = TestClient(app)
318
  response = client.post(
@@ -323,10 +306,17 @@ def register_interface(openai_key):
323
 
324
 
325
  def get_register_interface():
 
 
 
 
 
 
 
326
  return Interface(
327
- fn=register_interface,
328
  inputs=[components.Textbox(label="OpenAI Key", type="text")],
329
- outputs="json",
330
  title="Register New User",
331
  description="Register a new user by entering an OpenAI key.",
332
  )
 
176
 
177
  # Call OpenAI
178
  openai.api_key = user.openai_key
179
+ response = openai_text_call(item.prompt, model=item.version)
180
 
181
  # Update the last time assist was called
182
  user.last_assist = datetime.now()
183
 
184
  # Store the history
185
  new_history = AndroidHistory(
186
+ uid=item.uid, question=item.prompt, answer=response["text"]
187
  )
 
188
  db.add(new_history)
189
  db.commit()
190
 
 
224
  return {"message": "Browser history saved"}
225
 
226
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
227
  def assist_interface(uid, prompt, gpt_version):
228
  client = TestClient(app)
229
 
 
294
  )
295
 
296
 
297
+ ## The register interface uses this weird syntax to make sure we don't copy and
298
+ ## paste quotes in the uid when we output it
299
  def register_interface(openai_key):
300
  client = TestClient(app)
301
  response = client.post(
 
306
 
307
 
308
  def get_register_interface():
309
+ def wrapper(openai_key):
310
+ result = register_interface(openai_key)
311
+ return f"""<p id='uid'>{result["uid"]}</p>
312
+ <button onclick="navigator.clipboard.writeText(document.getElementById('uid').innerText)">
313
+ Copy to clipboard
314
+ </button>"""
315
+
316
  return Interface(
317
+ fn=wrapper,
318
  inputs=[components.Textbox(label="OpenAI Key", type="text")],
319
+ outputs=components.HTML(),
320
  title="Register New User",
321
  description="Register a new user by entering an OpenAI key.",
322
  )
earth/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ xcdebugger/
2
+ xcuserdata/
earth/earth Extension/Info.plist ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>NSExtension</key>
6
+ <dict>
7
+ <key>NSExtensionPointIdentifier</key>
8
+ <string>com.apple.Safari.web-extension</string>
9
+ <key>NSExtensionPrincipalClass</key>
10
+ <string>$(PRODUCT_MODULE_NAME).SafariWebExtensionHandler</string>
11
+ </dict>
12
+ </dict>
13
+ </plist>
earth/earth Extension/Resources/_locales/en/messages.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "extension_name": {
3
+ "message": "earth Extension",
4
+ "description": "The display name for the extension."
5
+ },
6
+ "extension_description": {
7
+ "message": "This is earth Extension. You should tell us what your extension does here.",
8
+ "description": "Description of what the extension does."
9
+ }
10
+ }
earth/earth Extension/Resources/background.js ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
2
+ if (request.type === 'saveHistory') {
3
+ chrome.storage.sync.get(['base_url', 'uid', 'machineid'], function(result) {
4
+ saveHistory(request.url, result.base_url, result.uid, result.machineid)
5
+ .then(() => console.log('History Saved Successfully'))
6
+ .catch(error => console.log('error', error));
7
+ });
8
+ }
9
+ });
10
+
11
+ async function saveHistory(history, base_url, uid, machineid) {
12
+ console.log(history)
13
+ console.log(machineid)
14
+ console.log(uid)
15
+ console.log(`${base_url}/saveurl`)
16
+ var requestOptions = {
17
+ method: 'POST',
18
+ headers: {
19
+ 'Content-Type': 'application/json', // Set the content type to JSON
20
+ },
21
+ body: JSON.stringify({
22
+ url: history,
23
+ machineid: machineid,
24
+ uid: uid
25
+ }),
26
+ redirect: 'follow'
27
+ };
28
+
29
+ const response = await fetch(`${base_url}/saveurl`, requestOptions);
30
+ return await response.text();
31
+ }
earth/earth Extension/Resources/content.js ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ chrome.runtime.sendMessage({
2
+ type: 'saveHistory',
3
+ url: window.location.href
4
+ });
5
+
earth/earth Extension/Resources/images/icon-128.png ADDED

Git LFS Details

  • SHA256: 4d5f08f1b7153fdac09d50380094405ad909bde21e9cca58b1dffbfabb0c2f3a
  • Pointer size: 130 Bytes
  • Size of remote file: 15 kB
earth/earth Extension/Resources/images/icon-256.png ADDED

Git LFS Details

  • SHA256: 924b1db16d18d6cbf3d1b4f48b7533406066043c491abd9e4c26666aa4d2f973
  • Pointer size: 130 Bytes
  • Size of remote file: 43.4 kB
earth/earth Extension/Resources/images/icon-48.png ADDED

Git LFS Details

  • SHA256: 98134fa59efca74787e16b0d745fc45f0fec147ab97fc3ea11101194bba561b6
  • Pointer size: 129 Bytes
  • Size of remote file: 3.44 kB
earth/earth Extension/Resources/images/icon-512.png ADDED

Git LFS Details

  • SHA256: c1a427d7ca0573719b8575e6d87127eb11509371ca7a1a7d72b1a58d600cb064
  • Pointer size: 131 Bytes
  • Size of remote file: 132 kB
earth/earth Extension/Resources/images/icon-64.png ADDED

Git LFS Details

  • SHA256: 089c316a3424e3d09dd117d1db6c843ceea98c36e0f806b839cc62fbcd760a23
  • Pointer size: 129 Bytes
  • Size of remote file: 5.15 kB
earth/earth Extension/Resources/images/icon-96.png ADDED

Git LFS Details

  • SHA256: ceecd18c27a98b3c4e59787d7ed08fb61dfc194c72d446bfe334b7770d7d397a
  • Pointer size: 129 Bytes
  • Size of remote file: 9.75 kB
earth/earth Extension/Resources/images/toolbar-icon-16.png ADDED

Git LFS Details

  • SHA256: c665c7e181dbf8fabf62e0b57bc24b22e9fddcbb8cdfeffc32f077afca132a5b
  • Pointer size: 128 Bytes
  • Size of remote file: 454 Bytes
earth/earth Extension/Resources/images/toolbar-icon-19.png ADDED

Git LFS Details

  • SHA256: a925ffd54c7804e508862c492b9364bf24e898bc29d322127ec43deee17cff98
  • Pointer size: 128 Bytes
  • Size of remote file: 569 Bytes
earth/earth Extension/Resources/images/toolbar-icon-32.png ADDED

Git LFS Details

  • SHA256: a460e0e0d712743e4441a6606a2c31368b1b4845e6667a5173bf517e2b4a7357
  • Pointer size: 128 Bytes
  • Size of remote file: 919 Bytes
earth/earth Extension/Resources/images/toolbar-icon-38.png ADDED

Git LFS Details

  • SHA256: 054537770ac24af34e88590141674f92bc004a352fc52c5b8b35be233b772c10
  • Pointer size: 129 Bytes
  • Size of remote file: 1.12 kB
earth/earth Extension/Resources/images/toolbar-icon-48.png ADDED

Git LFS Details

  • SHA256: 24b655e5d6be7d991fc349b629f32a1d28b1581089bd9a14365b7795aee09b9e
  • Pointer size: 129 Bytes
  • Size of remote file: 1.42 kB
earth/earth Extension/Resources/images/toolbar-icon-72.png ADDED

Git LFS Details

  • SHA256: 4f033b035064bafe02dd25a8ac53701bec37f265a8dd368cb6094b7435f1705c
  • Pointer size: 129 Bytes
  • Size of remote file: 2.17 kB
earth/earth Extension/Resources/manifest.json ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "manifest_version": 3,
3
+ "default_locale": "en",
4
+
5
+ "name": "__MSG_extension_name__",
6
+ "description": "__MSG_extension_description__",
7
+ "version": "1.0",
8
+
9
+ "icons": {
10
+ "48": "images/icon-48.png",
11
+ "96": "images/icon-96.png",
12
+ "128": "images/icon-128.png",
13
+ "256": "images/icon-256.png",
14
+ "512": "images/icon-512.png"
15
+ },
16
+
17
+ "background": {
18
+ "service_worker": "background.js"
19
+ },
20
+ "permissions": [
21
+ "activeTab",
22
+ "storage",
23
+ "history",
24
+ "notifications",
25
+ "scripting",
26
+ "webNavigation"
27
+ ],
28
+ "content_scripts": [{
29
+ "matches": ["<all_urls>"],
30
+ "js": ["content.js"]
31
+ }],
32
+
33
+ "action": {
34
+ "default_popup": "popup.html",
35
+ "default_icon": {
36
+ "16": "images/toolbar-icon-16.png",
37
+ "19": "images/toolbar-icon-19.png",
38
+ "32": "images/toolbar-icon-32.png",
39
+ "38": "images/toolbar-icon-38.png",
40
+ "48": "images/toolbar-icon-48.png",
41
+ "72": "images/toolbar-icon-72.png"
42
+ }
43
+ },
44
+
45
+ }
earth/earth Extension/Resources/popup.css ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ color-scheme: light dark;
3
+ }
4
+
5
+ body {
6
+ width: 100px;
7
+ padding: 10px;
8
+
9
+ font-family: system-ui;
10
+ text-align: center;
11
+ }
12
+
13
+ @media (prefers-color-scheme: dark) {
14
+ /* Dark Mode styles go here. */
15
+ }
earth/earth Extension/Resources/popup.html ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!-- popup.html -->
2
+ <!DOCTYPE html>
3
+ <html>
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <link rel="stylesheet" href="popup.css">
7
+ </head>
8
+ <body>
9
+ <strong>Hello World!</strong>
10
+ <form id="config-form">
11
+ <label>
12
+ Base URL:
13
+ <input type="text" id="base_url">
14
+ </label>
15
+ <label>
16
+ UID:
17
+ <input type="text" id="uid">
18
+ </label>
19
+ <label>
20
+ Machine ID:
21
+ <input type="text" id="machineid">
22
+ </label>
23
+ <button type="submit">Save</button>
24
+ </form>
25
+ <script type="module" src="popup.js"></script>
26
+ </body>
27
+ </html>
earth/earth Extension/Resources/popup.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // popup.js
2
+ document.getElementById('config-form').addEventListener('submit', function(e) {
3
+ e.preventDefault(); // Prevent the form from being submitted
4
+
5
+ const base_url = document.getElementById('base_url').value;
6
+ const uid = document.getElementById('uid').value;
7
+ const machineid = document.getElementById('machineid').value;
8
+
9
+ // Save the values to chrome.storage
10
+ chrome.storage.sync.set({
11
+ base_url: base_url,
12
+ uid: uid,
13
+ machineid: machineid
14
+ }, function() {
15
+ console.log('Settings saved');
16
+ });
17
+ });
earth/earth Extension/SafariWebExtensionHandler.swift ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ //
2
+ // SafariWebExtensionHandler.swift
3
+ // earth Extension
4
+ //
5
+ // Created by alex newman on 7/22/23.
6
+ //
7
+
8
+ import SafariServices
9
+ import os.log
10
+
11
+ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling {
12
+
13
+ func beginRequest(with context: NSExtensionContext) {
14
+ let item = context.inputItems[0] as! NSExtensionItem
15
+ let message = item.userInfo?[SFExtensionMessageKey]
16
+ os_log(.default, "Received message from browser.runtime.sendNativeMessage: %@", message as! CVarArg)
17
+
18
+ let response = NSExtensionItem()
19
+ response.userInfo = [ SFExtensionMessageKey: [ "Response to": message ] ]
20
+
21
+ context.completeRequest(returningItems: [response], completionHandler: nil)
22
+ }
23
+
24
+ }
earth/earth.xcodeproj/project.pbxproj ADDED
@@ -0,0 +1,849 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // !$*UTF8*$!
2
+ {
3
+ archiveVersion = 1;
4
+ classes = {
5
+ };
6
+ objectVersion = 56;
7
+ objects = {
8
+
9
+ /* Begin PBXBuildFile section */
10
+ CE4912742A6C2DAF00B7FE00 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4912732A6C2DAF00B7FE00 /* AppDelegate.swift */; };
11
+ CE4912782A6C2DAF00B7FE00 /* Main.html in Resources */ = {isa = PBXBuildFile; fileRef = CE4912762A6C2DAF00B7FE00 /* Main.html */; };
12
+ CE49127A2A6C2DAF00B7FE00 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = CE4912792A6C2DAF00B7FE00 /* Icon.png */; };
13
+ CE49127C2A6C2DAF00B7FE00 /* Style.css in Resources */ = {isa = PBXBuildFile; fileRef = CE49127B2A6C2DAF00B7FE00 /* Style.css */; };
14
+ CE49127E2A6C2DAF00B7FE00 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE49127D2A6C2DAF00B7FE00 /* SceneDelegate.swift */; };
15
+ CE4912802A6C2DAF00B7FE00 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE49127F2A6C2DAF00B7FE00 /* ViewController.swift */; };
16
+ CE4912832A6C2DAF00B7FE00 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CE4912812A6C2DAF00B7FE00 /* LaunchScreen.storyboard */; };
17
+ CE4912862A6C2DAF00B7FE00 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CE4912842A6C2DAF00B7FE00 /* Main.storyboard */; };
18
+ CE4912922A6C2DB000B7FE00 /* earthTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4912912A6C2DB000B7FE00 /* earthTests.swift */; };
19
+ CE49129C2A6C2DB000B7FE00 /* earthUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE49129B2A6C2DB000B7FE00 /* earthUITests.swift */; };
20
+ CE49129E2A6C2DB000B7FE00 /* earthUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE49129D2A6C2DB000B7FE00 /* earthUITestsLaunchTests.swift */; };
21
+ CE4912A42A6C2DB000B7FE00 /* earth Extension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = CE4912A32A6C2DB000B7FE00 /* earth Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
22
+ CE4912A92A6C2DB000B7FE00 /* SafariWebExtensionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4912A82A6C2DB000B7FE00 /* SafariWebExtensionHandler.swift */; };
23
+ CE4912AC2A6C2DB000B7FE00 /* _locales in Resources */ = {isa = PBXBuildFile; fileRef = CE4912AB2A6C2DB000B7FE00 /* _locales */; };
24
+ CE4912AE2A6C2DB000B7FE00 /* images in Resources */ = {isa = PBXBuildFile; fileRef = CE4912AD2A6C2DB000B7FE00 /* images */; };
25
+ CE4912B02A6C2DB000B7FE00 /* manifest.json in Resources */ = {isa = PBXBuildFile; fileRef = CE4912AF2A6C2DB000B7FE00 /* manifest.json */; };
26
+ CE4912B22A6C2DB000B7FE00 /* background.js in Resources */ = {isa = PBXBuildFile; fileRef = CE4912B12A6C2DB000B7FE00 /* background.js */; };
27
+ CE4912B42A6C2DB000B7FE00 /* content.js in Resources */ = {isa = PBXBuildFile; fileRef = CE4912B32A6C2DB000B7FE00 /* content.js */; };
28
+ CE4912B62A6C2DB000B7FE00 /* popup.html in Resources */ = {isa = PBXBuildFile; fileRef = CE4912B52A6C2DB000B7FE00 /* popup.html */; };
29
+ CE4912B82A6C2DB000B7FE00 /* popup.css in Resources */ = {isa = PBXBuildFile; fileRef = CE4912B72A6C2DB000B7FE00 /* popup.css */; };
30
+ CE4912BA2A6C2DB000B7FE00 /* popup.js in Resources */ = {isa = PBXBuildFile; fileRef = CE4912B92A6C2DB000B7FE00 /* popup.js */; };
31
+ CE4912BC2A6C2DB000B7FE00 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CE4912872A6C2DB000B7FE00 /* Assets.xcassets */; };
32
+ /* End PBXBuildFile section */
33
+
34
+ /* Begin PBXContainerItemProxy section */
35
+ CE49128E2A6C2DB000B7FE00 /* PBXContainerItemProxy */ = {
36
+ isa = PBXContainerItemProxy;
37
+ containerPortal = CE4912682A6C2DAF00B7FE00 /* Project object */;
38
+ proxyType = 1;
39
+ remoteGlobalIDString = CE49126F2A6C2DAF00B7FE00;
40
+ remoteInfo = earth;
41
+ };
42
+ CE4912982A6C2DB000B7FE00 /* PBXContainerItemProxy */ = {
43
+ isa = PBXContainerItemProxy;
44
+ containerPortal = CE4912682A6C2DAF00B7FE00 /* Project object */;
45
+ proxyType = 1;
46
+ remoteGlobalIDString = CE49126F2A6C2DAF00B7FE00;
47
+ remoteInfo = earth;
48
+ };
49
+ CE4912A52A6C2DB000B7FE00 /* PBXContainerItemProxy */ = {
50
+ isa = PBXContainerItemProxy;
51
+ containerPortal = CE4912682A6C2DAF00B7FE00 /* Project object */;
52
+ proxyType = 1;
53
+ remoteGlobalIDString = CE4912A22A6C2DB000B7FE00;
54
+ remoteInfo = "earth Extension";
55
+ };
56
+ /* End PBXContainerItemProxy section */
57
+
58
+ /* Begin PBXCopyFilesBuildPhase section */
59
+ CE4912C22A6C2DB000B7FE00 /* Embed Foundation Extensions */ = {
60
+ isa = PBXCopyFilesBuildPhase;
61
+ buildActionMask = 2147483647;
62
+ dstPath = "";
63
+ dstSubfolderSpec = 13;
64
+ files = (
65
+ CE4912A42A6C2DB000B7FE00 /* earth Extension.appex in Embed Foundation Extensions */,
66
+ );
67
+ name = "Embed Foundation Extensions";
68
+ runOnlyForDeploymentPostprocessing = 0;
69
+ };
70
+ /* End PBXCopyFilesBuildPhase section */
71
+
72
+ /* Begin PBXFileReference section */
73
+ CE4912702A6C2DAF00B7FE00 /* earth.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = earth.app; sourceTree = BUILT_PRODUCTS_DIR; };
74
+ CE4912732A6C2DAF00B7FE00 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
75
+ CE4912772A6C2DAF00B7FE00 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = Base; path = ../Base.lproj/Main.html; sourceTree = "<group>"; };
76
+ CE4912792A6C2DAF00B7FE00 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = "<group>"; };
77
+ CE49127B2A6C2DAF00B7FE00 /* Style.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = Style.css; sourceTree = "<group>"; };
78
+ CE49127D2A6C2DAF00B7FE00 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
79
+ CE49127F2A6C2DAF00B7FE00 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
80
+ CE4912822A6C2DAF00B7FE00 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
81
+ CE4912852A6C2DAF00B7FE00 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
82
+ CE4912872A6C2DB000B7FE00 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
83
+ CE4912882A6C2DB000B7FE00 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
84
+ CE49128D2A6C2DB000B7FE00 /* earthTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = earthTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
85
+ CE4912912A6C2DB000B7FE00 /* earthTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = earthTests.swift; sourceTree = "<group>"; };
86
+ CE4912972A6C2DB000B7FE00 /* earthUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = earthUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
87
+ CE49129B2A6C2DB000B7FE00 /* earthUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = earthUITests.swift; sourceTree = "<group>"; };
88
+ CE49129D2A6C2DB000B7FE00 /* earthUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = earthUITestsLaunchTests.swift; sourceTree = "<group>"; };
89
+ CE4912A32A6C2DB000B7FE00 /* earth Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "earth Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
90
+ CE4912A82A6C2DB000B7FE00 /* SafariWebExtensionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariWebExtensionHandler.swift; sourceTree = "<group>"; };
91
+ CE4912AB2A6C2DB000B7FE00 /* _locales */ = {isa = PBXFileReference; lastKnownFileType = folder; path = _locales; sourceTree = "<group>"; };
92
+ CE4912AD2A6C2DB000B7FE00 /* images */ = {isa = PBXFileReference; lastKnownFileType = folder; path = images; sourceTree = "<group>"; };
93
+ CE4912AF2A6C2DB000B7FE00 /* manifest.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = manifest.json; sourceTree = "<group>"; };
94
+ CE4912B12A6C2DB000B7FE00 /* background.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = background.js; sourceTree = "<group>"; };
95
+ CE4912B32A6C2DB000B7FE00 /* content.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = content.js; sourceTree = "<group>"; };
96
+ CE4912B52A6C2DB000B7FE00 /* popup.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = popup.html; sourceTree = "<group>"; };
97
+ CE4912B72A6C2DB000B7FE00 /* popup.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = popup.css; sourceTree = "<group>"; };
98
+ CE4912B92A6C2DB000B7FE00 /* popup.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = popup.js; sourceTree = "<group>"; };
99
+ CE4912BB2A6C2DB000B7FE00 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
100
+ /* End PBXFileReference section */
101
+
102
+ /* Begin PBXFrameworksBuildPhase section */
103
+ CE49126D2A6C2DAF00B7FE00 /* Frameworks */ = {
104
+ isa = PBXFrameworksBuildPhase;
105
+ buildActionMask = 2147483647;
106
+ files = (
107
+ );
108
+ runOnlyForDeploymentPostprocessing = 0;
109
+ };
110
+ CE49128A2A6C2DB000B7FE00 /* Frameworks */ = {
111
+ isa = PBXFrameworksBuildPhase;
112
+ buildActionMask = 2147483647;
113
+ files = (
114
+ );
115
+ runOnlyForDeploymentPostprocessing = 0;
116
+ };
117
+ CE4912942A6C2DB000B7FE00 /* Frameworks */ = {
118
+ isa = PBXFrameworksBuildPhase;
119
+ buildActionMask = 2147483647;
120
+ files = (
121
+ );
122
+ runOnlyForDeploymentPostprocessing = 0;
123
+ };
124
+ CE4912A02A6C2DB000B7FE00 /* Frameworks */ = {
125
+ isa = PBXFrameworksBuildPhase;
126
+ buildActionMask = 2147483647;
127
+ files = (
128
+ );
129
+ runOnlyForDeploymentPostprocessing = 0;
130
+ };
131
+ /* End PBXFrameworksBuildPhase section */
132
+
133
+ /* Begin PBXGroup section */
134
+ CE4912672A6C2DAF00B7FE00 = {
135
+ isa = PBXGroup;
136
+ children = (
137
+ CE4912722A6C2DAF00B7FE00 /* earth */,
138
+ CE4912902A6C2DB000B7FE00 /* earthTests */,
139
+ CE49129A2A6C2DB000B7FE00 /* earthUITests */,
140
+ CE4912A72A6C2DB000B7FE00 /* earth Extension */,
141
+ CE4912712A6C2DAF00B7FE00 /* Products */,
142
+ );
143
+ sourceTree = "<group>";
144
+ };
145
+ CE4912712A6C2DAF00B7FE00 /* Products */ = {
146
+ isa = PBXGroup;
147
+ children = (
148
+ CE4912702A6C2DAF00B7FE00 /* earth.app */,
149
+ CE49128D2A6C2DB000B7FE00 /* earthTests.xctest */,
150
+ CE4912972A6C2DB000B7FE00 /* earthUITests.xctest */,
151
+ CE4912A32A6C2DB000B7FE00 /* earth Extension.appex */,
152
+ );
153
+ name = Products;
154
+ sourceTree = "<group>";
155
+ };
156
+ CE4912722A6C2DAF00B7FE00 /* earth */ = {
157
+ isa = PBXGroup;
158
+ children = (
159
+ CE4912732A6C2DAF00B7FE00 /* AppDelegate.swift */,
160
+ CE49127D2A6C2DAF00B7FE00 /* SceneDelegate.swift */,
161
+ CE49127F2A6C2DAF00B7FE00 /* ViewController.swift */,
162
+ CE4912812A6C2DAF00B7FE00 /* LaunchScreen.storyboard */,
163
+ CE4912842A6C2DAF00B7FE00 /* Main.storyboard */,
164
+ CE4912872A6C2DB000B7FE00 /* Assets.xcassets */,
165
+ CE4912882A6C2DB000B7FE00 /* Info.plist */,
166
+ CE4912752A6C2DAF00B7FE00 /* Resources */,
167
+ );
168
+ path = earth;
169
+ sourceTree = "<group>";
170
+ };
171
+ CE4912752A6C2DAF00B7FE00 /* Resources */ = {
172
+ isa = PBXGroup;
173
+ children = (
174
+ CE4912762A6C2DAF00B7FE00 /* Main.html */,
175
+ CE4912792A6C2DAF00B7FE00 /* Icon.png */,
176
+ CE49127B2A6C2DAF00B7FE00 /* Style.css */,
177
+ );
178
+ path = Resources;
179
+ sourceTree = "<group>";
180
+ };
181
+ CE4912902A6C2DB000B7FE00 /* earthTests */ = {
182
+ isa = PBXGroup;
183
+ children = (
184
+ CE4912912A6C2DB000B7FE00 /* earthTests.swift */,
185
+ );
186
+ path = earthTests;
187
+ sourceTree = "<group>";
188
+ };
189
+ CE49129A2A6C2DB000B7FE00 /* earthUITests */ = {
190
+ isa = PBXGroup;
191
+ children = (
192
+ CE49129B2A6C2DB000B7FE00 /* earthUITests.swift */,
193
+ CE49129D2A6C2DB000B7FE00 /* earthUITestsLaunchTests.swift */,
194
+ );
195
+ path = earthUITests;
196
+ sourceTree = "<group>";
197
+ };
198
+ CE4912A72A6C2DB000B7FE00 /* earth Extension */ = {
199
+ isa = PBXGroup;
200
+ children = (
201
+ CE4912A82A6C2DB000B7FE00 /* SafariWebExtensionHandler.swift */,
202
+ CE4912BB2A6C2DB000B7FE00 /* Info.plist */,
203
+ CE4912AA2A6C2DB000B7FE00 /* Resources */,
204
+ );
205
+ path = "earth Extension";
206
+ sourceTree = "<group>";
207
+ };
208
+ CE4912AA2A6C2DB000B7FE00 /* Resources */ = {
209
+ isa = PBXGroup;
210
+ children = (
211
+ CE4912AB2A6C2DB000B7FE00 /* _locales */,
212
+ CE4912AD2A6C2DB000B7FE00 /* images */,
213
+ CE4912AF2A6C2DB000B7FE00 /* manifest.json */,
214
+ CE4912B12A6C2DB000B7FE00 /* background.js */,
215
+ CE4912B32A6C2DB000B7FE00 /* content.js */,
216
+ CE4912B52A6C2DB000B7FE00 /* popup.html */,
217
+ CE4912B72A6C2DB000B7FE00 /* popup.css */,
218
+ CE4912B92A6C2DB000B7FE00 /* popup.js */,
219
+ );
220
+ path = Resources;
221
+ sourceTree = "<group>";
222
+ };
223
+ /* End PBXGroup section */
224
+
225
+ /* Begin PBXNativeTarget section */
226
+ CE49126F2A6C2DAF00B7FE00 /* earth */ = {
227
+ isa = PBXNativeTarget;
228
+ buildConfigurationList = CE4912C32A6C2DB000B7FE00 /* Build configuration list for PBXNativeTarget "earth" */;
229
+ buildPhases = (
230
+ CE49126C2A6C2DAF00B7FE00 /* Sources */,
231
+ CE49126D2A6C2DAF00B7FE00 /* Frameworks */,
232
+ CE49126E2A6C2DAF00B7FE00 /* Resources */,
233
+ CE4912C22A6C2DB000B7FE00 /* Embed Foundation Extensions */,
234
+ );
235
+ buildRules = (
236
+ );
237
+ dependencies = (
238
+ CE4912A62A6C2DB000B7FE00 /* PBXTargetDependency */,
239
+ );
240
+ name = earth;
241
+ productName = earth;
242
+ productReference = CE4912702A6C2DAF00B7FE00 /* earth.app */;
243
+ productType = "com.apple.product-type.application";
244
+ };
245
+ CE49128C2A6C2DB000B7FE00 /* earthTests */ = {
246
+ isa = PBXNativeTarget;
247
+ buildConfigurationList = CE4912C62A6C2DB000B7FE00 /* Build configuration list for PBXNativeTarget "earthTests" */;
248
+ buildPhases = (
249
+ CE4912892A6C2DB000B7FE00 /* Sources */,
250
+ CE49128A2A6C2DB000B7FE00 /* Frameworks */,
251
+ CE49128B2A6C2DB000B7FE00 /* Resources */,
252
+ );
253
+ buildRules = (
254
+ );
255
+ dependencies = (
256
+ CE49128F2A6C2DB000B7FE00 /* PBXTargetDependency */,
257
+ );
258
+ name = earthTests;
259
+ productName = earthTests;
260
+ productReference = CE49128D2A6C2DB000B7FE00 /* earthTests.xctest */;
261
+ productType = "com.apple.product-type.bundle.unit-test";
262
+ };
263
+ CE4912962A6C2DB000B7FE00 /* earthUITests */ = {
264
+ isa = PBXNativeTarget;
265
+ buildConfigurationList = CE4912C92A6C2DB000B7FE00 /* Build configuration list for PBXNativeTarget "earthUITests" */;
266
+ buildPhases = (
267
+ CE4912932A6C2DB000B7FE00 /* Sources */,
268
+ CE4912942A6C2DB000B7FE00 /* Frameworks */,
269
+ CE4912952A6C2DB000B7FE00 /* Resources */,
270
+ );
271
+ buildRules = (
272
+ );
273
+ dependencies = (
274
+ CE4912992A6C2DB000B7FE00 /* PBXTargetDependency */,
275
+ );
276
+ name = earthUITests;
277
+ productName = earthUITests;
278
+ productReference = CE4912972A6C2DB000B7FE00 /* earthUITests.xctest */;
279
+ productType = "com.apple.product-type.bundle.ui-testing";
280
+ };
281
+ CE4912A22A6C2DB000B7FE00 /* earth Extension */ = {
282
+ isa = PBXNativeTarget;
283
+ buildConfigurationList = CE4912BF2A6C2DB000B7FE00 /* Build configuration list for PBXNativeTarget "earth Extension" */;
284
+ buildPhases = (
285
+ CE49129F2A6C2DB000B7FE00 /* Sources */,
286
+ CE4912A02A6C2DB000B7FE00 /* Frameworks */,
287
+ CE4912A12A6C2DB000B7FE00 /* Resources */,
288
+ );
289
+ buildRules = (
290
+ );
291
+ dependencies = (
292
+ );
293
+ name = "earth Extension";
294
+ productName = "earth Extension";
295
+ productReference = CE4912A32A6C2DB000B7FE00 /* earth Extension.appex */;
296
+ productType = "com.apple.product-type.app-extension";
297
+ };
298
+ /* End PBXNativeTarget section */
299
+
300
+ /* Begin PBXProject section */
301
+ CE4912682A6C2DAF00B7FE00 /* Project object */ = {
302
+ isa = PBXProject;
303
+ attributes = {
304
+ BuildIndependentTargetsInParallel = 1;
305
+ LastSwiftUpdateCheck = 1430;
306
+ LastUpgradeCheck = 1430;
307
+ TargetAttributes = {
308
+ CE49126F2A6C2DAF00B7FE00 = {
309
+ CreatedOnToolsVersion = 14.3.1;
310
+ };
311
+ CE49128C2A6C2DB000B7FE00 = {
312
+ CreatedOnToolsVersion = 14.3.1;
313
+ TestTargetID = CE49126F2A6C2DAF00B7FE00;
314
+ };
315
+ CE4912962A6C2DB000B7FE00 = {
316
+ CreatedOnToolsVersion = 14.3.1;
317
+ TestTargetID = CE49126F2A6C2DAF00B7FE00;
318
+ };
319
+ CE4912A22A6C2DB000B7FE00 = {
320
+ CreatedOnToolsVersion = 14.3.1;
321
+ };
322
+ };
323
+ };
324
+ buildConfigurationList = CE49126B2A6C2DAF00B7FE00 /* Build configuration list for PBXProject "earth" */;
325
+ compatibilityVersion = "Xcode 14.0";
326
+ developmentRegion = en;
327
+ hasScannedForEncodings = 0;
328
+ knownRegions = (
329
+ en,
330
+ Base,
331
+ );
332
+ mainGroup = CE4912672A6C2DAF00B7FE00;
333
+ productRefGroup = CE4912712A6C2DAF00B7FE00 /* Products */;
334
+ projectDirPath = "";
335
+ projectRoot = "";
336
+ targets = (
337
+ CE49126F2A6C2DAF00B7FE00 /* earth */,
338
+ CE49128C2A6C2DB000B7FE00 /* earthTests */,
339
+ CE4912962A6C2DB000B7FE00 /* earthUITests */,
340
+ CE4912A22A6C2DB000B7FE00 /* earth Extension */,
341
+ );
342
+ };
343
+ /* End PBXProject section */
344
+
345
+ /* Begin PBXResourcesBuildPhase section */
346
+ CE49126E2A6C2DAF00B7FE00 /* Resources */ = {
347
+ isa = PBXResourcesBuildPhase;
348
+ buildActionMask = 2147483647;
349
+ files = (
350
+ CE49127A2A6C2DAF00B7FE00 /* Icon.png in Resources */,
351
+ CE4912862A6C2DAF00B7FE00 /* Main.storyboard in Resources */,
352
+ CE4912832A6C2DAF00B7FE00 /* LaunchScreen.storyboard in Resources */,
353
+ CE4912782A6C2DAF00B7FE00 /* Main.html in Resources */,
354
+ CE4912BC2A6C2DB000B7FE00 /* Assets.xcassets in Resources */,
355
+ CE49127C2A6C2DAF00B7FE00 /* Style.css in Resources */,
356
+ );
357
+ runOnlyForDeploymentPostprocessing = 0;
358
+ };
359
+ CE49128B2A6C2DB000B7FE00 /* Resources */ = {
360
+ isa = PBXResourcesBuildPhase;
361
+ buildActionMask = 2147483647;
362
+ files = (
363
+ );
364
+ runOnlyForDeploymentPostprocessing = 0;
365
+ };
366
+ CE4912952A6C2DB000B7FE00 /* Resources */ = {
367
+ isa = PBXResourcesBuildPhase;
368
+ buildActionMask = 2147483647;
369
+ files = (
370
+ );
371
+ runOnlyForDeploymentPostprocessing = 0;
372
+ };
373
+ CE4912A12A6C2DB000B7FE00 /* Resources */ = {
374
+ isa = PBXResourcesBuildPhase;
375
+ buildActionMask = 2147483647;
376
+ files = (
377
+ CE4912B22A6C2DB000B7FE00 /* background.js in Resources */,
378
+ CE4912B82A6C2DB000B7FE00 /* popup.css in Resources */,
379
+ CE4912B62A6C2DB000B7FE00 /* popup.html in Resources */,
380
+ CE4912AE2A6C2DB000B7FE00 /* images in Resources */,
381
+ CE4912B02A6C2DB000B7FE00 /* manifest.json in Resources */,
382
+ CE4912AC2A6C2DB000B7FE00 /* _locales in Resources */,
383
+ CE4912B42A6C2DB000B7FE00 /* content.js in Resources */,
384
+ CE4912BA2A6C2DB000B7FE00 /* popup.js in Resources */,
385
+ );
386
+ runOnlyForDeploymentPostprocessing = 0;
387
+ };
388
+ /* End PBXResourcesBuildPhase section */
389
+
390
+ /* Begin PBXSourcesBuildPhase section */
391
+ CE49126C2A6C2DAF00B7FE00 /* Sources */ = {
392
+ isa = PBXSourcesBuildPhase;
393
+ buildActionMask = 2147483647;
394
+ files = (
395
+ CE4912802A6C2DAF00B7FE00 /* ViewController.swift in Sources */,
396
+ CE4912742A6C2DAF00B7FE00 /* AppDelegate.swift in Sources */,
397
+ CE49127E2A6C2DAF00B7FE00 /* SceneDelegate.swift in Sources */,
398
+ );
399
+ runOnlyForDeploymentPostprocessing = 0;
400
+ };
401
+ CE4912892A6C2DB000B7FE00 /* Sources */ = {
402
+ isa = PBXSourcesBuildPhase;
403
+ buildActionMask = 2147483647;
404
+ files = (
405
+ CE4912922A6C2DB000B7FE00 /* earthTests.swift in Sources */,
406
+ );
407
+ runOnlyForDeploymentPostprocessing = 0;
408
+ };
409
+ CE4912932A6C2DB000B7FE00 /* Sources */ = {
410
+ isa = PBXSourcesBuildPhase;
411
+ buildActionMask = 2147483647;
412
+ files = (
413
+ CE49129C2A6C2DB000B7FE00 /* earthUITests.swift in Sources */,
414
+ CE49129E2A6C2DB000B7FE00 /* earthUITestsLaunchTests.swift in Sources */,
415
+ );
416
+ runOnlyForDeploymentPostprocessing = 0;
417
+ };
418
+ CE49129F2A6C2DB000B7FE00 /* Sources */ = {
419
+ isa = PBXSourcesBuildPhase;
420
+ buildActionMask = 2147483647;
421
+ files = (
422
+ CE4912A92A6C2DB000B7FE00 /* SafariWebExtensionHandler.swift in Sources */,
423
+ );
424
+ runOnlyForDeploymentPostprocessing = 0;
425
+ };
426
+ /* End PBXSourcesBuildPhase section */
427
+
428
+ /* Begin PBXTargetDependency section */
429
+ CE49128F2A6C2DB000B7FE00 /* PBXTargetDependency */ = {
430
+ isa = PBXTargetDependency;
431
+ target = CE49126F2A6C2DAF00B7FE00 /* earth */;
432
+ targetProxy = CE49128E2A6C2DB000B7FE00 /* PBXContainerItemProxy */;
433
+ };
434
+ CE4912992A6C2DB000B7FE00 /* PBXTargetDependency */ = {
435
+ isa = PBXTargetDependency;
436
+ target = CE49126F2A6C2DAF00B7FE00 /* earth */;
437
+ targetProxy = CE4912982A6C2DB000B7FE00 /* PBXContainerItemProxy */;
438
+ };
439
+ CE4912A62A6C2DB000B7FE00 /* PBXTargetDependency */ = {
440
+ isa = PBXTargetDependency;
441
+ target = CE4912A22A6C2DB000B7FE00 /* earth Extension */;
442
+ targetProxy = CE4912A52A6C2DB000B7FE00 /* PBXContainerItemProxy */;
443
+ };
444
+ /* End PBXTargetDependency section */
445
+
446
+ /* Begin PBXVariantGroup section */
447
+ CE4912762A6C2DAF00B7FE00 /* Main.html */ = {
448
+ isa = PBXVariantGroup;
449
+ children = (
450
+ CE4912772A6C2DAF00B7FE00 /* Base */,
451
+ );
452
+ name = Main.html;
453
+ sourceTree = "<group>";
454
+ };
455
+ CE4912812A6C2DAF00B7FE00 /* LaunchScreen.storyboard */ = {
456
+ isa = PBXVariantGroup;
457
+ children = (
458
+ CE4912822A6C2DAF00B7FE00 /* Base */,
459
+ );
460
+ name = LaunchScreen.storyboard;
461
+ sourceTree = "<group>";
462
+ };
463
+ CE4912842A6C2DAF00B7FE00 /* Main.storyboard */ = {
464
+ isa = PBXVariantGroup;
465
+ children = (
466
+ CE4912852A6C2DAF00B7FE00 /* Base */,
467
+ );
468
+ name = Main.storyboard;
469
+ sourceTree = "<group>";
470
+ };
471
+ /* End PBXVariantGroup section */
472
+
473
+ /* Begin XCBuildConfiguration section */
474
+ CE4912BD2A6C2DB000B7FE00 /* Debug */ = {
475
+ isa = XCBuildConfiguration;
476
+ buildSettings = {
477
+ ALWAYS_SEARCH_USER_PATHS = NO;
478
+ CLANG_ANALYZER_NONNULL = YES;
479
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
480
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
481
+ CLANG_ENABLE_MODULES = YES;
482
+ CLANG_ENABLE_OBJC_ARC = YES;
483
+ CLANG_ENABLE_OBJC_WEAK = YES;
484
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
485
+ CLANG_WARN_BOOL_CONVERSION = YES;
486
+ CLANG_WARN_COMMA = YES;
487
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
488
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
489
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
490
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
491
+ CLANG_WARN_EMPTY_BODY = YES;
492
+ CLANG_WARN_ENUM_CONVERSION = YES;
493
+ CLANG_WARN_INFINITE_RECURSION = YES;
494
+ CLANG_WARN_INT_CONVERSION = YES;
495
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
496
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
497
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
498
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
499
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
500
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
501
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
502
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
503
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
504
+ CLANG_WARN_UNREACHABLE_CODE = YES;
505
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
506
+ COPY_PHASE_STRIP = NO;
507
+ DEBUG_INFORMATION_FORMAT = dwarf;
508
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
509
+ ENABLE_TESTABILITY = YES;
510
+ GCC_C_LANGUAGE_STANDARD = gnu11;
511
+ GCC_DYNAMIC_NO_PIC = NO;
512
+ GCC_NO_COMMON_BLOCKS = YES;
513
+ GCC_OPTIMIZATION_LEVEL = 0;
514
+ GCC_PREPROCESSOR_DEFINITIONS = (
515
+ "DEBUG=1",
516
+ "$(inherited)",
517
+ );
518
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
519
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
520
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
521
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
522
+ GCC_WARN_UNUSED_FUNCTION = YES;
523
+ GCC_WARN_UNUSED_VARIABLE = YES;
524
+ IPHONEOS_DEPLOYMENT_TARGET = 16.4;
525
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
526
+ MTL_FAST_MATH = YES;
527
+ ONLY_ACTIVE_ARCH = YES;
528
+ SDKROOT = iphoneos;
529
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
530
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
531
+ };
532
+ name = Debug;
533
+ };
534
+ CE4912BE2A6C2DB000B7FE00 /* Release */ = {
535
+ isa = XCBuildConfiguration;
536
+ buildSettings = {
537
+ ALWAYS_SEARCH_USER_PATHS = NO;
538
+ CLANG_ANALYZER_NONNULL = YES;
539
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
540
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
541
+ CLANG_ENABLE_MODULES = YES;
542
+ CLANG_ENABLE_OBJC_ARC = YES;
543
+ CLANG_ENABLE_OBJC_WEAK = YES;
544
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
545
+ CLANG_WARN_BOOL_CONVERSION = YES;
546
+ CLANG_WARN_COMMA = YES;
547
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
548
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
549
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
550
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
551
+ CLANG_WARN_EMPTY_BODY = YES;
552
+ CLANG_WARN_ENUM_CONVERSION = YES;
553
+ CLANG_WARN_INFINITE_RECURSION = YES;
554
+ CLANG_WARN_INT_CONVERSION = YES;
555
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
556
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
557
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
558
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
559
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
560
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
561
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
562
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
563
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
564
+ CLANG_WARN_UNREACHABLE_CODE = YES;
565
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
566
+ COPY_PHASE_STRIP = NO;
567
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
568
+ ENABLE_NS_ASSERTIONS = NO;
569
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
570
+ GCC_C_LANGUAGE_STANDARD = gnu11;
571
+ GCC_NO_COMMON_BLOCKS = YES;
572
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
573
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
574
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
575
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
576
+ GCC_WARN_UNUSED_FUNCTION = YES;
577
+ GCC_WARN_UNUSED_VARIABLE = YES;
578
+ IPHONEOS_DEPLOYMENT_TARGET = 16.4;
579
+ MTL_ENABLE_DEBUG_INFO = NO;
580
+ MTL_FAST_MATH = YES;
581
+ SDKROOT = iphoneos;
582
+ SWIFT_COMPILATION_MODE = wholemodule;
583
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
584
+ VALIDATE_PRODUCT = YES;
585
+ };
586
+ name = Release;
587
+ };
588
+ CE4912C02A6C2DB000B7FE00 /* Debug */ = {
589
+ isa = XCBuildConfiguration;
590
+ buildSettings = {
591
+ CODE_SIGN_STYLE = Automatic;
592
+ CURRENT_PROJECT_VERSION = 1;
593
+ DEVELOPMENT_TEAM = 2858MX5336;
594
+ GENERATE_INFOPLIST_FILE = YES;
595
+ INFOPLIST_FILE = "earth Extension/Info.plist";
596
+ INFOPLIST_KEY_CFBundleDisplayName = "earth Extension";
597
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
598
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
599
+ LD_RUNPATH_SEARCH_PATHS = (
600
+ "$(inherited)",
601
+ "@executable_path/Frameworks",
602
+ "@executable_path/../../Frameworks",
603
+ );
604
+ MARKETING_VERSION = 1.0;
605
+ OTHER_LDFLAGS = (
606
+ "-framework",
607
+ SafariServices,
608
+ );
609
+ PRODUCT_BUNDLE_IDENTIFIER = com.ttt246.earth.Extension;
610
+ PRODUCT_NAME = "$(TARGET_NAME)";
611
+ SKIP_INSTALL = YES;
612
+ SWIFT_EMIT_LOC_STRINGS = YES;
613
+ SWIFT_VERSION = 5.0;
614
+ TARGETED_DEVICE_FAMILY = "1,2";
615
+ };
616
+ name = Debug;
617
+ };
618
+ CE4912C12A6C2DB000B7FE00 /* Release */ = {
619
+ isa = XCBuildConfiguration;
620
+ buildSettings = {
621
+ CODE_SIGN_STYLE = Automatic;
622
+ CURRENT_PROJECT_VERSION = 1;
623
+ DEVELOPMENT_TEAM = 2858MX5336;
624
+ GENERATE_INFOPLIST_FILE = YES;
625
+ INFOPLIST_FILE = "earth Extension/Info.plist";
626
+ INFOPLIST_KEY_CFBundleDisplayName = "earth Extension";
627
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
628
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
629
+ LD_RUNPATH_SEARCH_PATHS = (
630
+ "$(inherited)",
631
+ "@executable_path/Frameworks",
632
+ "@executable_path/../../Frameworks",
633
+ );
634
+ MARKETING_VERSION = 1.0;
635
+ OTHER_LDFLAGS = (
636
+ "-framework",
637
+ SafariServices,
638
+ );
639
+ PRODUCT_BUNDLE_IDENTIFIER = com.ttt246.earth.Extension;
640
+ PRODUCT_NAME = "$(TARGET_NAME)";
641
+ SKIP_INSTALL = YES;
642
+ SWIFT_EMIT_LOC_STRINGS = YES;
643
+ SWIFT_VERSION = 5.0;
644
+ TARGETED_DEVICE_FAMILY = "1,2";
645
+ };
646
+ name = Release;
647
+ };
648
+ CE4912C42A6C2DB000B7FE00 /* Debug */ = {
649
+ isa = XCBuildConfiguration;
650
+ buildSettings = {
651
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
652
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
653
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
654
+ CODE_SIGN_STYLE = Automatic;
655
+ CURRENT_PROJECT_VERSION = 1;
656
+ DEVELOPMENT_TEAM = 2858MX5336;
657
+ GENERATE_INFOPLIST_FILE = YES;
658
+ INFOPLIST_FILE = earth/Info.plist;
659
+ INFOPLIST_KEY_CFBundleDisplayName = earth;
660
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
661
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
662
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
663
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
664
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
665
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
666
+ LD_RUNPATH_SEARCH_PATHS = (
667
+ "$(inherited)",
668
+ "@executable_path/Frameworks",
669
+ );
670
+ MARKETING_VERSION = 1.0;
671
+ OTHER_LDFLAGS = (
672
+ "-framework",
673
+ SafariServices,
674
+ "-framework",
675
+ WebKit,
676
+ );
677
+ PRODUCT_BUNDLE_IDENTIFIER = com.ttt246.earth;
678
+ PRODUCT_NAME = "$(TARGET_NAME)";
679
+ SWIFT_EMIT_LOC_STRINGS = YES;
680
+ SWIFT_VERSION = 5.0;
681
+ TARGETED_DEVICE_FAMILY = "1,2";
682
+ };
683
+ name = Debug;
684
+ };
685
+ CE4912C52A6C2DB000B7FE00 /* Release */ = {
686
+ isa = XCBuildConfiguration;
687
+ buildSettings = {
688
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
689
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
690
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
691
+ CODE_SIGN_STYLE = Automatic;
692
+ CURRENT_PROJECT_VERSION = 1;
693
+ DEVELOPMENT_TEAM = 2858MX5336;
694
+ GENERATE_INFOPLIST_FILE = YES;
695
+ INFOPLIST_FILE = earth/Info.plist;
696
+ INFOPLIST_KEY_CFBundleDisplayName = earth;
697
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
698
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
699
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
700
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
701
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
702
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
703
+ LD_RUNPATH_SEARCH_PATHS = (
704
+ "$(inherited)",
705
+ "@executable_path/Frameworks",
706
+ );
707
+ MARKETING_VERSION = 1.0;
708
+ OTHER_LDFLAGS = (
709
+ "-framework",
710
+ SafariServices,
711
+ "-framework",
712
+ WebKit,
713
+ );
714
+ PRODUCT_BUNDLE_IDENTIFIER = com.ttt246.earth;
715
+ PRODUCT_NAME = "$(TARGET_NAME)";
716
+ SWIFT_EMIT_LOC_STRINGS = YES;
717
+ SWIFT_VERSION = 5.0;
718
+ TARGETED_DEVICE_FAMILY = "1,2";
719
+ };
720
+ name = Release;
721
+ };
722
+ CE4912C72A6C2DB000B7FE00 /* Debug */ = {
723
+ isa = XCBuildConfiguration;
724
+ buildSettings = {
725
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
726
+ BUNDLE_LOADER = "$(TEST_HOST)";
727
+ CODE_SIGN_STYLE = Automatic;
728
+ CURRENT_PROJECT_VERSION = 1;
729
+ DEVELOPMENT_TEAM = 2858MX5336;
730
+ GENERATE_INFOPLIST_FILE = YES;
731
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
732
+ MARKETING_VERSION = 1.0;
733
+ PRODUCT_BUNDLE_IDENTIFIER = com.ttt246.earthTests;
734
+ PRODUCT_NAME = "$(TARGET_NAME)";
735
+ SWIFT_EMIT_LOC_STRINGS = NO;
736
+ SWIFT_VERSION = 5.0;
737
+ TARGETED_DEVICE_FAMILY = "1,2";
738
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/earth.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/earth";
739
+ };
740
+ name = Debug;
741
+ };
742
+ CE4912C82A6C2DB000B7FE00 /* Release */ = {
743
+ isa = XCBuildConfiguration;
744
+ buildSettings = {
745
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
746
+ BUNDLE_LOADER = "$(TEST_HOST)";
747
+ CODE_SIGN_STYLE = Automatic;
748
+ CURRENT_PROJECT_VERSION = 1;
749
+ DEVELOPMENT_TEAM = 2858MX5336;
750
+ GENERATE_INFOPLIST_FILE = YES;
751
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
752
+ MARKETING_VERSION = 1.0;
753
+ PRODUCT_BUNDLE_IDENTIFIER = com.ttt246.earthTests;
754
+ PRODUCT_NAME = "$(TARGET_NAME)";
755
+ SWIFT_EMIT_LOC_STRINGS = NO;
756
+ SWIFT_VERSION = 5.0;
757
+ TARGETED_DEVICE_FAMILY = "1,2";
758
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/earth.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/earth";
759
+ };
760
+ name = Release;
761
+ };
762
+ CE4912CA2A6C2DB000B7FE00 /* Debug */ = {
763
+ isa = XCBuildConfiguration;
764
+ buildSettings = {
765
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
766
+ CODE_SIGN_STYLE = Automatic;
767
+ CURRENT_PROJECT_VERSION = 1;
768
+ DEVELOPMENT_TEAM = 2858MX5336;
769
+ GENERATE_INFOPLIST_FILE = YES;
770
+ MARKETING_VERSION = 1.0;
771
+ PRODUCT_BUNDLE_IDENTIFIER = com.ttt246.earthUITests;
772
+ PRODUCT_NAME = "$(TARGET_NAME)";
773
+ SWIFT_EMIT_LOC_STRINGS = NO;
774
+ SWIFT_VERSION = 5.0;
775
+ TARGETED_DEVICE_FAMILY = "1,2";
776
+ TEST_TARGET_NAME = earth;
777
+ };
778
+ name = Debug;
779
+ };
780
+ CE4912CB2A6C2DB000B7FE00 /* Release */ = {
781
+ isa = XCBuildConfiguration;
782
+ buildSettings = {
783
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
784
+ CODE_SIGN_STYLE = Automatic;
785
+ CURRENT_PROJECT_VERSION = 1;
786
+ DEVELOPMENT_TEAM = 2858MX5336;
787
+ GENERATE_INFOPLIST_FILE = YES;
788
+ MARKETING_VERSION = 1.0;
789
+ PRODUCT_BUNDLE_IDENTIFIER = com.ttt246.earthUITests;
790
+ PRODUCT_NAME = "$(TARGET_NAME)";
791
+ SWIFT_EMIT_LOC_STRINGS = NO;
792
+ SWIFT_VERSION = 5.0;
793
+ TARGETED_DEVICE_FAMILY = "1,2";
794
+ TEST_TARGET_NAME = earth;
795
+ };
796
+ name = Release;
797
+ };
798
+ /* End XCBuildConfiguration section */
799
+
800
+ /* Begin XCConfigurationList section */
801
+ CE49126B2A6C2DAF00B7FE00 /* Build configuration list for PBXProject "earth" */ = {
802
+ isa = XCConfigurationList;
803
+ buildConfigurations = (
804
+ CE4912BD2A6C2DB000B7FE00 /* Debug */,
805
+ CE4912BE2A6C2DB000B7FE00 /* Release */,
806
+ );
807
+ defaultConfigurationIsVisible = 0;
808
+ defaultConfigurationName = Release;
809
+ };
810
+ CE4912BF2A6C2DB000B7FE00 /* Build configuration list for PBXNativeTarget "earth Extension" */ = {
811
+ isa = XCConfigurationList;
812
+ buildConfigurations = (
813
+ CE4912C02A6C2DB000B7FE00 /* Debug */,
814
+ CE4912C12A6C2DB000B7FE00 /* Release */,
815
+ );
816
+ defaultConfigurationIsVisible = 0;
817
+ defaultConfigurationName = Release;
818
+ };
819
+ CE4912C32A6C2DB000B7FE00 /* Build configuration list for PBXNativeTarget "earth" */ = {
820
+ isa = XCConfigurationList;
821
+ buildConfigurations = (
822
+ CE4912C42A6C2DB000B7FE00 /* Debug */,
823
+ CE4912C52A6C2DB000B7FE00 /* Release */,
824
+ );
825
+ defaultConfigurationIsVisible = 0;
826
+ defaultConfigurationName = Release;
827
+ };
828
+ CE4912C62A6C2DB000B7FE00 /* Build configuration list for PBXNativeTarget "earthTests" */ = {
829
+ isa = XCConfigurationList;
830
+ buildConfigurations = (
831
+ CE4912C72A6C2DB000B7FE00 /* Debug */,
832
+ CE4912C82A6C2DB000B7FE00 /* Release */,
833
+ );
834
+ defaultConfigurationIsVisible = 0;
835
+ defaultConfigurationName = Release;
836
+ };
837
+ CE4912C92A6C2DB000B7FE00 /* Build configuration list for PBXNativeTarget "earthUITests" */ = {
838
+ isa = XCConfigurationList;
839
+ buildConfigurations = (
840
+ CE4912CA2A6C2DB000B7FE00 /* Debug */,
841
+ CE4912CB2A6C2DB000B7FE00 /* Release */,
842
+ );
843
+ defaultConfigurationIsVisible = 0;
844
+ defaultConfigurationName = Release;
845
+ };
846
+ /* End XCConfigurationList section */
847
+ };
848
+ rootObject = CE4912682A6C2DAF00B7FE00 /* Project object */;
849
+ }
earth/earth.xcodeproj/project.xcworkspace/contents.xcworkspacedata ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Workspace
3
+ version = "1.0">
4
+ <FileRef
5
+ location = "self:">
6
+ </FileRef>
7
+ </Workspace>
earth/earth.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>IDEDidComputeMac32BitWarning</key>
6
+ <true/>
7
+ </dict>
8
+ </plist>
earth/earth/AppDelegate.swift ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ //
2
+ // AppDelegate.swift
3
+ // earth
4
+ //
5
+ // Created by alex newman on 7/22/23.
6
+ //
7
+
8
+ import UIKit
9
+
10
+ @main
11
+ class AppDelegate: UIResponder, UIApplicationDelegate {
12
+
13
+ var window: UIWindow?
14
+
15
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
16
+ // Override point for customization after application launch.
17
+ return true
18
+ }
19
+
20
+ func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
21
+ return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
22
+ }
23
+
24
+ }
earth/earth/Assets.xcassets/AccentColor.colorset/Contents.json ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "colors" : [
3
+ {
4
+ "idiom" : "universal"
5
+ }
6
+ ],
7
+ "info" : {
8
+ "author" : "xcode",
9
+ "version" : 1
10
+ }
11
+ }
earth/earth/Assets.xcassets/AppIcon.appiconset/Contents.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "images" : [
3
+ {
4
+ "idiom" : "universal",
5
+ "platform" : "ios",
6
+ "size" : "1024x1024"
7
+ }
8
+ ],
9
+ "info" : {
10
+ "author" : "xcode",
11
+ "version" : 1
12
+ }
13
+ }
earth/earth/Assets.xcassets/Contents.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "info" : {
3
+ "author" : "xcode",
4
+ "version" : 1
5
+ }
6
+ }
earth/earth/Assets.xcassets/LargeIcon.imageset/Contents.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "images" : [
3
+ {
4
+ "idiom" : "universal",
5
+ "scale" : "1x"
6
+ },
7
+ {
8
+ "idiom" : "universal",
9
+ "scale" : "2x"
10
+ },
11
+ {
12
+ "idiom" : "universal",
13
+ "scale" : "3x"
14
+ }
15
+ ],
16
+ "info" : {
17
+ "author" : "xcode",
18
+ "version" : 1
19
+ }
20
+ }
earth/earth/Base.lproj/LaunchScreen.storyboard ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19085" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
3
+ <dependencies>
4
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19082"/>
5
+ <capability name="Image references" minToolsVersion="12.0"/>
6
+ <capability name="Safe area layout guides" minToolsVersion="9.0"/>
7
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
8
+ </dependencies>
9
+ <scenes>
10
+ <!--View Controller-->
11
+ <scene sceneID="EHf-IW-A2E">
12
+ <objects>
13
+ <viewController id="01J-lp-oVM" sceneMemberID="viewController">
14
+ <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
15
+ <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
16
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
17
+ <subviews>
18
+ <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6HG-Um-bch">
19
+ <rect key="frame" x="142" y="385" width="128" height="128"/>
20
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
21
+ <imageReference key="image" image="LargeIcon"/>
22
+ </imageView>
23
+ </subviews>
24
+ <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
25
+ <color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
26
+ </view>
27
+ </viewController>
28
+ <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
29
+ </objects>
30
+ <point key="canvasLocation" x="53" y="375"/>
31
+ </scene>
32
+ </scenes>
33
+ <resources>
34
+ <image name="LargeIcon" width="128" height="128"/>
35
+ </resources>
36
+ </document>
earth/earth/Base.lproj/Main.html ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <meta http-equiv="Content-Security-Policy" content="default-src 'self'">
6
+
7
+ <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
8
+
9
+ <link rel="stylesheet" href="../Style.css">
10
+ </head>
11
+ <body>
12
+ <img src="../Icon.png" width="128" height="128" alt="earth Icon">
13
+ <p>You can turn on earth’s Safari extension in Settings.</p>
14
+ </body>
15
+ </html>
earth/earth/Base.lproj/Main.storyboard ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
3
+ <device id="retina6_1" orientation="portrait" appearance="light"/>
4
+ <dependencies>
5
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/>
6
+ <capability name="Safe area layout guides" minToolsVersion="9.0"/>
7
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
8
+ </dependencies>
9
+ <scenes>
10
+ <!--View Controller-->
11
+ <scene sceneID="tne-QT-ifu">
12
+ <objects>
13
+ <viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
14
+ <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
15
+ <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
16
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
17
+ <subviews>
18
+ <wkWebView contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="RDB-ib-igF">
19
+ <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
20
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
21
+ <wkWebViewConfiguration key="configuration">
22
+ <audiovisualMediaTypes key="mediaTypesRequiringUserActionForPlayback" none="YES"/>
23
+ <wkPreferences key="preferences"/>
24
+ </wkWebViewConfiguration>
25
+ </wkWebView>
26
+ </subviews>
27
+ <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
28
+ </view>
29
+ <connections>
30
+ <outlet property="webView" destination="RDB-ib-igF" id="avx-RC-qRB"/>
31
+ </connections>
32
+ </viewController>
33
+ <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
34
+ </objects>
35
+ <point key="canvasLocation" x="53" y="375"/>
36
+ </scene>
37
+ </scenes>
38
+ </document>
earth/earth/Info.plist ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>UIApplicationSceneManifest</key>
6
+ <dict>
7
+ <key>UIApplicationSupportsMultipleScenes</key>
8
+ <false/>
9
+ <key>UISceneConfigurations</key>
10
+ <dict>
11
+ <key>UIWindowSceneSessionRoleApplication</key>
12
+ <array>
13
+ <dict>
14
+ <key>UISceneConfigurationName</key>
15
+ <string>Default Configuration</string>
16
+ <key>UISceneDelegateClassName</key>
17
+ <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
18
+ <key>UISceneStoryboardFile</key>
19
+ <string>Main</string>
20
+ </dict>
21
+ </array>
22
+ </dict>
23
+ </dict>
24
+ </dict>
25
+ </plist>
earth/earth/Resources/Icon.png ADDED

Git LFS Details

  • SHA256: 8977db6cacb2a680ad429a5bee04ca85b32b5362b3cf78efff3cf0dcbf664172
  • Pointer size: 131 Bytes
  • Size of remote file: 100 kB
earth/earth/Resources/Style.css ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ * {
2
+ -webkit-user-select: none;
3
+ -webkit-user-drag: none;
4
+ cursor: default;
5
+ }
6
+
7
+ :root {
8
+ color-scheme: light dark;
9
+
10
+ --spacing: 20px;
11
+ }
12
+
13
+ html {
14
+ height: 100%;
15
+ }
16
+
17
+ body {
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ flex-direction: column;
22
+
23
+ gap: var(--spacing);
24
+ margin: 0 calc(var(--spacing) * 2);
25
+ height: 100%;
26
+
27
+ font: -apple-system-short-body;
28
+ text-align: center;
29
+ }
earth/earth/SceneDelegate.swift ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ //
2
+ // SceneDelegate.swift
3
+ // earth
4
+ //
5
+ // Created by alex newman on 7/22/23.
6
+ //
7
+
8
+ import UIKit
9
+
10
+ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
11
+
12
+ var window: UIWindow?
13
+
14
+ func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
15
+ guard let _ = (scene as? UIWindowScene) else { return }
16
+ }
17
+
18
+ }
earth/earth/ViewController.swift ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ //
2
+ // ViewController.swift
3
+ // earth
4
+ //
5
+ // Created by alex newman on 7/22/23.
6
+ //
7
+
8
+ import UIKit
9
+ import WebKit
10
+
11
+ class ViewController: UIViewController, WKNavigationDelegate, WKScriptMessageHandler {
12
+
13
+ @IBOutlet var webView: WKWebView!
14
+
15
+ override func viewDidLoad() {
16
+ super.viewDidLoad()
17
+
18
+ self.webView.navigationDelegate = self
19
+ self.webView.scrollView.isScrollEnabled = false
20
+
21
+ self.webView.configuration.userContentController.add(self, name: "controller")
22
+
23
+ self.webView.loadFileURL(Bundle.main.url(forResource: "Main", withExtension: "html")!, allowingReadAccessTo: Bundle.main.resourceURL!)
24
+ }
25
+
26
+ func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
27
+ // Override point for customization.
28
+ }
29
+
30
+ func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
31
+ // Override point for customization.
32
+ }
33
+
34
+ }
earth/earthTests/earthTests.swift ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ //
2
+ // earthTests.swift
3
+ // earthTests
4
+ //
5
+ // Created by alex newman on 7/22/23.
6
+ //
7
+
8
+ import XCTest
9
+ @testable import earth
10
+
11
+ final class earthTests: XCTestCase {
12
+
13
+ override func setUpWithError() throws {
14
+ // Put setup code here. This method is called before the invocation of each test method in the class.
15
+ }
16
+
17
+ override func tearDownWithError() throws {
18
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
19
+ }
20
+
21
+ func testExample() throws {
22
+ // This is an example of a functional test case.
23
+ // Use XCTAssert and related functions to verify your tests produce the correct results.
24
+ // Any test you write for XCTest can be annotated as throws and async.
25
+ // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error.
26
+ // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards.
27
+ }
28
+
29
+ func testPerformanceExample() throws {
30
+ // This is an example of a performance test case.
31
+ self.measure {
32
+ // Put the code you want to measure the time of here.
33
+ }
34
+ }
35
+
36
+ }
earth/earthUITests/earthUITests.swift ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ //
2
+ // earthUITests.swift
3
+ // earthUITests
4
+ //
5
+ // Created by alex newman on 7/22/23.
6
+ //
7
+
8
+ import XCTest
9
+
10
+ final class earthUITests: XCTestCase {
11
+
12
+ override func setUpWithError() throws {
13
+ // Put setup code here. This method is called before the invocation of each test method in the class.
14
+
15
+ // In UI tests it is usually best to stop immediately when a failure occurs.
16
+ continueAfterFailure = false
17
+
18
+ // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
19
+ }
20
+
21
+ override func tearDownWithError() throws {
22
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
23
+ }
24
+
25
+ func testExample() throws {
26
+ // UI tests must launch the application that they test.
27
+ let app = XCUIApplication()
28
+ app.launch()
29
+
30
+ // Use XCTAssert and related functions to verify your tests produce the correct results.
31
+ }
32
+
33
+ func testLaunchPerformance() throws {
34
+ if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) {
35
+ // This measures how long it takes to launch your application.
36
+ measure(metrics: [XCTApplicationLaunchMetric()]) {
37
+ XCUIApplication().launch()
38
+ }
39
+ }
40
+ }
41
+ }
earth/earthUITests/earthUITestsLaunchTests.swift ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ //
2
+ // earthUITestsLaunchTests.swift
3
+ // earthUITests
4
+ //
5
+ // Created by alex newman on 7/22/23.
6
+ //
7
+
8
+ import XCTest
9
+
10
+ final class earthUITestsLaunchTests: XCTestCase {
11
+
12
+ override class var runsForEachTargetApplicationUIConfiguration: Bool {
13
+ true
14
+ }
15
+
16
+ override func setUpWithError() throws {
17
+ continueAfterFailure = false
18
+ }
19
+
20
+ func testLaunch() throws {
21
+ let app = XCUIApplication()
22
+ app.launch()
23
+
24
+ // Insert steps here to perform after app launch but before taking a screenshot,
25
+ // such as logging into a test account or navigating somewhere in the app
26
+
27
+ let attachment = XCTAttachment(screenshot: app.screenshot())
28
+ attachment.name = "Launch Screen"
29
+ attachment.lifetime = .keepAlways
30
+ add(attachment)
31
+ }
32
+ }