Parcourir la source

Merge pull request #1059 from nightscout/release/v0.7.0

Release/v0.7.0
Deniz Cengiz il y a 1 mois
Parent
commit
c9155614eb
100 fichiers modifiés avec 546 ajouts et 6324 suppressions
  1. 3 0
      .github/FUNDING.yml
  2. 1 1
      .github/ISSUE_TEMPLATE/config.yml
  3. 5 5
      .github/workflows/add_identifiers.yml
  4. 1 1
      .github/workflows/add_to_project.yml
  5. 106 0
      .github/workflows/auto_version_dev.yml
  6. 111 196
      .github/workflows/build_trio.yml
  7. 6 6
      .github/workflows/create_certs.yml
  8. 3 3
      .github/workflows/stale_issues.yml
  9. 135 0
      .github/workflows/unit_tests.yml
  10. 6 13
      .github/workflows/validate_secrets.yml
  11. 1 1
      .gitignore
  12. 6 10
      .gitmodules
  13. 1 1
      CGMBLEKit
  14. 1 1
      CODE_OF_CONDUCT.md
  15. 135 0
      CONTRIBUTING.md
  16. 24 6
      Config.xcconfig
  17. 0 140
      Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents
  18. 1 0
      DanaKit
  19. 0 41
      Dependencies/ConnectIQ 2.xcframework/Info.plist
  20. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/ConnectIQ
  21. 0 237
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/Headers/ConnectIQ.h
  22. 0 34
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/Headers/IQApp.h
  23. 0 20
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/Headers/IQAppStatus.h
  24. 0 63
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/Headers/IQConstants.h
  25. 0 61
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/Headers/IQDevice.h
  26. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/Info.plist
  27. 0 6
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/Modules/module.modulemap
  28. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/ar.lproj/IQLocalizable.strings
  29. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/cs.lproj/IQLocalizable.strings
  30. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/da.lproj/IQLocalizable.strings
  31. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/de.lproj/IQLocalizable.strings
  32. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/el.lproj/IQLocalizable.strings
  33. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/en.lproj/IQLocalizable.strings
  34. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/es.lproj/IQLocalizable.strings
  35. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/fi.lproj/IQLocalizable.strings
  36. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/fr.lproj/IQLocalizable.strings
  37. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/he.lproj/IQLocalizable.strings
  38. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/hr.lproj/IQLocalizable.strings
  39. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/hu.lproj/IQLocalizable.strings
  40. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/id.lproj/IQLocalizable.strings
  41. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/it.lproj/IQLocalizable.strings
  42. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/ja.lproj/IQLocalizable.strings
  43. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/ko.lproj/IQLocalizable.strings
  44. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/ms.lproj/IQLocalizable.strings
  45. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/nb.lproj/IQLocalizable.strings
  46. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/nl.lproj/IQLocalizable.strings
  47. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/pl.lproj/IQLocalizable.strings
  48. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/pt-PT.lproj/IQLocalizable.strings
  49. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/pt.lproj/IQLocalizable.strings
  50. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/ru.lproj/IQLocalizable.strings
  51. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/sk.lproj/IQLocalizable.strings
  52. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/sv.lproj/IQLocalizable.strings
  53. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/th.lproj/IQLocalizable.strings
  54. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/tr.lproj/IQLocalizable.strings
  55. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/zh-Hans.lproj/IQLocalizable.strings
  56. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/zh-Hant.lproj/IQLocalizable.strings
  57. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/ConnectIQ
  58. 0 237
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/Headers/ConnectIQ.h
  59. 0 34
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/Headers/IQApp.h
  60. 0 20
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/Headers/IQAppStatus.h
  61. 0 63
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/Headers/IQConstants.h
  62. 0 61
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/Headers/IQDevice.h
  63. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/Info.plist
  64. 0 6
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/Modules/module.modulemap
  65. 0 830
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/_CodeSignature/CodeResources
  66. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/ar.lproj/IQLocalizable.strings
  67. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/cs.lproj/IQLocalizable.strings
  68. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/da.lproj/IQLocalizable.strings
  69. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/de.lproj/IQLocalizable.strings
  70. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/el.lproj/IQLocalizable.strings
  71. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/en.lproj/IQLocalizable.strings
  72. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/es.lproj/IQLocalizable.strings
  73. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/fi.lproj/IQLocalizable.strings
  74. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/fr.lproj/IQLocalizable.strings
  75. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/he.lproj/IQLocalizable.strings
  76. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/hr.lproj/IQLocalizable.strings
  77. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/hu.lproj/IQLocalizable.strings
  78. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/id.lproj/IQLocalizable.strings
  79. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/it.lproj/IQLocalizable.strings
  80. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/ja.lproj/IQLocalizable.strings
  81. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/ko.lproj/IQLocalizable.strings
  82. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/ms.lproj/IQLocalizable.strings
  83. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/nb.lproj/IQLocalizable.strings
  84. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/nl.lproj/IQLocalizable.strings
  85. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/pl.lproj/IQLocalizable.strings
  86. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/pt-PT.lproj/IQLocalizable.strings
  87. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/pt.lproj/IQLocalizable.strings
  88. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/ru.lproj/IQLocalizable.strings
  89. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/sk.lproj/IQLocalizable.strings
  90. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/sv.lproj/IQLocalizable.strings
  91. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/th.lproj/IQLocalizable.strings
  92. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/tr.lproj/IQLocalizable.strings
  93. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/zh-Hans.lproj/IQLocalizable.strings
  94. BIN
      Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/zh-Hant.lproj/IQLocalizable.strings
  95. 0 3659
      FreeAPS.xcodeproj/project.pbxproj
  96. 0 399
      FreeAPS.xcodeproj/xcshareddata/xcschemes/Trio.xcscheme
  97. 0 93
      FreeAPS.xcodeproj/xcshareddata/xcschemes/Trio_WatchApp.xcscheme
  98. 0 38
      FreeAPS/Resources/Assets.xcassets/Colors/Basal.colorset/Contents.json
  99. 0 38
      FreeAPS/Resources/Assets.xcassets/Colors/DarkerBlue.colorset/Contents.json
  100. 0 0
      FreeAPS/Resources/Assets.xcassets/Colors/Insulin.colorset/Contents.json

+ 3 - 0
.github/FUNDING.yml

@@ -0,0 +1,3 @@
+# These are supported funding model platforms
+
+custom: ["https://www.nightscoutfoundation.org/donate"]

+ 1 - 1
.github/ISSUE_TEMPLATE/config.yml

@@ -1,5 +1,5 @@
 blank_issues_enabled: false
 contact_links:
   - name: "🆘 Individual troubleshooting help: Please go to the Discord Trio Server"
-    url: https://discord.com/invite/FnwFEFUwXE
+    url: https://discord.triodocs.org
     about: Are you having an issue with your individual setup? Please first go to the Discord Trio Server and post there, with details of your setup (App version, pump, CGM, and CGM app) and the issue you are observing

+ 5 - 5
.github/workflows/add_identifiers.yml

@@ -8,16 +8,16 @@ jobs:
     name: Validate
     uses: ./.github/workflows/validate_secrets.yml
     secrets: inherit
-  
+
   identifiers:
     name: Add Identifiers
     needs: validate
-    runs-on: macos-15
+    runs-on: macos-26
     steps:
       # Checks-out the repo
       - name: Checkout Repo
-        uses: actions/checkout@v4
-      
+        uses: actions/checkout@v5
+
       # Patch Fastlane Match to not print tables
       - name: Patch Match Tables
         run: |
@@ -36,7 +36,7 @@ jobs:
       # Sync the GitHub runner clock with the Windows time server (workaround as suggested in https://github.com/actions/runner/issues/2996)
       - name: Sync clock
         run: sudo sntp -sS time.windows.com
-      
+
       # Create or update identifiers for app
       - name: Fastlane Provision
         run: bundle exec fastlane identifiers

+ 1 - 1
.github/workflows/add_to_project.yml

@@ -1,4 +1,4 @@
-name: 8. DONT RUN Add bugs to bugs project
+name: zzz [DO NOT RUN] Add Bugs to Project 'Bugs'
 
 on:
   issues:

+ 106 - 0
.github/workflows/auto_version_dev.yml

@@ -0,0 +1,106 @@
+# -----------------------------------------------------------------------------
+# Workflow: `auto_version_dev.yml`
+#
+# Description:
+# This GitHub Actions workflow automatically manages and increments the
+# `APP_DEV_VERSION` defined in `Config.xcconfig` on every push to `dev` branch.
+# This version is used for internal tracking and diagnostics (e.g. in
+# Crashlytics) and follows a 4-digit semantic versioning format:
+# `MAJOR.MINOR.PATCH.FEATURE`.
+#
+# Versioning Logic:
+# - Reads the base version from `APP_VERSION = x.y.z`
+# - Reads the last internal dev version from `APP_DEV_VERSION`
+#
+# Behavior:
+# - If `APP_DEV_VERSION` matches `APP_VERSION` (e.g. both are `0.5.0`),
+#   it assumes the first dev push after a release and sets `APP_DEV_VERSION`
+#   to `APP_VERSION.1` (e.g. `0.5.0.1`)
+# - If `APP_DEV_VERSION` is already in 4-digit form (e.g. `0.5.0.3`),
+#   it increments the fourth digit (e.g. → `0.5.0.4`)
+#
+# Example Progression:
+# - Release sets `APP_VERSION = 0.5.0`, `APP_DEV_VERSION = 0.5.0`
+# - First push to `dev`:      → `APP_DEV_VERSION = 0.5.0.1`
+# - Second push to `dev`:     → `APP_DEV_VERSION = 0.5.0.2`
+# - ...
+#
+# Commit Handling:
+# The updated value is committed and pushed back to the `dev` branch.
+# - The bump commit includes the `[skip ci]` tag in its message
+# - This prevents the workflow from re-triggering itself in a loop
+# 
+#
+# Prerequisites:
+# - `APP_VERSION` must be present in `Config.xcconfig` in the form `x.y.z`
+# - `APP_DEV_VERSION` must either match `APP_VERSION` or be `x.y.z.w`
+# - GitHub Actions must have write permission to push to `dev`
+# - This workflow only runs when the repository owner is `nightscout`
+# -----------------------------------------------------------------------------
+
+name: zzz [DO NOT RUN] Bump APP_DEV_VERSION on dev push
+
+on:
+  push:
+    branches:
+      - dev
+
+jobs:
+  bump-dev-version:
+    if: github.repository_owner == 'nightscout'
+    runs-on: ubuntu-latest
+
+    steps:
+      - name: Checkout repo
+        uses: actions/checkout@v5
+        with:
+         token: ${{ secrets.TRIO_TOKEN_AUTOBUMP }}
+
+      - name: Set up Git
+        run: |
+          git config --global user.name "github-actions[bot]"
+          git config --global user.email "github-actions[bot]@users.noreply.github.com"
+
+      - name: Bump APP_DEV_VERSION
+        run: |
+          FILE=Config.xcconfig
+
+          # Read current APP_VERSION
+          BASE_VERSION=$(grep '^APP_VERSION' "$FILE" | cut -d '=' -f2 | xargs)
+
+          # Read existing APP_DEV_VERSION, if any
+          DEV_LINE=$(grep '^APP_DEV_VERSION' "$FILE" || echo "")
+          if [ -z "$DEV_LINE" ]; then
+            CURRENT_DEV_VERSION="$BASE_VERSION"
+          else
+            CURRENT_DEV_VERSION=$(echo "$DEV_LINE" | cut -d '=' -f2 | xargs)
+          fi
+
+          echo "APP_VERSION       = $BASE_VERSION"
+          echo "APP_DEV_VERSION   = $CURRENT_DEV_VERSION"
+
+          # Decide next dev version
+          if [ "$CURRENT_DEV_VERSION" = "$BASE_VERSION" ]; then
+            # First post-release commit to dev → bump to .1
+            NEW_DEV_VERSION="${BASE_VERSION}.1"
+            if [ -z "$DEV_LINE" ]; then
+              echo "APP_DEV_VERSION = $NEW_DEV_VERSION" >> "$FILE"
+            else
+              sed -i -E "s|^APP_DEV_VERSION *= *.*|APP_DEV_VERSION = $NEW_DEV_VERSION|" "$FILE"
+            fi
+          else
+            # Already in .X form → bump last digit
+            IFS='.' read -r MAJOR MINOR PATCH FEATURE <<< "$CURRENT_DEV_VERSION"
+            FEATURE=$((FEATURE + 1))
+            NEW_DEV_VERSION="$MAJOR.$MINOR.$PATCH.$FEATURE"
+            sed -i -E "s|^APP_DEV_VERSION *= *.*|APP_DEV_VERSION = $NEW_DEV_VERSION|" "$FILE"
+          fi
+
+          echo "NEW APP_DEV_VERSION = $NEW_DEV_VERSION"
+          echo "NEW_DEV_VERSION=$NEW_DEV_VERSION" >> $GITHUB_ENV
+
+      - name: Commit and push updated dev version
+        run: |
+          git add Config.xcconfig
+          git commit -m "CI: Bump APP_DEV_VERSION to $NEW_DEV_VERSION [skip ci]"
+          git push

+ 111 - 196
.github/workflows/build_trio.yml

@@ -2,161 +2,107 @@ name: 4. Build Trio
 run-name: Build Trio (${{ github.ref_name }})
 on:
   workflow_dispatch:
-
-  ## Remove the "#" sign from the beginning of the line below to get automated builds on push (code changes in your repository)
-  #push:
-
   schedule:
-    - cron: "0 8 * * 3" # Checks for updates at 08:00 UTC every Wednesday
-    - cron: "0 6 1 * *" # Builds the app on the 1st of every month at 06:00 UTC
+    # Check for updates every Sunday
+    #   Later logic builds if there are updates or if it is the 2nd Sunday of the month
+    - cron: "43 6 * * 0" # Sunday at UTC 06:43
 
-env:  
+env:
+  GH_PAT: ${{ secrets.GH_PAT }}
   UPSTREAM_REPO: nightscout/Trio
   UPSTREAM_BRANCH: ${{ github.ref_name }} # branch on upstream repository to sync from (replace with specific branch name if needed)
-  TARGET_BRANCH: ${{ github.ref_name }} # target branch on fork to be kept in sync, and target branch on upstream to be kept alive (replace with specific branch name if needed)
-  ALIVE_BRANCH_MAIN: alive-main
-  ALIVE_BRANCH_DEV: alive-dev
+  TARGET_BRANCH: ${{ github.ref_name }} # target branch on fork to be kept in sync
 
 jobs:
-  # Checks if Distribution certificate is present and valid, optionally nukes and
-  # creates new certs if the repository variable ENABLE_NUKE_CERTS == 'true'
-  check_certs: 
-      name: Check certificates
-      uses: ./.github/workflows/create_certs.yml
-      secrets: inherit
-
-  # Checks if GH_PAT holds workflow permissions
-  # Checks for existence of alive branch; if non-existent creates it
-  check_alive_and_permissions:
-    needs: check_certs
+  # use a single runner for these sequential steps
+  check_status:
     runs-on: ubuntu-latest
-    name: Check alive branch and permissions
+    name: Check status to decide whether to build
     permissions:
       contents: write
     outputs:
-      WORKFLOW_PERMISSION: ${{ steps.workflow-permission.outputs.has_permission }}
+      NEW_COMMITS: ${{ steps.sync.outputs.has_new_commits }}
+      IS_SECOND_IN_MONTH: ${{ steps.date-check.outputs.is_second_instance }}
 
+    # Check GH_PAT, sync repository, check day in month
     steps:
-      - name: Check for workflow permissions
-        id: workflow-permission
-        env:
-          TOKEN_TO_CHECK: ${{ secrets.GH_PAT }}
-        run: |
-          PERMISSIONS=$(curl -sS -f -I -H "Authorization: token ${{ env.TOKEN_TO_CHECK }}" https://api.github.com | grep ^x-oauth-scopes: | cut -d' ' -f2-);
-
-          if [[ $PERMISSIONS =~ "workflow" || $PERMISSIONS == "" ]]; then
-            echo "GH_PAT holds workflow permissions or is fine-grained PAT."
-            echo "has_permission=true" >> $GITHUB_OUTPUT # Set WORKFLOW_PERMISSION to false.
-          else 
-            echo "GH_PAT lacks workflow permissions."
-            echo "Automated build features will be skipped!"
-            echo "has_permission=false" >> $GITHUB_OUTPUT # Set WORKFLOW_PERMISSION to false.
-          fi
 
-      - name: Check for alive branches
-        if: steps.workflow-permission.outputs.has_permission == 'true'
-        id: check-alive
-        env:
-          GITHUB_TOKEN: ${{ secrets.GH_PAT }}
+      - name: Access
+        id: workflow-permission
         run: |
-          branch_list=$(gh api -H "Accept: application/vnd.github+json" /repos/${{ github.repository_owner }}/Trio/branches | jq -r '.[].name')
-      
-          if echo "$branch_list" | grep -q '^alive-main$'; then
-            echo "alive-main exists"
-            echo "ALIVE_MAIN_EXISTS=true" >> $GITHUB_ENV
+          # Validate Access Token
+          
+          # Ensure that gh exit codes are handled when output is piped.
+          set -o pipefail
+          
+          # Define patterns to validate the access token (GH_PAT) and distinguish between classic and fine-grained tokens.
+          GH_PAT_CLASSIC_PATTERN='^ghp_[a-zA-Z0-9]{36}$'
+          GH_PAT_FINE_GRAINED_PATTERN='^github_pat_[a-zA-Z0-9]{22}_[a-zA-Z0-9]{59}$'
+          
+          # Validate Access Token (GH_PAT)
+          if [ -z "$GH_PAT" ]; then
+            failed=true
+            echo "::error::The GH_PAT secret is unset or empty. Set it and try again."
           else
-            echo "alive-main missing"
-            echo "ALIVE_MAIN_EXISTS=false" >> $GITHUB_ENV
+            if [[ $GH_PAT =~ $GH_PAT_CLASSIC_PATTERN ]]; then
+              provides_scopes=true
+              echo "The GH_PAT secret is a structurally valid classic token."
+            elif [[ $GH_PAT =~ $GH_PAT_FINE_GRAINED_PATTERN ]]; then
+              echo "The GH_PAT secret is a structurally valid fine-grained token."
+            else
+              unknown_format=true
+              echo "The GH_PAT secret does not have a known token format."
+            fi
+            
+            # Attempt to capture the x-oauth-scopes scopes of the token.
+            if ! scopes=$(curl -sS -f -I -H "Authorization: token $GH_PAT" https://api.github.com | { grep -i '^x-oauth-scopes:' || true; } | cut -d ' ' -f2- | tr -d '\r'); then
+              failed=true
+              if [ $unknown_format ]; then
+                echo "::error::Unable to connect to GitHub using the GH_PAT secret. Verify that it is set correctly (including the 'ghp_' or 'github_pat_' prefix) and try again."
+              else
+                echo "::error::Unable to connect to GitHub using the GH_PAT secret. Verify that the token exists and has not expired at https://github.com/settings/tokens. If necessary, regenerate or create a new token (and update the secret), then try again."
+              fi
+            elif [[ $scopes =~ workflow ]]; then
+              echo "The GH_PAT secret has repo and workflow permissions."
+              echo "has_permission=true" >> $GITHUB_OUTPUT
+            elif [[ $scopes =~ repo ]]; then
+              echo "The GH_PAT secret has repo (but not workflow) permissions."
+            elif [ $provides_scopes ]; then
+              failed=true
+              if [ -z "$scopes" ]; then
+                echo "The GH_PAT secret is valid and can be used to connect to GitHub, but it does not provide any permission scopes."
+              else
+                echo "The GH_PAT secret is valid and can be used to connect to GitHub, but it only provides the following permission scopes: $scopes"
+              fi
+              echo "::error::The GH_PAT secret is lacking at least the 'repo' permission scope required to access the Match-Secrets repository. Update the token permissions at https://github.com/settings/tokens (to include the 'repo' and 'workflow' scopes) and try again."
+            else
+              echo "The GH_PAT secret is valid and can be used to connect to GitHub, but it does not provide inspectable scopes. Assuming that the 'repo' and 'workflow' permission scopes required to access the Match-Secrets repository and perform automations are present."
+              echo "has_permission=true" >> $GITHUB_OUTPUT
+            fi
           fi
-      
-          if echo "$branch_list" | grep -q '^alive-dev$'; then
-            echo "alive-dev exists"
-            echo "ALIVE_DEV_EXISTS=true" >> $GITHUB_ENV
-          else
-            echo "alive-dev missing"
-            echo "ALIVE_DEV_EXISTS=false" >> $GITHUB_ENV
-          fi
-
-      - name: Create alive-main branch if missing
-        if: env.ALIVE_MAIN_EXISTS == 'false'
-        env:
-          GITHUB_TOKEN: ${{ secrets.GH_PAT }}
-        run: |
-          SHA_MAIN=$(curl -sS -H "Authorization: token $GITHUB_TOKEN" https://api.github.com/repos/${{ env.UPSTREAM_REPO }}/git/refs/heads/main | jq -r '.object.sha')
-      
-          echo "Creating alive-main from upstream main"
-          gh api \
-            --method POST \
-            -H "Authorization: token $GITHUB_TOKEN" \
-            -H "Accept: application/vnd.github.v3+json" \
-            /repos/${{ github.repository_owner }}/Trio/git/refs \
-            -f ref='refs/heads/alive-main' \
-            -f sha=$SHA_MAIN
-
-      - name: Create alive-dev branch if missing
-        if: env.ALIVE_DEV_EXISTS == 'false'
-        env:
-          GITHUB_TOKEN: ${{ secrets.GH_PAT }}
-        run: |
-          SHA_DEV=$(curl -sS -H "Authorization: token $GITHUB_TOKEN" https://api.github.com/repos/${{ env.UPSTREAM_REPO }}/git/refs/heads/dev | jq -r '.object.sha')
-      
-          echo "Creating alive-dev from upstream dev"
-          gh api \
-            --method POST \
-            -H "Authorization: token $GITHUB_TOKEN" \
-            -H "Accept: application/vnd.github.v3+json" \
-            /repos/${{ github.repository_owner }}/Trio/git/refs \
-            -f ref='refs/heads/alive-dev' \
-            -f sha=$SHA_DEV
-
-                  
-  # Checks for changes in upstream repository; if changes exist prompts sync for build
-  # Performs keepalive to avoid stale fork
-  check_latest_from_upstream:
-    needs: [check_certs, check_alive_and_permissions]
-    runs-on: ubuntu-latest
-    name: Check upstream and keep alive
-    outputs:
-      NEW_COMMITS: ${{ steps.sync.outputs.has_new_commits }}
-      ABORT_SYNC: ${{ steps.check_branch.outputs.ABORT_SYNC }}
-
-    steps:
-      - name: Check if running on main or dev branch
-        if: |
-          needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
-          (vars.SCHEDULED_BUILD != 'false' || vars.SCHEDULED_SYNC != 'false')
-        id: check_branch
-        run: |
-          if [ "${GITHUB_REF##*/}" = "main" ]; then
-            echo "Running on main branch"
-            echo "ALIVE_BRANCH=${ALIVE_BRANCH_MAIN}" >> $GITHUB_OUTPUT
-            echo "ABORT_SYNC=false" >> $GITHUB_OUTPUT
-          elif [ "${GITHUB_REF##*/}" = "dev" ]; then
-            echo "Running on dev branch"
-            echo "ALIVE_BRANCH=${ALIVE_BRANCH_DEV}" >> $GITHUB_OUTPUT
-            echo "ABORT_SYNC=false" >> $GITHUB_OUTPUT
-          else
-            echo "Not running on main or dev branch"
-            echo "ABORT_SYNC=true" >> $GITHUB_OUTPUT
+          
+          # Exit unsuccessfully if secret validation failed.
+          if [ $failed ]; then
+            exit 2
           fi
 
       - name: Checkout target repo
         if: |
-          needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
+          steps.workflow-permission.outputs.has_permission == 'true' &&
           (vars.SCHEDULED_BUILD != 'false' || vars.SCHEDULED_SYNC != 'false')
-        uses: actions/checkout@v4
+        uses: actions/checkout@v5
         with:
           token: ${{ secrets.GH_PAT }}
-          ref: ${{ steps.check_branch.outputs.ALIVE_BRANCH }}
 
+      # This syncs any target branch to upstream branch of the same name
       - name: Sync upstream changes
         if: | # do not run the upstream sync action on the upstream repository
-          needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
-          vars.SCHEDULED_SYNC != 'false' && github.repository_owner != 'nightscout' && steps.check_branch.outputs.ABORT_SYNC == 'false'
+          steps.workflow-permission.outputs.has_permission == 'true' &&
+          vars.SCHEDULED_SYNC != 'false' && github.repository_owner != 'nightscout'
         id: sync
-        uses: aormsby/Fork-Sync-With-Upstream-action@v3.4.1
+        uses: aormsby/Fork-Sync-With-Upstream-action@v3.4.2
         with:
-          target_sync_branch: ${{ steps.check_branch.outputs.ALIVE_BRANCH }}
+          target_sync_branch: ${{ env.TARGET_BRANCH }}
           shallow_since: 6 months ago
           target_repo_token: ${{ secrets.GH_PAT }}
           upstream_sync_branch: ${{ env.UPSTREAM_BRANCH }}
@@ -165,105 +111,74 @@ jobs:
       # Display a sample message based on the sync output var 'has_new_commits'
       - name: New commits found
         if: |
-          needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
+          steps.workflow-permission.outputs.has_permission == 'true' &&
           vars.SCHEDULED_SYNC != 'false' && steps.sync.outputs.has_new_commits == 'true'
         run: echo "New commits were found to sync."
 
       - name: No new commits
         if: |
-          needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' && 
+          steps.workflow-permission.outputs.has_permission == 'true' &&
           vars.SCHEDULED_SYNC != 'false' && steps.sync.outputs.has_new_commits == 'false'
         run: echo "There were no new commits."
 
       - name: Show value of 'has_new_commits'
-        if: needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' && vars.SCHEDULED_SYNC != 'false' && steps.check_branch.outputs.ABORT_SYNC == 'false'
+        if: steps.workflow-permission.outputs.has_permission == 'true' && vars.SCHEDULED_SYNC != 'false'
         run: |
           echo ${{ steps.sync.outputs.has_new_commits }}
           echo "NEW_COMMITS=${{ steps.sync.outputs.has_new_commits }}" >> $GITHUB_OUTPUT
 
-      # Keep repository "alive": add empty commits to ALIVE_BRANCH after "time_elapsed" days of inactivity to avoid inactivation of scheduled workflows
-      - name: Keep alive
-        run: |
-          echo "Keep Alive temporarily removed while gautamkrishnar/keepalive-workflow is not available"
-      #  if: |
-      #    needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
-      #    (vars.SCHEDULED_BUILD != 'false' || vars.SCHEDULED_SYNC != 'false')
-      #  uses: gautamkrishnar/keepalive-workflow@v1 # using the workflow with default settings
-      #  with:
-      #    time_elapsed: 20 # Time elapsed from the previous commit to trigger a new automated commit (in days)
-
       - name: Show scheduled build configuration message
-        if: needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION != 'true'
+        if: steps.workflow-permission.outputs.has_permission != 'true'
         run: |
           echo "### :calendar: Scheduled Sync and Build Disabled :mobile_phone_off:" >> $GITHUB_STEP_SUMMARY
           echo "You have not yet configured the scheduled sync and build for Trio's browser build." >> $GITHUB_STEP_SUMMARY
           echo "Synchronizing your fork of <code>Trio</code> with the upstream repository <code>nightscout/Trio</code> will be skipped." >> $GITHUB_STEP_SUMMARY
           echo "If you want to enable automatic builds and updates for your Trio, please follow the instructions \
               under the following path <code>Trio/fastlane/testflight.md</code>." >> $GITHUB_STEP_SUMMARY
-  
+
+      # Set a logic flag if this is the second instance of this day-of-week in this month
+      - name: Check if this is the second time this day-of-week happens this month
+        id: date-check
+        run: |
+          DAY_OF_MONTH=$(date +%-d)
+          WEEK_OF_MONTH=$(( ($(date +%-d) - 1) / 7 + 1 ))
+          if [[ $WEEK_OF_MONTH -eq 2 ]]; then
+            echo "is_second_instance=true" >> "$GITHUB_OUTPUT"
+          else
+            echo "is_second_instance=false" >> "$GITHUB_OUTPUT"
+          fi
+
+  # Checks if Distribution certificate is present and valid, optionally nukes and
+  # creates new certs if the repository variable ENABLE_NUKE_CERTS == 'true'
+  # only run if a build is planned
+  check_certs:
+      needs: [check_status]
+      name: Check certificates
+      uses: ./.github/workflows/create_certs.yml
+      secrets: inherit
+      if: |
+        github.event_name == 'workflow_dispatch' ||
+          (vars.SCHEDULED_BUILD != 'false' && needs.check_status.outputs.IS_SECOND_IN_MONTH == 'true') ||
+          (vars.SCHEDULED_SYNC != 'false' && needs.check_status.outputs.NEW_COMMITS == 'true' )
+
   # Builds Trio
   build:
     name: Build
-    needs: [check_certs, check_alive_and_permissions, check_latest_from_upstream]
-    runs-on: macos-15
+    needs: [check_certs, check_status]
+    runs-on: macos-26
     permissions:
       contents: write
     if:
-      | # runs if started manually, or if sync schedule is set and enabled and scheduled on the first Saturday each month, or if sync schedule is set and enabled and new commits were found
+      | # builds with manual start; if scheduled: once a month or when new commits are found
       github.event_name == 'workflow_dispatch' ||
-      (needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
-        (vars.SCHEDULED_BUILD != 'false' && github.event.schedule == '0 6 1 * *') ||
-        (vars.SCHEDULED_SYNC != 'false' && needs.check_latest_from_upstream.outputs.NEW_COMMITS == 'true' )
-      )
+        (vars.SCHEDULED_BUILD != 'false' && needs.check_status.outputs.IS_SECOND_IN_MONTH == 'true') ||
+        (vars.SCHEDULED_SYNC != 'false' && needs.check_status.outputs.NEW_COMMITS == 'true' )
     steps:
       - name: Select Xcode version
-        run: "sudo xcode-select --switch /Applications/Xcode_16.3.app/Contents/Developer"
+        run: "sudo xcode-select --switch /Applications/Xcode_26.2.app/Contents/Developer"
       
-      - name: Checkout Repo for syncing
-        if: |
-          needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
-          vars.SCHEDULED_SYNC != 'false'
-        uses: actions/checkout@v4
-        with:
-          token: ${{ secrets.GH_PAT }}
-          ref: ${{ env.TARGET_BRANCH }}
-
-      - name: Sync upstream changes
-        if: | # do not run the upstream sync action on the upstream repository
-          needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
-          vars.SCHEDULED_SYNC != 'false' && github.repository_owner != 'nightscout' && needs.check_latest_from_upstream.outputs.ABORT_SYNC == 'false'
-        id: sync
-        uses: aormsby/Fork-Sync-With-Upstream-action@v3.4.1
-        with:
-          target_sync_branch: ${{ env.TARGET_BRANCH }}
-          shallow_since: 6 months ago
-          target_repo_token: ${{ secrets.GH_PAT }}
-          upstream_sync_branch: ${{ env.UPSTREAM_BRANCH }}
-          upstream_sync_repo: ${{ env.UPSTREAM_REPO }}
-
-      # Display a sample message based on the sync output var 'has_new_commits'
-      - name: New commits found
-        if: |
-          needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' &&
-          vars.SCHEDULED_SYNC != 'false' && steps.sync.outputs.has_new_commits == 'true' && needs.check_latest_from_upstream.outputs.ABORT_SYNC == 'false'
-        run: echo "New commits were found to sync."
-
-      - name: No new commits
-        if: |
-          needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true' && 
-          vars.SCHEDULED_SYNC != 'false' && steps.sync.outputs.has_new_commits == 'false' && needs.check_latest_from_upstream.outputs.ABORT_SYNC == 'false'
-        run: echo "There were no new commits."
-
-      - name: Show value of 'has_new_commits'
-        if: |
-          needs.check_alive_and_permissions.outputs.WORKFLOW_PERMISSION == 'true'
-          && vars.SCHEDULED_SYNC != 'false' && needs.check_latest_from_upstream.outputs.ABORT_SYNC == 'false'
-        run: |
-          echo ${{ steps.sync.outputs.has_new_commits }}
-          echo "NEW_COMMITS=${{ steps.sync.outputs.has_new_commits }}" >> $GITHUB_OUTPUT
-
       - name: Checkout Repo for building
-        uses: actions/checkout@v4
+        uses: actions/checkout@v5
         with:
           token: ${{ secrets.GH_PAT }}
           submodules: recursive
@@ -343,7 +258,7 @@ jobs:
       # Upload Build artifacts
       - name: Upload build log, IPA and Symbol artifacts
         if: always()
-        uses: actions/upload-artifact@v4
+        uses: actions/upload-artifact@v6
         with:
           name: build-artifacts
           path: |

+ 6 - 6
.github/workflows/create_certs.yml

@@ -21,15 +21,15 @@ jobs:
   create_certs:
     name: Certificates
     needs: validate
-    runs-on: macos-15
+    runs-on: macos-26
     outputs:
       new_certificate_needed: ${{ steps.set_output.outputs.new_certificate_needed }}
 
     steps:
       # Checks-out the repo
       - name: Checkout Repo
-        uses: actions/checkout@v4
-      
+        uses: actions/checkout@v5
+
       # Patch Fastlane Match to not print tables
       - name: Patch Match Tables
         run: |
@@ -60,7 +60,7 @@ jobs:
         run: |
           CERT_STATUS_FILE="${{ github.workspace }}/fastlane/new_certificate_needed.txt"
           ENABLE_NUKE_CERTS=${{ vars.ENABLE_NUKE_CERTS }}
-          
+
           if [ -f "$CERT_STATUS_FILE" ]; then
             CERT_STATUS=$(cat "$CERT_STATUS_FILE" | tr -d '\n' | tr -d '\r') # Read file content and strip newlines
             echo "new_certificate_needed: $CERT_STATUS"
@@ -90,14 +90,14 @@ jobs:
   nuke_certs:
       name: Nuke certificates
       needs: [validate, create_certs]
-      runs-on: macos-15
+      runs-on: macos-26
       if: ${{ (needs.create_certs.outputs.new_certificate_needed == 'true' && vars.ENABLE_NUKE_CERTS == 'true') || vars.FORCE_NUKE_CERTS == 'true' }}
       steps:
         - name: Output from step id 'check_certs'
           run: echo "new_certificate_needed=${{ needs.create_certs.outputs.new_certificate_needed }}"
 
         - name: Checkout repository
-          uses: actions/checkout@v4
+          uses: actions/checkout@v5
 
         - name: Install dependencies
           run: bundle install

+ 3 - 3
.github/workflows/stale_issues.yml

@@ -1,4 +1,4 @@
-name: 8. DONT RUN close inactive issues
+name: zzz [DO NOT RUN] Close Inactive Issues
 on:
   schedule:
     - cron: "30 1 * * *"
@@ -11,7 +11,7 @@ jobs:
       pull-requests: write
     if: github.repository_owner == 'nightscout'
     steps:
-      - uses: actions/stale@v9.0.0
+      - uses: actions/stale@v10
         with:
           days-before-issue-stale: 30
           days-before-issue-close: 14
@@ -32,7 +32,7 @@ jobs:
       pull-requests: write
     if: github.repository_owner == 'nightscout'
     steps:
-      - uses: actions/stale@v9.0.0
+      - uses: actions/stale@v10
         with:
           days-before-issue-stale: 30
           days-before-issue-close: 30

+ 135 - 0
.github/workflows/unit_tests.yml

@@ -0,0 +1,135 @@
+name: zzz [DO NOT RUN] Automated unit tests
+
+on:
+  pull_request:
+    branches:
+      - dev
+    types: [opened, synchronize]
+    paths-ignore:
+      - '**.md'
+      - '**/README'
+      - '**.yml'
+      - '**.txt'
+
+  push:
+    branches:
+      - dev
+    paths-ignore:
+      - '**.md'
+      - '**/README'
+      - '**.yml'
+      - '**.txt'
+
+jobs:
+  test:
+    name: Run Unit Tests
+    runs-on: macos-26
+    if: github.repository_owner == 'nightscout'
+
+    steps:
+      - name: Select Xcode version
+        run: sudo xcode-select -s /Applications/Xcode_26.2.app/Contents/Developer
+
+      - name: Checkout code
+        uses: actions/checkout@v5
+        with:
+          fetch-depth: 1
+          submodules: recursive
+
+      - name: Restore cache
+        id: cache-restore
+        uses: actions/cache/restore@v5
+        with:
+          path: |
+            /Users/runner/Library/Developer/Xcode/DerivedData
+            .build
+          key: ${{ runner.os }}-trio-${{ hashFiles('**/*.swift', '**/*.xcodeproj', '**/*.xcworkspace') }}
+          restore-keys: |
+            ${{ runner.os }}-trio-
+
+      - name: Show cache contents before build
+        run: |
+          echo "📂 Contents of DerivedData:"
+          ls -lah /Users/runner/Library/Developer/Xcode/DerivedData || echo "Directory not found"
+          echo ""
+          echo "📂 Contents of .build:"
+          ls -lah .build || echo ".build directory not found"
+
+      - name: List available simulators
+        run: xcrun simctl list devices available
+
+      - name: Build for testing
+        run: |
+          set -o pipefail && \
+          time xcodebuild build-for-testing \
+            -workspace Trio.xcworkspace \
+            -scheme "Trio Tests" \
+            -destination 'platform=iOS Simulator,name=iPhone 17,OS=26.2' \
+
+      - name: Check for uncommitted changes
+        run: |
+          CHANGES=$(git status --porcelain)
+          if [ -n "$CHANGES" ]; then
+            echo "Uncommitted changes detected:"
+            echo "$CHANGES"
+            echo "$CHANGES" | while read -r line; do
+              FILE=$(echo $line | cut -c4-)
+              echo "::warning file=$FILE::Uncommitted change detected"
+            done
+            exit 0
+          else
+            echo "No uncommitted changes detected."
+          fi
+        shell: bash
+
+      - name: Show cache contents after build
+        run: |
+          echo "📂 Updated DerivedData contents:"
+          du -sh /Users/runner/Library/Developer/Xcode/DerivedData || echo "Directory not found"
+          ls -lah /Users/runner/Library/Developer/Xcode/DerivedData || echo "Directory not found"
+          echo ""
+          echo "📂 Updated .build contents:"
+          du -sh .build || echo ".build directory not found"
+          ls -lah .build || echo ".build directory not found"
+          
+      - name: Save cache
+        if: steps.cache-restore.outputs.cache-hit != 'true'
+        uses: actions/cache/save@v5
+        with:
+          path: |
+            /Users/runner/Library/Developer/Xcode/DerivedData
+            .build
+          key: ${{ runner.os }}-trio-${{ hashFiles('**/*.swift', '**/*.xcodeproj', '**/*.xcworkspace') }}  
+
+      - name: Run tests
+        run: |
+          set -o pipefail
+          time xcodebuild test-without-building \
+            -workspace Trio.xcworkspace \
+            -scheme "Trio Tests" \
+            -destination 'platform=iOS Simulator,name=iPhone 17,OS=26.2' \
+            $([ "$ENABLE_PARALLEL_TESTING" = "true" ] && echo "-parallel-testing-enabled YES") \
+            2>&1 | tee xcodebuild.log
+
+      - name: Annotate test results
+        if: always()
+        run: |
+          if [ -f xcodebuild.log ]; then
+            if grep -q "Failing tests:" xcodebuild.log; then
+              echo "::error title=Unit Tests Failed::Some tests failed"
+              echo "## ❌ Some tests failed:" >> $GITHUB_STEP_SUMMARY
+              grep -A 20 "Failing tests:" xcodebuild.log | \
+                grep -E '^\s+[A-Za-z0-9]+\..+\(\)' | \
+                sed 's/^/  - /' >> $GITHUB_STEP_SUMMARY
+              echo "::group::Failed Test List"
+              grep -A 20 "Failing tests:" xcodebuild.log | \
+                grep -E '^\s+[A-Za-z0-9]+\..+\(\)' | \
+                sed 's/^/  - /'
+              echo "::endgroup::"
+            else
+              echo "::notice title=Unit Tests Passed::✅ All tests passed"
+              echo "✅ All tests passed" >> $GITHUB_STEP_SUMMARY
+            fi
+          else
+            echo "::warning::Test log (xcodebuild.log) not found"
+          fi

+ 6 - 13
.github/workflows/validate_secrets.yml

@@ -5,7 +5,7 @@ on: [workflow_call, workflow_dispatch]
 jobs:
   validate-access-token:
     name: Access
-    runs-on: macos-15
+    runs-on: ubuntu-latest
     env:
       GH_PAT: ${{ secrets.GH_PAT }}
       GH_TOKEN: ${{ secrets.GH_PAT }}
@@ -71,13 +71,6 @@ jobs:
             exit 2
           fi
 
-  validate-match-secrets:
-    name: Match-Secrets
-    needs: validate-access-token
-    runs-on: macos-15
-    env:
-      GH_TOKEN: ${{ secrets.GH_PAT }}
-    steps:
       - name: Validate Match-Secrets
         run: |
           # Validate Match-Secrets
@@ -111,8 +104,8 @@ jobs:
 
   validate-fastlane-secrets:
     name: Fastlane
-    needs: [validate-access-token, validate-match-secrets]
-    runs-on: macos-15
+    needs: [validate-access-token]
+    runs-on: macos-26
     env:
       GH_PAT: ${{ secrets.GH_PAT }}
       GH_TOKEN: ${{ secrets.GH_PAT }}
@@ -123,7 +116,7 @@ jobs:
       TEAMID: ${{ secrets.TEAMID }}
     steps:
       - name: Checkout Repo
-        uses: actions/checkout@v4
+        uses: actions/checkout@v5
 
       - name: Install Project Dependencies
         run: bundle install
@@ -178,8 +171,8 @@ jobs:
           elif ! echo "$FASTLANE_KEY" | openssl pkcs8 -nocrypt >/dev/null; then
             failed=true
             echo "::error::The FASTLANE_KEY secret is set but invalid. Verify that you copied it correctly from the API Key file (*.p8) you downloaded and try again."
-          elif ! (bundle exec fastlane validate_secrets 2>&1 || true) | tee fastlane.log; then # ignore "fastlane validate_secrets" errors and continue on errors without annotating an exit code
-            if grep -q "bad decrypt" fastlane.log; then
+          elif ! bundle exec fastlane validate_secrets 2>&1 | tee fastlane.log; then
+            if grep -q "Couldn't decrypt the repo" fastlane.log; then
               failed=true
               echo "::error::Unable to decrypt the Match-Secrets repository using the MATCH_PASSWORD secret. Verify that it is set correctly and try again."
             elif grep -q -e "required agreement" -e "license agreement" fastlane.log; then

+ 1 - 1
.gitignore

@@ -79,4 +79,4 @@ fastlane/screenshots
 fastlane/test_output
 fastlane/FastlaneRunner
 
-ConfigOverride.xcconfig
+ConfigOverride.xcconfig

+ 6 - 10
.gitmodules

@@ -1,40 +1,36 @@
 [submodule "LoopKit"]
 	path = LoopKit
 	url = https://github.com/loopandlearn/LoopKit.git
-	branch = trio
 [submodule "CGMBLEKit"]
 	path = CGMBLEKit
 	url = https://github.com/loopandlearn/CGMBLEKit.git
-	branch = trio
 [submodule "dexcom-share-client-swift"]
 	path = dexcom-share-client-swift
 	url = https://github.com/loopandlearn/dexcom-share-client-swift.git
-	branch = trio
 [submodule "RileyLinkKit"]
 	path = RileyLinkKit
 	url = https://github.com/loopandlearn/RileyLinkKit
-	branch = trio
 [submodule "OmniBLE"]
 	path = OmniBLE
 	url = https://github.com/loopandlearn/OmniBLE.git
-	branch = trio
 [submodule "G7SensorKit"]
 	path = G7SensorKit
 	url = https://github.com/loopandlearn/G7SensorKit.git
-	branch = trio
 [submodule "OmniKit"]
 	path = OmniKit
 	url = https://github.com/loopandlearn/OmniKit.git
-	branch = trio
 [submodule "MinimedKit"]
 	path = MinimedKit
 	url = https://github.com/loopandlearn/MinimedKit.git
-	branch = trio
 [submodule "LibreTransmitter"]
 	path = LibreTransmitter
 	url = https://github.com/loopandlearn/LibreTransmitter.git
-	branch = trio
 [submodule "TidepoolService"]
 	path = TidepoolService
 	url = https://github.com/loopandlearn/TidepoolService.git
-	branch = trio
+[submodule "DanaKit"]
+	path = DanaKit
+	url = https://github.com/loopandlearn/DanaKit
+[submodule "MedtrumKit"]
+	path = MedtrumKit
+	url = https://github.com/loopandlearn/MedtrumKit

+ 1 - 1
CGMBLEKit

@@ -1 +1 @@
-Subproject commit b786e8b5531cb08c259103c472dcd6a6752728f8
+Subproject commit ba5d0b7daf83d282b587c8ff0e835162b8c75846

+ 1 - 1
CODE_OF_CONDUCT.md

@@ -59,7 +59,7 @@ representative at an online or offline event.
 ## Enforcement
 
 Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported to the Discord server admins. Please join our [Discord server](http://discord.diy-trio.org) to contact
+reported to the Discord server admins. Please join our [Discord server](http://discord.triodocs.org) to contact
 them directly for any enforcement issues. All complaints will be reviewed and
 investigated promptly and fairly.
 

+ 135 - 0
CONTRIBUTING.md

@@ -0,0 +1,135 @@
+# Contributing to Trio
+
+Thank you for your interest in contributing to Trio.
+
+Trio is a community effort, and contributions of all kinds are welcome. This document outlines some guidelines, good practices, and expectations for contributing to the project, with the goal of making collaboration and review as smooth as possible.
+
+Whether you are helping other users, improving documentation, translating the app, testing builds, reviewing code, or contributing new features and fixes, your work matters.
+
+## Ways to contribute
+
+There are many ways to support the Trio community:
+
+- **Help others** by answering questions and guiding users in support communities.
+- Improve the **documentation** by updating or expanding TrioDocs.
+- Improve the **app** by contributing code, fixes, features, or tests.
+- Help with **translation and localization** through Crowdin.
+- Support **testing and feedback** by validating changes and reporting issues clearly.
+
+### Pay it forward
+
+If Trio has helped you manage your diabetes successfully, consider paying it forward by helping others. Answering questions in [Discord](https://discord.triodocs.org) or [Facebook](https://facebook.triodocs.org) groups can make a real difference for someone getting started.
+
+### Translate
+
+Trio is translated into multiple languages to make it easier to understand and use around the world. Translation is managed through [Crowdin](https://crowdin.triodocs.org/) and does not require programming experience.
+
+If your preferred language is missing, or you would like to improve an existing translation, please sign up as a translator on [Crowdin](https://crowdin.com/project/trio).
+
+### Develop
+
+Do you work with Swift? UI/UX? Testing? API optimization? Data storage?
+
+Trio is a collaborative project, and contributions of all kinds are welcome. Whether you are writing code, improving the user experience, testing builds, helping with documentation, or contributing in other ways, your help matters.
+
+## General principles
+
+- Start small. Smaller, focused contributions are easier to review, test, and merge.
+- For larger changes or new features, open or reference an issue first so there is a clear place for discussion and progress tracking.
+- Reach out early if you are planning to work on something substantial, especially if it may overlap with work already in progress.
+- Keep discussions constructive, respectful, and focused on improving Trio for the community.
+- Remember that Trio is part of a wider open source AID ecosystem. Collaboration and maintainability matter just as much as shipping features.
+
+## Development guidelines
+
+### Coding conventions
+
+- Use Xcode and follow the existing formatting and style used throughout the codebase.
+- Keep indentation and formatting consistent in every file you change.
+- Format your code before committing.
+- Avoid unrelated formatting-only changes in files you are not otherwise modifying.
+- Prefer clear, readable code over clever or overly compact solutions.
+- Follow existing naming, file organization, and architectural patterns unless there is a good reason not to.
+
+### Strings and localization
+
+- Add new user-facing strings in the appropriate localization mechanism used by the app.
+- Provide English source strings only unless the contribution is specifically about translations.
+- Translation and localization for other languages should go through [Crowdin](https://crowdin.triodocs.org/).
+- Translations from shared pump managers, CGM managers and services are handled by the [Loop lokalise project](https://loopkit.github.io/loopdocs/faqs/app-translation/#code-translation).
+
+### Documentation
+
+- Update docstrings when your change affects setup, configuration, behavior, workflows, or troubleshooting.
+- Keep documentation changes clear and practical.
+- +1: Documentation contributions are just as valuable as code contributions.
+
+## Branches, commits, and pull requests
+
+### Getting started
+
+1. Fork the [Trio repository](https://github.com/nightscout/Trio) on GitHub.
+1. Create a separate branch for each feature or fix with an [appropriate name](#branch-names).
+1. Branch from the most recent appropriate development branch (typically `dev`).
+1. Commit your changes to your fork.
+1. When ready, open a pull request against the upstream repository (`nightscout/Trio`).
+
+### Before opening a pull request
+
+- Rebase or otherwise sync your branch with the latest target branch.
+- Make sure your change is focused and does not include unrelated edits.
+- Test your changes as thoroughly as you reasonably can.
+- Update relevant documentation when needed.
+- Double-check for debug code, commented-out code, accidental version changes, or temporary workarounds left behind.
+
+### Pull request guidance
+
+- Keep pull requests as small and focused as practical.
+- Use a clear title and description.
+- Explain **what** changed and **why**.
+- Link the relevant issue when applicable.
+- Mention any areas that need particular review attention.
+- Be open to feedback and follow-up changes during review.
+- Use AI tools, if at all, as a support for small, well-understood tasks rather than to generate large parts of a contribution
+- Do not submit AI-heavy or "vibe-coded" pull requests; we welcome thoughtful use of tooling, but contributions need to be intentionally designed.
+
+## Naming conventions
+
+### Branch names
+
+Use short, descriptive branch names that make the purpose of the change obvious. For example:
+
+- `fix/watchstate-sync`
+- `feature/onboarding-target-behavior`
+- `refactor/therapy-editor`
+
+### Pull request titles
+
+Use concise, descriptive pull request titles. Good titles usually start with the type of change, for example:
+
+- `Fix watch state sync timing issue`
+- `Add onboarding step for target behavior`
+- `Update build documentation`
+- `Refactor therapy editor validation`
+
+## Communication and coordination
+
+For new ideas, larger features, or work that may affect multiple parts of the app, **discuss it with the community first** — reach out to the contributor core on [Trio Discord](https://discord.triodocs.org/). This helps reduce duplicate work, avoid merge conflicts, and improve the final design.
+
+## Review expectations
+
+Please remember that Trio is maintained by contributors with limited time. Reviews may take time, and some pull requests may require iteration before they are ready to merge.
+
+To help keep reviews efficient:
+
+- Keep the scope narrow.
+- Explain your reasoning clearly.
+- Respond to review comments directly.
+- Avoid force-pushing large unexplained rewrites during active review unless necessary.
+- AI-assisted work is welcome for limited, well-understood tasks, but contributions should remain author-driven and must be code you fully understand, and can explain.
+
+We do not accept pull requests that are largely AI-generated or submitted without careful engineering judgment, testing, and alignment with Trio’s existing patterns.
+
+## Final note
+
+Trio exists because people choose to contribute their time, knowledge, and care to a shared effort. Thank you for helping improve the project and support the broader open source AID community.

+ 24 - 6
Config.xcconfig

@@ -1,11 +1,29 @@
+// Some of the items can be modified to match the user's preference
 APP_DISPLAY_NAME = Trio
-APP_VERSION = 0.2.9
-APP_BUILD_NUMBER = 1
-COPYRIGHT_NOTICE =
-DEVELOPER_TEAM = ##TEAM_ID##
-BUNDLE_IDENTIFIER = org.nightscout.$(DEVELOPMENT_TEAM).trio
 APP_ICON = trioBlack
 APP_URL_SCHEME = Trio
 
+// DEVELOPER_TEAM will be set to your Apple Developer ID - typically using ConfigOverride.xcconfig
+DEVELOPER_TEAM = ##TEAM_ID##
+
+// Typically this is not modified unless you want to create a separate (unique) app using your ID
+// It must include $(DEVELOPMENT_TEAM)
+// For example: myOwnApp.$(DEVELOPMENT_TEAM).trio
+BUNDLE_IDENTIFIER = org.nightscout.$(DEVELOPMENT_TEAM).trio
+
+// Danger zone - do not modify these unless you know what you are doing
+
+// The TRIO_APP_GROUP_ID should not be modified - it is required to have this exact format
+// to build with GitHub actions and to work with xDrip4iOS
+TRIO_APP_GROUP_ID = group.org.nightscout.$(DEVELOPMENT_TEAM).trio.trio-app-group
+
+// The developers set the version numbers, please leave them alone
+APP_VERSION = 0.7.0
+APP_DEV_VERSION = 0.7.0
+APP_BUILD_NUMBER = 1
+COPYRIGHT_NOTICE =
+
+// Optional overrides - these can be used to insert your TEAMID into the DEVELOPER_TEAM field
 #include? "../../ConfigOverride.xcconfig"
-#include? "ConfigOverride.xcconfig"
+#include? "../ConfigOverride.xcconfig"
+#include? "ConfigOverride.xcconfig"

+ 0 - 140
Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents

@@ -1,140 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="22757" systemVersion="23E224" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
-    <entity name="BGaverages" representedClassName="BGaverages" syncable="YES" codeGenerationType="class">
-        <attribute name="average" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="average_1" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="average_7" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="average_30" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-    </entity>
-    <entity name="BGmedian" representedClassName="BGmedian" syncable="YES" codeGenerationType="class">
-        <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-        <attribute name="median" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="median_1" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="median_7" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="median_30" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-    </entity>
-    <entity name="Carbohydrates" representedClassName="Carbohydrates" syncable="YES" codeGenerationType="class">
-        <attribute name="carbs" optional="YES" attributeType="Decimal" defaultValueString="0"/>
-        <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-        <attribute name="enteredBy" optional="YES" attributeType="String"/>
-    </entity>
-    <entity name="Fat" representedClassName="Fat" syncable="YES" codeGenerationType="class">
-        <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-        <attribute name="enteredBy" optional="YES" attributeType="String"/>
-        <attribute name="fat" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-    </entity>
-    <entity name="HbA1c" representedClassName="HbA1c" syncable="YES" codeGenerationType="class">
-        <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-        <attribute name="hba1c" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="hba1c_1" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="hba1c_7" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="hba1c_30" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-    </entity>
-    <entity name="ImportError" representedClassName="ImportError" syncable="YES" codeGenerationType="class">
-        <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-        <attribute name="error" optional="YES" attributeType="String"/>
-    </entity>
-    <entity name="InsulinDistribution" representedClassName="InsulinDistribution" syncable="YES" codeGenerationType="class">
-        <attribute name="bolus" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-        <attribute name="scheduledBasal" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="tempBasal" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <relationship name="insulin" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Oref0Suggestion" inverseName="computedInsulinDistribution" inverseEntity="Oref0Suggestion"/>
-    </entity>
-    <entity name="LoopStatRecord" representedClassName="LoopStatRecord" syncable="YES" codeGenerationType="class">
-        <attribute name="duration" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES"/>
-        <attribute name="end" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-        <attribute name="interval" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES"/>
-        <attribute name="loopStatus" optional="YES" attributeType="String"/>
-        <attribute name="start" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-    </entity>
-    <entity name="Oref0Suggestion" representedClassName="Oref0Suggestion" syncable="YES" codeGenerationType="class">
-        <relationship name="computedInsulinDistribution" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="InsulinDistribution" inverseName="insulin" inverseEntity="InsulinDistribution"/>
-        <relationship name="computedTDD" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="TDD" inverseName="computed" inverseEntity="TDD"/>
-    </entity>
-    <entity name="Override" representedClassName="Override" syncable="YES" codeGenerationType="class">
-        <attribute name="advancedSettings" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
-        <attribute name="cr" optional="YES" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES"/>
-        <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-        <attribute name="duration" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="enabled" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
-        <attribute name="end" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="id" optional="YES" attributeType="String"/>
-        <attribute name="indefinite" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
-        <attribute name="isf" optional="YES" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES"/>
-        <attribute name="isfAndCr" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
-        <attribute name="isPreset" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
-        <attribute name="percentage" optional="YES" attributeType="Double" defaultValueString="100" usesScalarValueType="YES"/>
-        <attribute name="smbIsOff" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
-        <attribute name="smbIsScheduledOff" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
-        <attribute name="smbMinutes" optional="YES" attributeType="Decimal" defaultValueString="30"/>
-        <attribute name="start" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="target" optional="YES" attributeType="Decimal" defaultValueString="100"/>
-        <attribute name="uamMinutes" optional="YES" attributeType="Decimal" defaultValueString="30"/>
-    </entity>
-    <entity name="OverridePresets" representedClassName="OverridePresets" syncable="YES" codeGenerationType="class">
-        <attribute name="advancedSettings" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
-        <attribute name="cr" optional="YES" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES"/>
-        <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-        <attribute name="duration" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="end" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="id" optional="YES" attributeType="String"/>
-        <attribute name="indefinite" optional="YES" attributeType="Boolean" usesScalarValueType="YES"/>
-        <attribute name="isf" optional="YES" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES"/>
-        <attribute name="isfAndCr" optional="YES" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES"/>
-        <attribute name="name" optional="YES" attributeType="String"/>
-        <attribute name="percentage" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES"/>
-        <attribute name="smbIsOff" optional="YES" attributeType="Boolean" usesScalarValueType="YES"/>
-        <attribute name="smbIsScheduledOff" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
-        <attribute name="smbMinutes" optional="YES" attributeType="Decimal" defaultValueString="30"/>
-        <attribute name="start" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="target" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="uamMinutes" optional="YES" attributeType="Decimal" defaultValueString="30"/>
-    </entity>
-    <entity name="Presets" representedClassName="Presets" syncable="YES" codeGenerationType="class">
-        <attribute name="carbs" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="dish" optional="YES" attributeType="String"/>
-        <attribute name="fat" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="protein" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-    </entity>
-    <entity name="Protein" representedClassName="Protein" syncable="YES" codeGenerationType="class">
-        <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-        <attribute name="enteredBy" optional="YES" attributeType="String"/>
-        <attribute name="protein" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-    </entity>
-    <entity name="Readings" representedClassName="Readings" syncable="YES" codeGenerationType="class">
-        <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-        <attribute name="direction" optional="YES" attributeType="String"/>
-        <attribute name="glucose" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="YES"/>
-        <attribute name="id" optional="YES" attributeType="String"/>
-    </entity>
-    <entity name="StatsData" representedClassName="StatsData" syncable="YES" codeGenerationType="class">
-        <attribute name="lastrun" attributeType="Date" defaultDateTimeInterval="704497620" usesScalarValueType="NO"/>
-    </entity>
-    <entity name="Target" representedClassName="Target" syncable="YES" codeGenerationType="class">
-        <attribute name="current" optional="YES" attributeType="Decimal" defaultValueString="100"/>
-    </entity>
-    <entity name="TDD" representedClassName="TDD" syncable="YES" codeGenerationType="class">
-        <attribute name="tdd" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="timestamp" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-        <relationship name="computed" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Oref0Suggestion" inverseName="computedTDD" inverseEntity="Oref0Suggestion"/>
-    </entity>
-    <entity name="TempTargets" representedClassName="TempTargets" syncable="YES" codeGenerationType="class">
-        <attribute name="active" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
-        <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-        <attribute name="duration" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="hbt" optional="YES" attributeType="Double" defaultValueString="160" usesScalarValueType="YES"/>
-        <attribute name="id" optional="YES" attributeType="String"/>
-        <attribute name="startDate" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-    </entity>
-    <entity name="TempTargetsSlider" representedClassName="TempTargetsSlider" syncable="YES" codeGenerationType="class">
-        <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
-        <attribute name="defaultHBT" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES"/>
-        <attribute name="duration" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
-        <attribute name="enabled" optional="YES" attributeType="Boolean" defaultValueString="100" usesScalarValueType="YES"/>
-        <attribute name="hbt" optional="YES" attributeType="Double" defaultValueString="160" usesScalarValueType="YES"/>
-        <attribute name="id" optional="YES" attributeType="String" defaultValueString="empy"/>
-        <attribute name="isPreset" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
-    </entity>
-</model>

+ 1 - 0
DanaKit

@@ -0,0 +1 @@
+Subproject commit 0158fc85391725bb1855ea34469d48cb65667850

+ 0 - 41
Dependencies/ConnectIQ 2.xcframework/Info.plist

@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>AvailableLibraries</key>
-	<array>
-		<dict>
-			<key>LibraryIdentifier</key>
-			<string>ios-armv7_arm64</string>
-			<key>LibraryPath</key>
-			<string>ConnectIQ.framework</string>
-			<key>SupportedArchitectures</key>
-			<array>
-				<string>armv7</string>
-				<string>arm64</string>
-			</array>
-			<key>SupportedPlatform</key>
-			<string>ios</string>
-		</dict>
-		<dict>
-			<key>LibraryIdentifier</key>
-			<string>ios-i386_x86_64-simulator</string>
-			<key>LibraryPath</key>
-			<string>ConnectIQ.framework</string>
-			<key>SupportedArchitectures</key>
-			<array>
-				<string>i386</string>
-				<string>x86_64</string>
-			</array>
-			<key>SupportedPlatform</key>
-			<string>ios</string>
-			<key>SupportedPlatformVariant</key>
-			<string>simulator</string>
-		</dict>
-	</array>
-	<key>CFBundlePackageType</key>
-	<string>XFWK</string>
-	<key>XCFrameworkFormatVersion</key>
-	<string>1.0</string>
-</dict>
-</plist>

BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/ConnectIQ


+ 0 - 237
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/Headers/ConnectIQ.h

@@ -1,237 +0,0 @@
-//
-//  ConnectIQ.h
-//  ConnectIQ
-//
-//  Copyright (c) 2014 Garmin. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import "IQConstants.h"
-#import "IQDevice.h"
-#import "IQApp.h"
-
-// --------------------------------------------------------------------------------
-#pragma mark - PUBLIC TYPES
-// --------------------------------------------------------------------------------
-
-/// @brief  SendMessage progress callback block
-///
-/// @param  sentBytes  The number of bytes that have been successfully transferred
-///                    to the device so far for this connection.
-/// @param  totalBytes The total number of bytes to transfer for this connection.
-typedef void (^IQSendMessageProgress)(uint32_t sentBytes, uint32_t totalBytes);
-
-/// @brief  SendMessage completion callback block
-///
-/// @param  result The result of the SendMessage operation.
-typedef void (^IQSendMessageCompletion)(IQSendMessageResult result);
-
-/// @brief  Conforming to the IQUIOverrideDelegate protocol indicates that an
-///         object handles one or more events triggered by the ConnectIQ SDK that
-///         require user input.
-@protocol IQUIOverrideDelegate <NSObject>
-@optional
-/// @brief  Called by the ConnectIQ SDK when an action has been requested that
-///         requires Garmin Connect Mobile to be installed.
-///
-///         The receiver should choose whether or not to launch the Apple App
-///         Store page for GCM, ideally by presenting the user with a choice.
-///
-///         If the receiver of this message decides to install GCM, it must call
-///         showAppStoreForConnectMobile.
-- (void)needsToInstallConnectMobile;
-@end
-
-/// @brief  Conforming to the IQDeviceEventDelegate protocol indicates that an
-///         object handles ConnectIQ device status events.
-@protocol IQDeviceEventDelegate <NSObject>
-@optional
-/// @brief  Called by the ConnectIQ SDK when an IQDevice's connection status has
-///         changed.
-///
-/// @param  device The IQDevice whose status changed.
-/// @param  status The new status of the device.
-- (void)deviceStatusChanged:(IQDevice *)device status:(IQDeviceStatus)status;
-@end
-
-/// @brief  Conforming to the IQAppMessageDelegate protocol indicates that an
-///         object handles messages from ConnectIQ apps on compatible devices.
-@protocol IQAppMessageDelegate <NSObject>
-@optional
-/// @brief  Called by the ConnectIQ SDK when a message is received from a device.
-///
-/// @param  message The message that was received.
-/// @param  app     The device app that sent the message.
-- (void)receivedMessage:(id)message fromApp:(IQApp *)app;
-@end
-
-// --------------------------------------------------------------------------------
-#pragma mark - CLASS DEFINITION
-// --------------------------------------------------------------------------------
-
-/// @brief  The root of the ConnectIQ SDK API.
-@interface ConnectIQ : NSObject
-
-+ (instancetype)new NS_UNAVAILABLE;
-- (instancetype)init NS_UNAVAILABLE;
-
-// --------------------------------------------------------------------------------
-#pragma mark - SINGLETON ACCESS
-// --------------------------------------------------------------------------------
-
-/// @brief  Exposes the single static instance of the ConnectIQ class.
-///
-/// @return The single status instance of the ConnectIQ class.
-+ (ConnectIQ *)sharedInstance;
-
-// --------------------------------------------------------------------------------
-#pragma mark - INITIALIZATION
-// --------------------------------------------------------------------------------
-
-/// @brief  Initializes the ConnectIQ SDK with startup parameters necessary for
-///         its operation.
-///
-/// @param  urlScheme The URL scheme for this companion app. When Garmin Connect
-///                   Mobile is launched, it will return to the companion app by
-///                   launching a URL with this scheme.
-/// @param  delegate  The delegate that the SDK will use for notifying the
-///                   companion app about events that require user input. If this
-///                   is nil, the SDK's default UI will be used.
-- (void)initializeWithUrlScheme:(NSString *)urlScheme uiOverrideDelegate:(id<IQUIOverrideDelegate>)delegate;
-
-// --------------------------------------------------------------------------------
-#pragma mark - EXTERNAL LAUNCHING
-// --------------------------------------------------------------------------------
-
-/// @brief  Launches the Apple App Store page for the Garmin Connect Mobile app.
-///         The companion app should only call this in response to a
-///         needsToInstallConnectMobile event that gets triggered on the
-///         IQUIOverrideDelegate.
-- (void)showAppStoreForConnectMobile;
-
-/// @brief  Launches Garmin Connect Mobile for the purpose of retrieving a list of
-///         ConnectIQ-compatible devices.
-///
-///         Once the user has chosen which ConnectIQ devices to share with the
-///         companion app, GCM will return those devices to the companion app by
-///         opening a URL with the scheme registered in
-///         initializeWithUrlScheme:uiOverrideDelegate:.
-///
-///         The companion app should handle this URL by passing it in to the
-///         parseDeviceSelectionResponseFromURL: method to get the list of devices
-///         that the user permitted the companion app to communicate with.
-- (void)showConnectIQDeviceSelection;
-
-/// @brief  Parses a URL opened from Garmin Connect Mobile into a list of devices.
-///
-/// @param  url The URL to parse.
-///
-/// @return An array of IQDevice objects representing the ConnectIQ-compatible
-///         devices that the user allowed GCM to share with the companion app.
-///
-/// @seealso showConnectIQDeviceSelection
-- (NSArray *)parseDeviceSelectionResponseFromURL:(NSURL *)url;
-
-/// @brief  Launches Garmin Connect Mobile and shows the ConnectIQ app store page
-///         for the given app.
-///
-///         The companion app should call this if the user would like to manage
-///         the app on the device, such as to install, upgrade, uninstall, or
-///         modify settings.
-///
-/// @param  app The app to show the ConnectIQ app store page for.
-- (void)showConnectIQStoreForApp:(IQApp *)app;
-
-// --------------------------------------------------------------------------------
-#pragma mark - DEVICE MANAGEMENT
-// --------------------------------------------------------------------------------
-
-/// @brief  Registers an object as a listener for ConnectIQ device status events.
-///
-///         A device may have multiple device event listeners if this method is
-///         called more than once.
-///
-/// @param  device   A device to listen for status events from.
-/// @param  delegate The listener which will receive status events for this device.
-- (void)registerForDeviceEvents:(IQDevice *)device delegate:(id<IQDeviceEventDelegate>)delegate;
-
-/// @brief  Unregisters a listener for a specific device.
-///
-/// @param  device The device to unregister the listener for.
-/// @param  delegate The listener to remove from the device.
-- (void)unregisterForDeviceEvents:(IQDevice *)device delegate:(id<IQDeviceEventDelegate>)delegate;
-
-/// @brief  Unregisters the specified listener from all devices for which it had
-///         previously been registered.
-///
-/// @param  delegate The listener to unregister.
-- (void)unregisterForAllDeviceEvents:(id<IQDeviceEventDelegate>)delegate;
-
-/// @brief  Gets the current connection status of a device.
-///
-///         The device must have been registered for event notifications by
-///         calling registerForDeviceEvents:delegate: or this method will return
-///         IQDeviceStatus_InvalidDevice.
-///
-/// @param  device The device to get the status for.
-///
-/// @return The device's current connection status.
-- (IQDeviceStatus)getDeviceStatus:(IQDevice *)device;
-
-// --------------------------------------------------------------------------------
-#pragma mark - APP MANAGEMENT
-// --------------------------------------------------------------------------------
-
-/// @brief  Begins getting the status of an app on a device. This method returns
-///         immediately.
-///
-/// @param  app        The IQApp to get the status for.
-/// @param  completion The completion block that will be triggered when the device
-///                    status operation is complete.
-- (void)getAppStatus:(IQApp *)app completion:(void(^)(IQAppStatus *appStatus))completion;
-
-/// @brief  Registers an object as a listener for ConnectIQ messages from an app
-///         on a device.
-///
-///         An app may have multiple message listeners if this method is called
-///         more than once.
-///
-/// @param  app      The app to listen for messages from.
-/// @param  delegate The listener which will receive messages for this app.
-- (void)registerForAppMessages:(IQApp *)app delegate:(id<IQAppMessageDelegate>)delegate;
-
-/// @brief  Unregisters a listener for a specific app.
-///
-/// @param  app      The app to unregister a listener for.
-/// @param  delegate The listener to remove from the app.
-- (void)unregisterForAppMessages:(IQApp *)app delegate:(id<IQAppMessageDelegate>)delegate;
-
-/// @brief  Unregisters all previously registered apps for a specific listener.
-///
-/// @param  delegate The listener to unregister.
-- (void)unregisterForAllAppMessages:(id<IQAppMessageDelegate>)delegate;
-
-/// @brief  Begins sending a message to an app. This method returns immediately.
-///
-/// @param  message    The message to send to the app. This message must be one of
-///                    the following types: NSString, NSNumber, NSNull, NSArray,
-///                    or NSDictionary. Arrays and dictionaries may be nested.
-/// @param  app        The app to send the message to.
-/// @param  progress   A progress block that will be triggered periodically
-///                    throughout the transfer. This is guaranteed to be triggered
-///                    at least once.
-/// @param  completion A completion block that will be triggered when the send
-///                    message operation is complete.
-- (void)sendMessage:(id)message toApp:(IQApp *)app progress:(IQSendMessageProgress)progress completion:(IQSendMessageCompletion)completion;
-
-/// @brief  Sends an open app request message request to the device. This method returns immediately.
-///
-/// @param  app        The app to open.
-/// @param  completion A completion block that will be triggered when the send
-///                    message operation is complete.
-- (void)openAppRequest:(IQApp *)app completion:(IQSendMessageCompletion)completion;
-
-// TODO *** Holding off on documenting this until this method actually works.
-- (void)sendImage:(NSData *)bitmap toApp:(IQApp *)app progress:(IQSendMessageProgress)progress completion:(IQSendMessageCompletion)completion;
-
-@end

+ 0 - 34
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/Headers/IQApp.h

@@ -1,34 +0,0 @@
-//
-//  IQApp.h
-//  ConnectIQ
-//
-//  Copyright (c) 2014 Garmin. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import "IQDevice.h"
-#import "IQAppStatus.h"
-
-/// @brief  Represents an instance of a ConnectIQ app that is installed on a
-///         Garmin device.
-@interface IQApp : NSObject <NSSecureCoding>
-
-/// @brief  The unique identifier for this app.
-@property (nonatomic, readonly) NSUUID *uuid;
-
-/// @brief  The unique identifier for this app in the store.
-@property (nonatomic, readonly) NSUUID *storeUuid;
-
-/// @brief  The device that this app is installed on.
-@property (nonatomic, readonly) IQDevice *device;
-
-/// @brief  Creates a new app instance.
-///
-/// @param  uuid        The UUID of the app to create.
-/// @param  storeUuid   The store UUID of the app to create.
-/// @param  device      The device the app to create is installed on.
-///
-/// @return A new IQApp instance with the appropriate values set.
-+ (IQApp *)appWithUUID:(NSUUID *)uuid storeUuid:(NSUUID *)storeUuid device:(IQDevice *)device;
-
-@end

+ 0 - 20
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/Headers/IQAppStatus.h

@@ -1,20 +0,0 @@
-//
-//  IQAppStatus.h
-//  ConnectIQ
-//
-//  Copyright (c) 2014 Garmin. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-/// @brief  Represents the current status of an app on a Garmin device.
-@interface IQAppStatus : NSObject
-
-/// @brief  YES if the app is installed on the device, NO if it isn't.
-@property (nonatomic, readonly) BOOL isInstalled;
-
-/// @brief  The version of the app that is currently installed on the device. If
-///         the app is not installed, this value is unused.
-@property (nonatomic, readonly) uint16_t version;
-
-@end

+ 0 - 63
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/Headers/IQConstants.h

@@ -1,63 +0,0 @@
-//
-//  IQConstants.h
-//  ConnectIQ
-//
-//  Copyright (c) 2014 Garmin. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-/// @brief  The current version of the ConnectIQ SDK.
-extern int const IQSDKVersion;
-
-/// @brief  The bundle identifier for the Garmin Connect Mobile app.
-extern NSString * const IQGCMBundle;
-
-/// @brief  The result of a SendMessage operation
-typedef NS_ENUM(NSInteger, IQSendMessageResult){
-    ///! @brief  The message was sent successfully.
-    IQSendMessageResult_Success,
-
-    /// @brief  The message failed to send due to an unknown error.
-    IQSendMessageResult_Failure_Unknown,
-
-    /// @brief  The message failed to send. There was an error within the SDK or
-    ///         on the device.
-    IQSendMessageResult_Failure_InternalError,
-
-    /// @brief  The message failed to send. The device is not available right now.
-    IQSendMessageResult_Failure_DeviceNotAvailable,
-
-    /// @brief  The message failed to send. The app is not installed on the
-    ///         device.
-    IQSendMessageResult_Failure_AppNotFound,
-
-    /// @brief  The message failed to send. The device is busy and cannot receive
-    ///         the message right now.
-    IQSendMessageResult_Failure_DeviceIsBusy,
-
-    /// @brief  The message failed to send. The message contained an unsupported
-    ///         type.
-    IQSendMessageResult_Failure_UnsupportedType,
-
-    /// @brief  The message failed to send. The device does not have enough memory
-    ///         to receive the message.
-    IQSendMessageResult_Failure_InsufficientMemory,
-
-    /// @brief  The message failed to send. The connection timed out while sending
-    ///         the message.
-    IQSendMessageResult_Failure_Timeout,
-
-    /// @brief  The message failed to send and was retried, but could not complete
-    ///         after a number of tries.
-    IQSendMessageResult_Failure_MaxRetries,
-
-    /// @brief  The message was received by the device but it chose not to display
-    ///         a message prompt, ignoring the message.
-    IQSendMessageResult_Failure_PromptNotDisplayed,
-
-    /// @brief  The message was received by the device but the app to open
-    ///         was already running on the device.
-    IQSendMessageResult_Failure_AppAlreadyRunning,
-};
-NSString *NSStringFromSendMessageResult(IQSendMessageResult value);

+ 0 - 61
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/Headers/IQDevice.h

@@ -1,61 +0,0 @@
-//
-//  IQDevice.h
-//  ConnectIQ
-//
-//  Copyright (c) 2014 Garmin. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import <CoreBluetooth/CoreBluetooth.h>
-
-/// @brief  The current status of an IQDevice.
-typedef NS_ENUM(NSInteger, IQDeviceStatus){
-    /// @brief  No device with this UUID has been registered for status events
-    ///         the SDK.
-    IQDeviceStatus_InvalidDevice,
-
-    /// @brief  Bluetooth is either powered off or resetting.
-    IQDeviceStatus_BluetoothNotReady,
-
-    /// @brief  This device could not be found by iOS. Perhaps the user removed
-    ///         the device?
-    IQDeviceStatus_NotFound,
-
-    /// @brief  The device is recognized by iOS, but it is not currently
-    ///         connected.
-    IQDeviceStatus_NotConnected,
-
-    /// @brief  The device is connected and ready to communicate.
-    IQDeviceStatus_Connected,
-};
-
-/// @brief  Represents a ConnectIQ-compatible Garmin device.
-@interface IQDevice : NSObject <NSSecureCoding>
-
-/// @brief  The unique identifier for this device.
-@property (nonatomic, readonly) NSUUID *uuid;
-
-/// @brief  The model name of the device provided by Garmin Connect Mobile.
-@property (nonatomic, readonly) NSString *modelName;
-
-/// @brief  The friendly name of the device, set by the user and provided by
-///         Garmin Connect Mobile.
-@property (nonatomic, readonly) NSString *friendlyName;
-
-/// @brief  Creates a new device instance.
-///
-/// @param  uuid         The UUID of the device to create.
-/// @param  modelName    The model name of the device to create.
-/// @param  friendlyName The friendly name of the device to create.
-///
-/// @return A new IQDevice instance with the appropriate values set.
-+ (IQDevice *)deviceWithId:(NSUUID *)uuid modelName:(NSString *)modelName friendlyName:(NSString *)friendlyName;
-
-/// @brief  Creates a new device instance by copying another device's values.
-///
-/// @param  device The device to copy values from.
-///
-/// @return A new IQDevice instance with all values copied.
-- (instancetype)initWithDevice:(IQDevice *)device;
-
-@end

BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/Info.plist


+ 0 - 6
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/Modules/module.modulemap

@@ -1,6 +0,0 @@
-framework module ConnectIQ {
-  umbrella header "ConnectIQ.h"
-
-  export *
-  module * { export * }
-}

BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/ar.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/cs.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/da.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/de.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/el.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/en.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/es.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/fi.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/fr.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/he.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/hr.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/hu.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/id.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/it.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/ja.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/ko.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/ms.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/nb.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/nl.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/pl.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/pt-PT.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/pt.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/ru.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/sk.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/sv.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/th.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/tr.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/zh-Hans.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-armv7_arm64/ConnectIQ.framework/zh-Hant.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/ConnectIQ


+ 0 - 237
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/Headers/ConnectIQ.h

@@ -1,237 +0,0 @@
-//
-//  ConnectIQ.h
-//  ConnectIQ
-//
-//  Copyright (c) 2014 Garmin. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import "IQConstants.h"
-#import "IQDevice.h"
-#import "IQApp.h"
-
-// --------------------------------------------------------------------------------
-#pragma mark - PUBLIC TYPES
-// --------------------------------------------------------------------------------
-
-/// @brief  SendMessage progress callback block
-///
-/// @param  sentBytes  The number of bytes that have been successfully transferred
-///                    to the device so far for this connection.
-/// @param  totalBytes The total number of bytes to transfer for this connection.
-typedef void (^IQSendMessageProgress)(uint32_t sentBytes, uint32_t totalBytes);
-
-/// @brief  SendMessage completion callback block
-///
-/// @param  result The result of the SendMessage operation.
-typedef void (^IQSendMessageCompletion)(IQSendMessageResult result);
-
-/// @brief  Conforming to the IQUIOverrideDelegate protocol indicates that an
-///         object handles one or more events triggered by the ConnectIQ SDK that
-///         require user input.
-@protocol IQUIOverrideDelegate <NSObject>
-@optional
-/// @brief  Called by the ConnectIQ SDK when an action has been requested that
-///         requires Garmin Connect Mobile to be installed.
-///
-///         The receiver should choose whether or not to launch the Apple App
-///         Store page for GCM, ideally by presenting the user with a choice.
-///
-///         If the receiver of this message decides to install GCM, it must call
-///         showAppStoreForConnectMobile.
-- (void)needsToInstallConnectMobile;
-@end
-
-/// @brief  Conforming to the IQDeviceEventDelegate protocol indicates that an
-///         object handles ConnectIQ device status events.
-@protocol IQDeviceEventDelegate <NSObject>
-@optional
-/// @brief  Called by the ConnectIQ SDK when an IQDevice's connection status has
-///         changed.
-///
-/// @param  device The IQDevice whose status changed.
-/// @param  status The new status of the device.
-- (void)deviceStatusChanged:(IQDevice *)device status:(IQDeviceStatus)status;
-@end
-
-/// @brief  Conforming to the IQAppMessageDelegate protocol indicates that an
-///         object handles messages from ConnectIQ apps on compatible devices.
-@protocol IQAppMessageDelegate <NSObject>
-@optional
-/// @brief  Called by the ConnectIQ SDK when a message is received from a device.
-///
-/// @param  message The message that was received.
-/// @param  app     The device app that sent the message.
-- (void)receivedMessage:(id)message fromApp:(IQApp *)app;
-@end
-
-// --------------------------------------------------------------------------------
-#pragma mark - CLASS DEFINITION
-// --------------------------------------------------------------------------------
-
-/// @brief  The root of the ConnectIQ SDK API.
-@interface ConnectIQ : NSObject
-
-+ (instancetype)new NS_UNAVAILABLE;
-- (instancetype)init NS_UNAVAILABLE;
-
-// --------------------------------------------------------------------------------
-#pragma mark - SINGLETON ACCESS
-// --------------------------------------------------------------------------------
-
-/// @brief  Exposes the single static instance of the ConnectIQ class.
-///
-/// @return The single status instance of the ConnectIQ class.
-+ (ConnectIQ *)sharedInstance;
-
-// --------------------------------------------------------------------------------
-#pragma mark - INITIALIZATION
-// --------------------------------------------------------------------------------
-
-/// @brief  Initializes the ConnectIQ SDK with startup parameters necessary for
-///         its operation.
-///
-/// @param  urlScheme The URL scheme for this companion app. When Garmin Connect
-///                   Mobile is launched, it will return to the companion app by
-///                   launching a URL with this scheme.
-/// @param  delegate  The delegate that the SDK will use for notifying the
-///                   companion app about events that require user input. If this
-///                   is nil, the SDK's default UI will be used.
-- (void)initializeWithUrlScheme:(NSString *)urlScheme uiOverrideDelegate:(id<IQUIOverrideDelegate>)delegate;
-
-// --------------------------------------------------------------------------------
-#pragma mark - EXTERNAL LAUNCHING
-// --------------------------------------------------------------------------------
-
-/// @brief  Launches the Apple App Store page for the Garmin Connect Mobile app.
-///         The companion app should only call this in response to a
-///         needsToInstallConnectMobile event that gets triggered on the
-///         IQUIOverrideDelegate.
-- (void)showAppStoreForConnectMobile;
-
-/// @brief  Launches Garmin Connect Mobile for the purpose of retrieving a list of
-///         ConnectIQ-compatible devices.
-///
-///         Once the user has chosen which ConnectIQ devices to share with the
-///         companion app, GCM will return those devices to the companion app by
-///         opening a URL with the scheme registered in
-///         initializeWithUrlScheme:uiOverrideDelegate:.
-///
-///         The companion app should handle this URL by passing it in to the
-///         parseDeviceSelectionResponseFromURL: method to get the list of devices
-///         that the user permitted the companion app to communicate with.
-- (void)showConnectIQDeviceSelection;
-
-/// @brief  Parses a URL opened from Garmin Connect Mobile into a list of devices.
-///
-/// @param  url The URL to parse.
-///
-/// @return An array of IQDevice objects representing the ConnectIQ-compatible
-///         devices that the user allowed GCM to share with the companion app.
-///
-/// @seealso showConnectIQDeviceSelection
-- (NSArray *)parseDeviceSelectionResponseFromURL:(NSURL *)url;
-
-/// @brief  Launches Garmin Connect Mobile and shows the ConnectIQ app store page
-///         for the given app.
-///
-///         The companion app should call this if the user would like to manage
-///         the app on the device, such as to install, upgrade, uninstall, or
-///         modify settings.
-///
-/// @param  app The app to show the ConnectIQ app store page for.
-- (void)showConnectIQStoreForApp:(IQApp *)app;
-
-// --------------------------------------------------------------------------------
-#pragma mark - DEVICE MANAGEMENT
-// --------------------------------------------------------------------------------
-
-/// @brief  Registers an object as a listener for ConnectIQ device status events.
-///
-///         A device may have multiple device event listeners if this method is
-///         called more than once.
-///
-/// @param  device   A device to listen for status events from.
-/// @param  delegate The listener which will receive status events for this device.
-- (void)registerForDeviceEvents:(IQDevice *)device delegate:(id<IQDeviceEventDelegate>)delegate;
-
-/// @brief  Unregisters a listener for a specific device.
-///
-/// @param  device The device to unregister the listener for.
-/// @param  delegate The listener to remove from the device.
-- (void)unregisterForDeviceEvents:(IQDevice *)device delegate:(id<IQDeviceEventDelegate>)delegate;
-
-/// @brief  Unregisters the specified listener from all devices for which it had
-///         previously been registered.
-///
-/// @param  delegate The listener to unregister.
-- (void)unregisterForAllDeviceEvents:(id<IQDeviceEventDelegate>)delegate;
-
-/// @brief  Gets the current connection status of a device.
-///
-///         The device must have been registered for event notifications by
-///         calling registerForDeviceEvents:delegate: or this method will return
-///         IQDeviceStatus_InvalidDevice.
-///
-/// @param  device The device to get the status for.
-///
-/// @return The device's current connection status.
-- (IQDeviceStatus)getDeviceStatus:(IQDevice *)device;
-
-// --------------------------------------------------------------------------------
-#pragma mark - APP MANAGEMENT
-// --------------------------------------------------------------------------------
-
-/// @brief  Begins getting the status of an app on a device. This method returns
-///         immediately.
-///
-/// @param  app        The IQApp to get the status for.
-/// @param  completion The completion block that will be triggered when the device
-///                    status operation is complete.
-- (void)getAppStatus:(IQApp *)app completion:(void(^)(IQAppStatus *appStatus))completion;
-
-/// @brief  Registers an object as a listener for ConnectIQ messages from an app
-///         on a device.
-///
-///         An app may have multiple message listeners if this method is called
-///         more than once.
-///
-/// @param  app      The app to listen for messages from.
-/// @param  delegate The listener which will receive messages for this app.
-- (void)registerForAppMessages:(IQApp *)app delegate:(id<IQAppMessageDelegate>)delegate;
-
-/// @brief  Unregisters a listener for a specific app.
-///
-/// @param  app      The app to unregister a listener for.
-/// @param  delegate The listener to remove from the app.
-- (void)unregisterForAppMessages:(IQApp *)app delegate:(id<IQAppMessageDelegate>)delegate;
-
-/// @brief  Unregisters all previously registered apps for a specific listener.
-///
-/// @param  delegate The listener to unregister.
-- (void)unregisterForAllAppMessages:(id<IQAppMessageDelegate>)delegate;
-
-/// @brief  Begins sending a message to an app. This method returns immediately.
-///
-/// @param  message    The message to send to the app. This message must be one of
-///                    the following types: NSString, NSNumber, NSNull, NSArray,
-///                    or NSDictionary. Arrays and dictionaries may be nested.
-/// @param  app        The app to send the message to.
-/// @param  progress   A progress block that will be triggered periodically
-///                    throughout the transfer. This is guaranteed to be triggered
-///                    at least once.
-/// @param  completion A completion block that will be triggered when the send
-///                    message operation is complete.
-- (void)sendMessage:(id)message toApp:(IQApp *)app progress:(IQSendMessageProgress)progress completion:(IQSendMessageCompletion)completion;
-
-/// @brief  Sends an open app request message request to the device. This method returns immediately.
-///
-/// @param  app        The app to open.
-/// @param  completion A completion block that will be triggered when the send
-///                    message operation is complete.
-- (void)openAppRequest:(IQApp *)app completion:(IQSendMessageCompletion)completion;
-
-// TODO *** Holding off on documenting this until this method actually works.
-- (void)sendImage:(NSData *)bitmap toApp:(IQApp *)app progress:(IQSendMessageProgress)progress completion:(IQSendMessageCompletion)completion;
-
-@end

+ 0 - 34
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/Headers/IQApp.h

@@ -1,34 +0,0 @@
-//
-//  IQApp.h
-//  ConnectIQ
-//
-//  Copyright (c) 2014 Garmin. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import "IQDevice.h"
-#import "IQAppStatus.h"
-
-/// @brief  Represents an instance of a ConnectIQ app that is installed on a
-///         Garmin device.
-@interface IQApp : NSObject <NSSecureCoding>
-
-/// @brief  The unique identifier for this app.
-@property (nonatomic, readonly) NSUUID *uuid;
-
-/// @brief  The unique identifier for this app in the store.
-@property (nonatomic, readonly) NSUUID *storeUuid;
-
-/// @brief  The device that this app is installed on.
-@property (nonatomic, readonly) IQDevice *device;
-
-/// @brief  Creates a new app instance.
-///
-/// @param  uuid        The UUID of the app to create.
-/// @param  storeUuid   The store UUID of the app to create.
-/// @param  device      The device the app to create is installed on.
-///
-/// @return A new IQApp instance with the appropriate values set.
-+ (IQApp *)appWithUUID:(NSUUID *)uuid storeUuid:(NSUUID *)storeUuid device:(IQDevice *)device;
-
-@end

+ 0 - 20
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/Headers/IQAppStatus.h

@@ -1,20 +0,0 @@
-//
-//  IQAppStatus.h
-//  ConnectIQ
-//
-//  Copyright (c) 2014 Garmin. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-/// @brief  Represents the current status of an app on a Garmin device.
-@interface IQAppStatus : NSObject
-
-/// @brief  YES if the app is installed on the device, NO if it isn't.
-@property (nonatomic, readonly) BOOL isInstalled;
-
-/// @brief  The version of the app that is currently installed on the device. If
-///         the app is not installed, this value is unused.
-@property (nonatomic, readonly) uint16_t version;
-
-@end

+ 0 - 63
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/Headers/IQConstants.h

@@ -1,63 +0,0 @@
-//
-//  IQConstants.h
-//  ConnectIQ
-//
-//  Copyright (c) 2014 Garmin. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-/// @brief  The current version of the ConnectIQ SDK.
-extern int const IQSDKVersion;
-
-/// @brief  The bundle identifier for the Garmin Connect Mobile app.
-extern NSString * const IQGCMBundle;
-
-/// @brief  The result of a SendMessage operation
-typedef NS_ENUM(NSInteger, IQSendMessageResult){
-    ///! @brief  The message was sent successfully.
-    IQSendMessageResult_Success,
-
-    /// @brief  The message failed to send due to an unknown error.
-    IQSendMessageResult_Failure_Unknown,
-
-    /// @brief  The message failed to send. There was an error within the SDK or
-    ///         on the device.
-    IQSendMessageResult_Failure_InternalError,
-
-    /// @brief  The message failed to send. The device is not available right now.
-    IQSendMessageResult_Failure_DeviceNotAvailable,
-
-    /// @brief  The message failed to send. The app is not installed on the
-    ///         device.
-    IQSendMessageResult_Failure_AppNotFound,
-
-    /// @brief  The message failed to send. The device is busy and cannot receive
-    ///         the message right now.
-    IQSendMessageResult_Failure_DeviceIsBusy,
-
-    /// @brief  The message failed to send. The message contained an unsupported
-    ///         type.
-    IQSendMessageResult_Failure_UnsupportedType,
-
-    /// @brief  The message failed to send. The device does not have enough memory
-    ///         to receive the message.
-    IQSendMessageResult_Failure_InsufficientMemory,
-
-    /// @brief  The message failed to send. The connection timed out while sending
-    ///         the message.
-    IQSendMessageResult_Failure_Timeout,
-
-    /// @brief  The message failed to send and was retried, but could not complete
-    ///         after a number of tries.
-    IQSendMessageResult_Failure_MaxRetries,
-
-    /// @brief  The message was received by the device but it chose not to display
-    ///         a message prompt, ignoring the message.
-    IQSendMessageResult_Failure_PromptNotDisplayed,
-
-    /// @brief  The message was received by the device but the app to open
-    ///         was already running on the device.
-    IQSendMessageResult_Failure_AppAlreadyRunning,
-};
-NSString *NSStringFromSendMessageResult(IQSendMessageResult value);

+ 0 - 61
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/Headers/IQDevice.h

@@ -1,61 +0,0 @@
-//
-//  IQDevice.h
-//  ConnectIQ
-//
-//  Copyright (c) 2014 Garmin. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import <CoreBluetooth/CoreBluetooth.h>
-
-/// @brief  The current status of an IQDevice.
-typedef NS_ENUM(NSInteger, IQDeviceStatus){
-    /// @brief  No device with this UUID has been registered for status events
-    ///         the SDK.
-    IQDeviceStatus_InvalidDevice,
-
-    /// @brief  Bluetooth is either powered off or resetting.
-    IQDeviceStatus_BluetoothNotReady,
-
-    /// @brief  This device could not be found by iOS. Perhaps the user removed
-    ///         the device?
-    IQDeviceStatus_NotFound,
-
-    /// @brief  The device is recognized by iOS, but it is not currently
-    ///         connected.
-    IQDeviceStatus_NotConnected,
-
-    /// @brief  The device is connected and ready to communicate.
-    IQDeviceStatus_Connected,
-};
-
-/// @brief  Represents a ConnectIQ-compatible Garmin device.
-@interface IQDevice : NSObject <NSSecureCoding>
-
-/// @brief  The unique identifier for this device.
-@property (nonatomic, readonly) NSUUID *uuid;
-
-/// @brief  The model name of the device provided by Garmin Connect Mobile.
-@property (nonatomic, readonly) NSString *modelName;
-
-/// @brief  The friendly name of the device, set by the user and provided by
-///         Garmin Connect Mobile.
-@property (nonatomic, readonly) NSString *friendlyName;
-
-/// @brief  Creates a new device instance.
-///
-/// @param  uuid         The UUID of the device to create.
-/// @param  modelName    The model name of the device to create.
-/// @param  friendlyName The friendly name of the device to create.
-///
-/// @return A new IQDevice instance with the appropriate values set.
-+ (IQDevice *)deviceWithId:(NSUUID *)uuid modelName:(NSString *)modelName friendlyName:(NSString *)friendlyName;
-
-/// @brief  Creates a new device instance by copying another device's values.
-///
-/// @param  device The device to copy values from.
-///
-/// @return A new IQDevice instance with all values copied.
-- (instancetype)initWithDevice:(IQDevice *)device;
-
-@end

BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/Info.plist


+ 0 - 6
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/Modules/module.modulemap

@@ -1,6 +0,0 @@
-framework module ConnectIQ {
-  umbrella header "ConnectIQ.h"
-
-  export *
-  module * { export * }
-}

+ 0 - 830
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/_CodeSignature/CodeResources

@@ -1,830 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>files</key>
-	<dict>
-		<key>Headers/ConnectIQ.h</key>
-		<data>
-		F1hICh90Ex4ADEjYLcSi0YPhrPA=
-		</data>
-		<key>Headers/IQApp.h</key>
-		<data>
-		R7+SmeArgBACIBWHRnEAugyFHKE=
-		</data>
-		<key>Headers/IQAppStatus.h</key>
-		<data>
-		WnybOSMMVqCKGns0rEz9C3EfQOg=
-		</data>
-		<key>Headers/IQConstants.h</key>
-		<data>
-		eI7keKSkaajUZACnuMhgtV1RuBA=
-		</data>
-		<key>Headers/IQDevice.h</key>
-		<data>
-		bl545C/cu0mw2KlRmzojKmHPom0=
-		</data>
-		<key>Info.plist</key>
-		<data>
-		sMY09qXRBL/m1OGNWejLjfNg04w=
-		</data>
-		<key>Modules/module.modulemap</key>
-		<data>
-		SSRVAtIAdFmowQqE4HzOpWYLubg=
-		</data>
-		<key>ar.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			1CDTE/Qaf1Z/HuhSt9CUnwitv4M=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>cs.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			/jkyQ77G2Xd9wy6QptBphGNbtCY=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>da.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			FYi0wjOu/Hw//Qe96yqxSb9yClc=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>de.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			MitzVbGhXhTLjPvw9vuWcQQa50Q=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>el.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			n82gLcjjjHszaroTFeJUvSrrc0o=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>en.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			hcxxLyrTI+aElXlPc5dwr7jdqwc=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>es.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			ff8DVQtNhO8pF7HFnXjh8foHXbo=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>fi.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			R9cr8yqJmu91Xz31tGyprGR3t/s=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>fr.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			PwFmqFeRTcjdHmkXYrPzNVYoe5o=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>he.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			/jPUgFtYbbyELG5DZ3Sjoi/If9w=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>hr.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			H2GtdTeORRPCnogvpWY69Dg9uME=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>hu.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			QIimMhNyYmqp4ZW01hfj554WAMg=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>id.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			2/54a0gkcVuk1I3m4ulDAXOLL5o=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>it.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			hNIKYIcP/87e6g7AUP+zKRtJ52M=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>ja.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			0iU2PbJ/3xgXMZ20ffsqaWpxKWc=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>ko.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			ERH8oHR9H9jMHjP0EAgaTtVhnX4=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>ms.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			DkbQA2+v/qSgQWma/fg3647Bkqs=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>nb.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			T3zFOvuvrJt5Vnmfqt2Mf/du8as=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>nl.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			t9PD5JEbfoSLaQ7f8M2cLghOReI=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>pl.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			wfTnhBccAm6JfwH/JkZKNRKTUAU=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>pt-PT.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			7yXkcZEpJ4UiRHAzhK+vw/Q857Y=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>pt.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			tZPncsQs8weCDJa03AKLpijXSUw=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>ru.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			Ct+byJ3rWeigvg0q6rB/kQaR+yE=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>sk.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			1yTM1nAsAYpSH7NrYU6/nFlqk5E=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>sv.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			i84z6vuHLrFpO0qZ2V0zYjixIws=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>th.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			oW5npy+pDJM1wUOgTkw9FY1Ave4=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>tr.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			76rD7PLrQMiT5YTlI8IjEFgsiU4=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>zh-Hans.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			DNlMxUKypOvKArzi7ioJUiFfFXg=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>zh-Hant.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			U6I+uL07KIv2b77w0c0glaJlhMg=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-	</dict>
-	<key>files2</key>
-	<dict>
-		<key>Headers/ConnectIQ.h</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			F1hICh90Ex4ADEjYLcSi0YPhrPA=
-			</data>
-			<key>hash2</key>
-			<data>
-			ABtgvHbvmly4QpZO/KmmrwYkL0N+AqV3gXdPVrseysY=
-			</data>
-		</dict>
-		<key>Headers/IQApp.h</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			R7+SmeArgBACIBWHRnEAugyFHKE=
-			</data>
-			<key>hash2</key>
-			<data>
-			X4vXt0sO9gxQNzQalIaLqMpSGNRC9ue2USDcfjBYkec=
-			</data>
-		</dict>
-		<key>Headers/IQAppStatus.h</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			WnybOSMMVqCKGns0rEz9C3EfQOg=
-			</data>
-			<key>hash2</key>
-			<data>
-			tg9qNXtTmFUvNoJtq7O/aEXBNngcGENVRhvxLJ8C/xo=
-			</data>
-		</dict>
-		<key>Headers/IQConstants.h</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			eI7keKSkaajUZACnuMhgtV1RuBA=
-			</data>
-			<key>hash2</key>
-			<data>
-			bqDpm8yikc2FIqaSUHcLqPY6TPXLlXSUo+Dl9NUYwmA=
-			</data>
-		</dict>
-		<key>Headers/IQDevice.h</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			bl545C/cu0mw2KlRmzojKmHPom0=
-			</data>
-			<key>hash2</key>
-			<data>
-			4N4+64IHeb9iBwyziNxo0SMuCM75ez9Em4UfmtgtTHA=
-			</data>
-		</dict>
-		<key>Modules/module.modulemap</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			SSRVAtIAdFmowQqE4HzOpWYLubg=
-			</data>
-			<key>hash2</key>
-			<data>
-			lQGjVO5Q0wfztjETCwDkwAkQ7nZInCgWdStnHL3o6Co=
-			</data>
-		</dict>
-		<key>ar.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			1CDTE/Qaf1Z/HuhSt9CUnwitv4M=
-			</data>
-			<key>hash2</key>
-			<data>
-			CWyQue2TCS0heGoGbN4ffetM2QZSk7lqgc2Wer2fgTg=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>cs.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			/jkyQ77G2Xd9wy6QptBphGNbtCY=
-			</data>
-			<key>hash2</key>
-			<data>
-			1mSn+EYeYcTV1dArgHz7PkmZrV6mHWfnuG5aDa6Y87E=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>da.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			FYi0wjOu/Hw//Qe96yqxSb9yClc=
-			</data>
-			<key>hash2</key>
-			<data>
-			yLkvGzd+smkOjicvW/+Oe6wGGyirHS+/YfjuSzyVoMM=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>de.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			MitzVbGhXhTLjPvw9vuWcQQa50Q=
-			</data>
-			<key>hash2</key>
-			<data>
-			DFHv7MWBJmyAkOj993NmSFKbS2t8/vtSev603sBUtjI=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>el.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			n82gLcjjjHszaroTFeJUvSrrc0o=
-			</data>
-			<key>hash2</key>
-			<data>
-			i4FAK4mi+SgS6oZv8zM74kRZToakn49E8GD7FcJBLoQ=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>en.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			hcxxLyrTI+aElXlPc5dwr7jdqwc=
-			</data>
-			<key>hash2</key>
-			<data>
-			vmBi9DFJzFcG0OwaWKSDjgklNi407U8u2pz3EnEENN4=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>es.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			ff8DVQtNhO8pF7HFnXjh8foHXbo=
-			</data>
-			<key>hash2</key>
-			<data>
-			z6RjynaWjrRKHmv4sLirc4eXwKOtQdylzj5+TiHpaTc=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>fi.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			R9cr8yqJmu91Xz31tGyprGR3t/s=
-			</data>
-			<key>hash2</key>
-			<data>
-			6BI0iPRVWaP63/XFdjLBz6z7DsvvuOoaEAS+mYzrx8E=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>fr.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			PwFmqFeRTcjdHmkXYrPzNVYoe5o=
-			</data>
-			<key>hash2</key>
-			<data>
-			geXjZzXre2CRiALecPFBGz4JSJA7MbkDnB4qrEMKNwk=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>he.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			/jPUgFtYbbyELG5DZ3Sjoi/If9w=
-			</data>
-			<key>hash2</key>
-			<data>
-			47mcrSx16SFjWPIiN7guCAG0va8NiJ6I5s45tSVEHlY=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>hr.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			H2GtdTeORRPCnogvpWY69Dg9uME=
-			</data>
-			<key>hash2</key>
-			<data>
-			4bQvygPax6VBpoFlyS5by1N6otnDMliHu+bWsDaWSQc=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>hu.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			QIimMhNyYmqp4ZW01hfj554WAMg=
-			</data>
-			<key>hash2</key>
-			<data>
-			0m2fIyz26vh3RlUqqSXvoNTLovxIixrUyJoL/IDSoVk=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>id.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			2/54a0gkcVuk1I3m4ulDAXOLL5o=
-			</data>
-			<key>hash2</key>
-			<data>
-			hQf9SrG7d8aVWsXIbCIxkKEJjbnW1FLvS+MbOI1VtHQ=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>it.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			hNIKYIcP/87e6g7AUP+zKRtJ52M=
-			</data>
-			<key>hash2</key>
-			<data>
-			XAbEWX6cicDxGzxGgSx3DhF4rjUHX4LV+dO0X3rUEqc=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>ja.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			0iU2PbJ/3xgXMZ20ffsqaWpxKWc=
-			</data>
-			<key>hash2</key>
-			<data>
-			YOqOvZq0WEN4DCoSwc0lcTSRc4C812DqzjIsaid1SHg=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>ko.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			ERH8oHR9H9jMHjP0EAgaTtVhnX4=
-			</data>
-			<key>hash2</key>
-			<data>
-			WJyaRCWn1KqmcDeajRnC41MdNrlpbI+1JbPkXhbKrKY=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>ms.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			DkbQA2+v/qSgQWma/fg3647Bkqs=
-			</data>
-			<key>hash2</key>
-			<data>
-			gztYxa4Hn58HkKmcUIZI1jCz44IETZeMsqrpZSKxJvc=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>nb.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			T3zFOvuvrJt5Vnmfqt2Mf/du8as=
-			</data>
-			<key>hash2</key>
-			<data>
-			Oy6UOwSN+/xPIrthAEvzV8PEn27kfsHpMMLU5w1rww0=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>nl.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			t9PD5JEbfoSLaQ7f8M2cLghOReI=
-			</data>
-			<key>hash2</key>
-			<data>
-			XbijhSaZgmsW59Vo9ZEbhDuUQH18fHizWKzsLosiM0o=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>pl.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			wfTnhBccAm6JfwH/JkZKNRKTUAU=
-			</data>
-			<key>hash2</key>
-			<data>
-			MQYgqA+Hl03JJ261Q19K5Lt64kSTBP+pfpD+jOVE3AU=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>pt-PT.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			7yXkcZEpJ4UiRHAzhK+vw/Q857Y=
-			</data>
-			<key>hash2</key>
-			<data>
-			seINq3QazVameLGOW+pIAtGWLa6NDl5XWRtqnObxywo=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>pt.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			tZPncsQs8weCDJa03AKLpijXSUw=
-			</data>
-			<key>hash2</key>
-			<data>
-			GnzdqEuQwORzVCih99bwr79UHIyzXm+zuN5b9m1NrKY=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>ru.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			Ct+byJ3rWeigvg0q6rB/kQaR+yE=
-			</data>
-			<key>hash2</key>
-			<data>
-			yCN9s/JXYqsMNZ1icaH4hUwyMQ1NtxOmV6sIAtRd9pc=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>sk.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			1yTM1nAsAYpSH7NrYU6/nFlqk5E=
-			</data>
-			<key>hash2</key>
-			<data>
-			OFHDtkGLLSfTuSx8GOTycKDCKOKmX0Wh2QG1CHhRz3I=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>sv.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			i84z6vuHLrFpO0qZ2V0zYjixIws=
-			</data>
-			<key>hash2</key>
-			<data>
-			a3Gk+3USOT5uundOXrNCgnbcD0rDo2lkCO7b7+zg2Is=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>th.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			oW5npy+pDJM1wUOgTkw9FY1Ave4=
-			</data>
-			<key>hash2</key>
-			<data>
-			qxGqAqRMwm0/dMd0W7DUsvbWb9x65GT+3d1zOQEql1w=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>tr.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			76rD7PLrQMiT5YTlI8IjEFgsiU4=
-			</data>
-			<key>hash2</key>
-			<data>
-			Y6TnKQmqO/TAx+0KYqRRG6UOz7I/gM1YmbUwgSfZSQU=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>zh-Hans.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			DNlMxUKypOvKArzi7ioJUiFfFXg=
-			</data>
-			<key>hash2</key>
-			<data>
-			BI3m4MTMHuPI4sQKPGeQnxIlBJJrXwgVuR7Ho1Q5o6Y=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-		<key>zh-Hant.lproj/IQLocalizable.strings</key>
-		<dict>
-			<key>hash</key>
-			<data>
-			U6I+uL07KIv2b77w0c0glaJlhMg=
-			</data>
-			<key>hash2</key>
-			<data>
-			14dQnjX3pEz2Um4J/fOdQDRe/LSuXxqkg1hEkO8E5ys=
-			</data>
-			<key>optional</key>
-			<true/>
-		</dict>
-	</dict>
-	<key>rules</key>
-	<dict>
-		<key>^.*</key>
-		<true/>
-		<key>^.*\.lproj/</key>
-		<dict>
-			<key>optional</key>
-			<true/>
-			<key>weight</key>
-			<real>1000</real>
-		</dict>
-		<key>^.*\.lproj/locversion.plist$</key>
-		<dict>
-			<key>omit</key>
-			<true/>
-			<key>weight</key>
-			<real>1100</real>
-		</dict>
-		<key>^Base\.lproj/</key>
-		<dict>
-			<key>weight</key>
-			<real>1010</real>
-		</dict>
-		<key>^version.plist$</key>
-		<true/>
-	</dict>
-	<key>rules2</key>
-	<dict>
-		<key>.*\.dSYM($|/)</key>
-		<dict>
-			<key>weight</key>
-			<real>11</real>
-		</dict>
-		<key>^(.*/)?\.DS_Store$</key>
-		<dict>
-			<key>omit</key>
-			<true/>
-			<key>weight</key>
-			<real>2000</real>
-		</dict>
-		<key>^.*</key>
-		<true/>
-		<key>^.*\.lproj/</key>
-		<dict>
-			<key>optional</key>
-			<true/>
-			<key>weight</key>
-			<real>1000</real>
-		</dict>
-		<key>^.*\.lproj/locversion.plist$</key>
-		<dict>
-			<key>omit</key>
-			<true/>
-			<key>weight</key>
-			<real>1100</real>
-		</dict>
-		<key>^Base\.lproj/</key>
-		<dict>
-			<key>weight</key>
-			<real>1010</real>
-		</dict>
-		<key>^Info\.plist$</key>
-		<dict>
-			<key>omit</key>
-			<true/>
-			<key>weight</key>
-			<real>20</real>
-		</dict>
-		<key>^PkgInfo$</key>
-		<dict>
-			<key>omit</key>
-			<true/>
-			<key>weight</key>
-			<real>20</real>
-		</dict>
-		<key>^embedded\.provisionprofile$</key>
-		<dict>
-			<key>weight</key>
-			<real>20</real>
-		</dict>
-		<key>^version\.plist$</key>
-		<dict>
-			<key>weight</key>
-			<real>20</real>
-		</dict>
-	</dict>
-</dict>
-</plist>

BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/ar.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/cs.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/da.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/de.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/el.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/en.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/es.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/fi.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/fr.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/he.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/hr.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/hu.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/id.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/it.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/ja.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/ko.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/ms.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/nb.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/nl.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/pl.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/pt-PT.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/pt.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/ru.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/sk.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/sv.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/th.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/tr.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/zh-Hans.lproj/IQLocalizable.strings


BIN
Dependencies/ConnectIQ 2.xcframework/ios-i386_x86_64-simulator/ConnectIQ.framework/zh-Hant.lproj/IQLocalizable.strings


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 3659
FreeAPS.xcodeproj/project.pbxproj


+ 0 - 399
FreeAPS.xcodeproj/xcshareddata/xcschemes/Trio.xcscheme

@@ -1,399 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
-   LastUpgradeVersion = "1240"
-   version = "1.3">
-   <BuildAction
-      parallelizeBuildables = "NO"
-      buildImplicitDependencies = "YES">
-      <BuildActionEntries>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "43D8FDCA1C728FDF0073BE78"
-               BuildableName = "LoopKit.framework"
-               BlueprintName = "LoopKit"
-               ReferencedContainer = "container:LoopKit/LoopKit.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "A9E6758022713F4700E25293"
-               BuildableName = "LoopKit.framework"
-               BlueprintName = "LoopKit-watchOS"
-               ReferencedContainer = "container:LoopKit/LoopKit.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "43BA7153201E484D0058961E"
-               BuildableName = "LoopKitUI.framework"
-               BlueprintName = "LoopKitUI"
-               ReferencedContainer = "container:LoopKit/LoopKit.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "892A5D33222F03CB008961AB"
-               BuildableName = "LoopTestingKit.framework"
-               BlueprintName = "LoopTestingKit"
-               ReferencedContainer = "container:LoopKit/LoopKit.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "89D2047121CC7BD7001238CC"
-               BuildableName = "MockKit.framework"
-               BlueprintName = "MockKit"
-               ReferencedContainer = "container:LoopKit/LoopKit.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "89D2048E21CC7C12001238CC"
-               BuildableName = "MockKitUI.framework"
-               BlueprintName = "MockKitUI"
-               ReferencedContainer = "container:LoopKit/LoopKit.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "C1E34B5A29C7AD01009A50A5"
-               BuildableName = "MinimedKitPlugin.loopplugin"
-               BlueprintName = "MinimedKitPlugin"
-               ReferencedContainer = "container:MinimedKit/MinimedKit.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "C124021629C7D93D00B32844"
-               BuildableName = "OmniKitPlugin.loopplugin"
-               BlueprintName = "OmniKitPlugin"
-               ReferencedContainer = "container:OmniKit/OmniKit.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "B4D40D3D23A428BC00D7ECB5"
-               BuildableName = "CGMBLEKitG5Plugin.loopplugin"
-               BlueprintName = "CGMBLEKitG5Plugin"
-               ReferencedContainer = "container:CGMBLEKit/CGMBLEKit.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "B4D40D2D23A3E91800D7ECB5"
-               BuildableName = "CGMBLEKitG6Plugin.loopplugin"
-               BlueprintName = "CGMBLEKitG6Plugin"
-               ReferencedContainer = "container:CGMBLEKit/CGMBLEKit.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "B40BF25D23ABD47400A43CEE"
-               BuildableName = "ShareClientPlugin.loopplugin"
-               BlueprintName = "ShareClientPlugin"
-               ReferencedContainer = "container:dexcom-share-client-swift/ShareClient.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "C17F511C291EACCD00555EB5"
-               BuildableName = "G7SensorPlugin.loopplugin"
-               BlueprintName = "G7SensorPlugin"
-               ReferencedContainer = "container:G7SensorKit/G7SensorKit.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "C1BDBAE72A4397E200A787D1"
-               BuildableName = "LibreDemoPlugin.loopplugin"
-               BlueprintName = "LibreDemoPlugin"
-               ReferencedContainer = "container:LibreTransmitter/LibreTransmitter.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "B40BF25D23ABD47400A43CEE"
-               BuildableName = "LibreTransmitterPlugin.loopplugin"
-               BlueprintName = "LibreTransmitterPlugin"
-               ReferencedContainer = "container:LibreTransmitter/LibreTransmitter.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "C187C196279086A8006E3557"
-               BuildableName = "OmniBLEPlugin.loopplugin"
-               BlueprintName = "OmniBLEPlugin"
-               ReferencedContainer = "container:OmniBLE/OmniBLE.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "A94AE4E3235A89B5005CA320"
-               BuildableName = "TidepoolServiceKitPlugin.loopplugin"
-               BlueprintName = "TidepoolServiceKitPlugin"
-               ReferencedContainer = "container:TidepoolService/TidepoolService.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "388E595725AD948C0019842D"
-               BuildableName = "FreeAPS.app"
-               BlueprintName = "FreeAPS"
-               ReferencedContainer = "container:FreeAPS.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-      </BuildActionEntries>
-   </BuildAction>
-   <TestAction
-      buildConfiguration = "Debug"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      shouldUseLaunchSchemeArgsEnv = "YES">
-      <Testables>
-         <TestableReference
-            skipped = "NO">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "38FCF3EC25E9028E0078B0D1"
-               BuildableName = "FreeAPSTests.xctest"
-               BlueprintName = "FreeAPSTests"
-               ReferencedContainer = "container:FreeAPS.xcodeproj">
-            </BuildableReference>
-         </TestableReference>
-         <TestableReference
-            skipped = "NO">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "43CABDFC1C3506F100005705"
-               BuildableName = "CGMBLEKitTests.xctest"
-               BlueprintName = "CGMBLEKitTests"
-               ReferencedContainer = "container:CGMBLEKit/CGMBLEKit.xcodeproj">
-            </BuildableReference>
-         </TestableReference>
-         <TestableReference
-            skipped = "NO">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "C17F50CD291EAC3800555EB5"
-               BuildableName = "G7SensorKitTests.xctest"
-               BlueprintName = "G7SensorKitTests"
-               ReferencedContainer = "container:G7SensorKit/G7SensorKit.xcodeproj">
-            </BuildableReference>
-         </TestableReference>
-         <TestableReference
-            skipped = "NO">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "43D8FDD41C728FDF0073BE78"
-               BuildableName = "LoopKitTests.xctest"
-               BlueprintName = "LoopKitTests"
-               ReferencedContainer = "container:LoopKit/LoopKit.xcodeproj">
-            </BuildableReference>
-         </TestableReference>
-         <TestableReference
-            skipped = "NO">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "B4CEE2DF257129780093111B"
-               BuildableName = "MockKitTests.xctest"
-               BlueprintName = "MockKitTests"
-               ReferencedContainer = "container:LoopKit/LoopKit.xcodeproj">
-            </BuildableReference>
-         </TestableReference>
-         <TestableReference
-            skipped = "NO">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "C13CC34029C7B73A007F25DE"
-               BuildableName = "MinimedKitTests.xctest"
-               BlueprintName = "MinimedKitTests"
-               ReferencedContainer = "container:MinimedKit/MinimedKit.xcodeproj">
-            </BuildableReference>
-         </TestableReference>
-         <TestableReference
-            skipped = "NO">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "84752E8A26ED0FFE009FD801"
-               BuildableName = "OmniBLETests.xctest"
-               BlueprintName = "OmniBLETests"
-               ReferencedContainer = "container:OmniBLE/OmniBLE.xcodeproj">
-            </BuildableReference>
-         </TestableReference>
-         <TestableReference
-            skipped = "NO">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "C12ED9C929C7DBA900435701"
-               BuildableName = "OmniKitTests.xctest"
-               BlueprintName = "OmniKitTests"
-               ReferencedContainer = "container:OmniKit/OmniKit.xcodeproj">
-            </BuildableReference>
-         </TestableReference>
-         <TestableReference
-            skipped = "NO">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "431CE7761F98564200255374"
-               BuildableName = "RileyLinkBLEKitTests.xctest"
-               BlueprintName = "RileyLinkBLEKitTests"
-               ReferencedContainer = "container:RileyLinkKit/RileyLinkKit.xcodeproj">
-            </BuildableReference>
-         </TestableReference>
-      </Testables>
-   </TestAction>
-   <LaunchAction
-      buildConfiguration = "Debug"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      launchStyle = "0"
-      useCustomWorkingDirectory = "NO"
-      ignoresPersistentStateOnLaunch = "NO"
-      debugDocumentVersioning = "YES"
-      debugServiceExtension = "internal"
-      allowLocationSimulation = "YES">
-      <BuildableProductRunnable
-         runnableDebuggingMode = "0">
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "388E595725AD948C0019842D"
-            BuildableName = "FreeAPS.app"
-            BlueprintName = "FreeAPS"
-            ReferencedContainer = "container:FreeAPS.xcodeproj">
-         </BuildableReference>
-      </BuildableProductRunnable>
-      <EnvironmentVariables>
-         <EnvironmentVariable
-            key = "CG_NUMERICS_SHOW_BACKTRACE"
-            value = ""
-            isEnabled = "YES">
-         </EnvironmentVariable>
-      </EnvironmentVariables>
-   </LaunchAction>
-   <ProfileAction
-      buildConfiguration = "Release"
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      savedToolIdentifier = ""
-      useCustomWorkingDirectory = "NO"
-      debugDocumentVersioning = "YES">
-      <BuildableProductRunnable
-         runnableDebuggingMode = "0">
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "388E595725AD948C0019842D"
-            BuildableName = "FreeAPS.app"
-            BlueprintName = "FreeAPS"
-            ReferencedContainer = "container:FreeAPS.xcodeproj">
-         </BuildableReference>
-      </BuildableProductRunnable>
-   </ProfileAction>
-   <AnalyzeAction
-      buildConfiguration = "Debug">
-   </AnalyzeAction>
-   <ArchiveAction
-      buildConfiguration = "Release"
-      revealArchiveInOrganizer = "YES">
-   </ArchiveAction>
-</Scheme>

+ 0 - 93
FreeAPS.xcodeproj/xcshareddata/xcschemes/Trio_WatchApp.xcscheme

@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
-   LastUpgradeVersion = "1320"
-   version = "1.3">
-   <BuildAction
-      parallelizeBuildables = "YES"
-      buildImplicitDependencies = "YES">
-      <BuildActionEntries>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "38E8751B27554D5500975559"
-               BuildableName = "FreeAPSWatch.app"
-               BlueprintName = "FreeAPSWatch"
-               ReferencedContainer = "container:FreeAPS.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "388E595725AD948C0019842D"
-               BuildableName = "FreeAPS.app"
-               BlueprintName = "FreeAPS"
-               ReferencedContainer = "container:FreeAPS.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-      </BuildActionEntries>
-   </BuildAction>
-   <TestAction
-      buildConfiguration = "Debug"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      shouldUseLaunchSchemeArgsEnv = "YES">
-      <Testables>
-      </Testables>
-   </TestAction>
-   <LaunchAction
-      buildConfiguration = "Debug"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      launchStyle = "0"
-      useCustomWorkingDirectory = "NO"
-      ignoresPersistentStateOnLaunch = "NO"
-      debugDocumentVersioning = "YES"
-      debugServiceExtension = "internal"
-      allowLocationSimulation = "YES"
-      notificationPayloadFile = "FreeAPSWatch WatchKit Extension/PushNotificationPayload.apns">
-      <BuildableProductRunnable
-         runnableDebuggingMode = "0">
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "38E8751B27554D5500975559"
-            BuildableName = "FreeAPSWatch.app"
-            BlueprintName = "FreeAPSWatch"
-            ReferencedContainer = "container:FreeAPS.xcodeproj">
-         </BuildableReference>
-      </BuildableProductRunnable>
-   </LaunchAction>
-   <ProfileAction
-      buildConfiguration = "Release"
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      savedToolIdentifier = ""
-      useCustomWorkingDirectory = "NO"
-      debugDocumentVersioning = "YES">
-      <BuildableProductRunnable
-         runnableDebuggingMode = "0">
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "38E8751B27554D5500975559"
-            BuildableName = "FreeAPSWatch.app"
-            BlueprintName = "FreeAPSWatch"
-            ReferencedContainer = "container:FreeAPS.xcodeproj">
-         </BuildableReference>
-      </BuildableProductRunnable>
-   </ProfileAction>
-   <AnalyzeAction
-      buildConfiguration = "Debug">
-   </AnalyzeAction>
-   <ArchiveAction
-      buildConfiguration = "Release"
-      revealArchiveInOrganizer = "YES">
-   </ArchiveAction>
-</Scheme>

+ 0 - 38
FreeAPS/Resources/Assets.xcassets/Colors/Basal.colorset/Contents.json

@@ -1,38 +0,0 @@
-{
-  "colors" : [
-    {
-      "color" : {
-        "color-space" : "srgb",
-        "components" : {
-          "alpha" : "0.500",
-          "blue" : "0.988",
-          "green" : "0.588",
-          "red" : "0.118"
-        }
-      },
-      "idiom" : "universal"
-    },
-    {
-      "appearances" : [
-        {
-          "appearance" : "luminosity",
-          "value" : "dark"
-        }
-      ],
-      "color" : {
-        "color-space" : "srgb",
-        "components" : {
-          "alpha" : "0.500",
-          "blue" : "0.988",
-          "green" : "0.588",
-          "red" : "0.118"
-        }
-      },
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

+ 0 - 38
FreeAPS/Resources/Assets.xcassets/Colors/DarkerBlue.colorset/Contents.json

@@ -1,38 +0,0 @@
-{
-  "colors" : [
-    {
-      "color" : {
-        "color-space" : "srgb",
-        "components" : {
-          "alpha" : "1.000",
-          "blue" : "1.000",
-          "green" : "0.288",
-          "red" : "0.118"
-        }
-      },
-      "idiom" : "universal"
-    },
-    {
-      "appearances" : [
-        {
-          "appearance" : "luminosity",
-          "value" : "dark"
-        }
-      ],
-      "color" : {
-        "color-space" : "srgb",
-        "components" : {
-          "alpha" : "1.000",
-          "blue" : "1.000",
-          "green" : "0.288",
-          "red" : "0.118"
-        }
-      },
-      "idiom" : "universal"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

+ 0 - 0
FreeAPS/Resources/Assets.xcassets/Colors/Insulin.colorset/Contents.json


Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff