[
  {
    "path": "README-ANDROID.txt",
    "content": "Important information for Android Examples users\n================================================\n\nPebble Android examples are built and easier to run with Android Studio. If you\nprefer to use Eclipse, follow the instructions below to import the examples and\nadd the PebbleKit library.\n\n## Opening Android Examples with Android Studio\n\n - Open 'Android Studio'\n - Select 'Open project' in the start menu (or the main menu)\n - Select one of the Android examples (e.g.: weather-demo/WeatherDemo-Android)\n - Click \"Open\"\n\nAndroid Studio will automatically download the PebbleKit library. You can now\nbuild and run the project.\n\n## Opening Android Examples with Eclipse ADT (Android Developer Tools)\n\nTo import one of Pebble Android examples in Eclipse:\n\n - Open Eclipse\n - Select File -> Import... -> Android / Existing Android Code Into Workspace\n - Click on 'Browse' next to 'Root Directory' and select the root of one of the\n   Android examples For example: weather-demo/WeatherDemo-Android\n - Click \"Finish\"\n\nWith Eclipse, you must manually download the PebbleKit Android for Eclipse\nlibrary and add it to the project.\n\nThe most up to date version will always be available from GitHub:\nhttps://github.com/pebble/pebblekit-android\n\nDownload the 'pebblekit-2.x.x-eclipse.jar' file and:\n\n - Create a \"libs\" folder in ExampleName-Android/app/src/main/\n - Add the file in this folder\n - Refresh the project in Eclipse\n\nFinally, Eclipse cannot import Android Studio projects properly and you will\nneed to manually fix the list of source folder:\n\n - Right click on the project and select Properties\n - Open \"Java Build Path\"\n - In the Source tab, click \"Add Folder\", select the checkbox next to \"java\" and\n   click Ok twice to go back to the project.\n\nThat's it! You can now build and run the project.\n\n## Documentation and Support\n\nFull documentation is available on Pebble developer website:\nhttp://developer.getpebble.com/guides/mobile-apps/android/\n\nWe would love to hear your questions and feedbacks on those examples, you can\ncontact us at: devsupport@getpebble.com.\n"
  },
  {
    "path": "README.md",
    "content": "## Pebble Smartwatch SDK Examples\n\n### This repository has been deprecated and will no longer be updated. Head over to [pebble-examples](https://github.com/pebble-examples) for official example repositories that can be individually imported to CloudPebble with ease.\n\nTo learn more about the Pebble SDK visit <https://developer.getpebble.com/>.\n\n## License\n\nAll the examples are released under the MIT License. Please \n[contact us](mailto:devsupport@getpebble.com) if you would like to use another \nlicense.\n\n    Copyright (C) 2013 Pebble Technology\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to\n    deal in the Software without restriction, including without limitation the\n    rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n    sell copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in\n    all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n    IN THE SOFTWARE."
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/.gitignore",
    "content": "bin/\ngen/\nlocal.properties\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/.idea/.name",
    "content": "OceanSurveyDemo-Android"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/.idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <option name=\"DEFAULT_COMPILER\" value=\"Javac\" />\n    <resourceExtensions />\n    <wildcardResourcePatterns>\n      <entry name=\"!?*.java\" />\n      <entry name=\"!?*.form\" />\n      <entry name=\"!?*.class\" />\n      <entry name=\"!?*.groovy\" />\n      <entry name=\"!?*.scala\" />\n      <entry name=\"!?*.flex\" />\n      <entry name=\"!?*.kt\" />\n      <entry name=\"!?*.clj\" />\n    </wildcardResourcePatterns>\n    <annotationProcessing>\n      <profile default=\"true\" name=\"Default\" enabled=\"false\">\n        <processorPath useClasspath=\"true\" />\n      </profile>\n    </annotationProcessing>\n  </component>\n</project>\n\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/.idea/copyright/profiles_settings.xml",
    "content": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/.idea/encodings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\" useUTFGuessing=\"true\" native2AsciiForPropertiesFiles=\"false\" />\n</project>\n\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/.idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"gradleHome\" value=\"/usr/local/bin/gradle\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n          </set>\n        </option>\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>\n\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/.idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"DaemonCodeAnalyzer\">\n    <disable_hints />\n  </component>\n  <component name=\"ProjectInspectionProfilesVisibleTreeState\">\n    <entry key=\"Project Default\">\n      <profile-state>\n        <expanded-state>\n          <State>\n            <id />\n          </State>\n        </expanded-state>\n        <selected-state>\n          <State>\n            <id>Spelling</id>\n          </State>\n        </selected-state>\n      </profile-state>\n    </entry>\n  </component>\n  <component name=\"ProjectLevelVcsManager\" settingsEditedManually=\"false\">\n    <OptionsSetting value=\"true\" id=\"Add\" />\n    <OptionsSetting value=\"true\" id=\"Remove\" />\n    <OptionsSetting value=\"true\" id=\"Checkout\" />\n    <OptionsSetting value=\"true\" id=\"Update\" />\n    <OptionsSetting value=\"true\" id=\"Status\" />\n    <OptionsSetting value=\"true\" id=\"Edit\" />\n    <ConfirmationsSetting value=\"0\" id=\"Add\" />\n    <ConfirmationsSetting value=\"0\" id=\"Remove\" />\n  </component>\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_1_6\" assert-keyword=\"true\" jdk-15=\"true\" project-jdk-name=\"1.7\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"RunManager\">\n    <configuration default=\"true\" type=\"Remote\" factoryName=\"Remote\">\n      <option name=\"USE_SOCKET_TRANSPORT\" value=\"true\" />\n      <option name=\"SERVER_MODE\" value=\"false\" />\n      <option name=\"SHMEM_ADDRESS\" value=\"javadebug\" />\n      <option name=\"HOST\" value=\"localhost\" />\n      <option name=\"PORT\" value=\"5005\" />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"TestNG\" factoryName=\"TestNG\">\n      <module name=\"\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"SUITE_NAME\" />\n      <option name=\"PACKAGE_NAME\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"METHOD_NAME\" />\n      <option name=\"GROUP_NAME\" />\n      <option name=\"TEST_OBJECT\" value=\"CLASS\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$PROJECT_DIR$\" />\n      <option name=\"OUTPUT_DIRECTORY\" />\n      <option name=\"ANNOTATION_TYPE\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"moduleWithDependencies\" />\n      </option>\n      <option name=\"USE_DEFAULT_REPORTERS\" value=\"false\" />\n      <option name=\"PROPERTIES_FILE\" />\n      <envs />\n      <properties />\n      <listeners />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"Application\" factoryName=\"Application\">\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"VM_PARAMETERS\" />\n      <option name=\"PROGRAM_PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$PROJECT_DIR$\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"ENABLE_SWING_INSPECTOR\" value=\"false\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <module name=\"\" />\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"JUnit\" factoryName=\"JUnit\">\n      <module name=\"\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"PACKAGE_NAME\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"METHOD_NAME\" />\n      <option name=\"TEST_OBJECT\" value=\"class\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$PROJECT_DIR$\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"moduleWithDependencies\" />\n      </option>\n      <envs />\n      <patterns />\n      <method />\n    </configuration>\n    <list size=\"0\" />\n    <configuration name=\"&lt;template&gt;\" type=\"#org.jetbrains.idea.devkit.run.PluginConfigurationType\" default=\"true\" selected=\"false\">\n      <option name=\"VM_PARAMETERS\" value=\"-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea\" />\n    </configuration>\n    <configuration name=\"&lt;template&gt;\" type=\"WebApp\" default=\"true\" selected=\"false\">\n      <Host>localhost</Host>\n      <Port>5050</Port>\n    </configuration>\n  </component>\n  <component name=\"masterDetails\">\n    <states>\n      <state key=\"ProjectJDKs.UI\">\n        <settings>\n          <last-edited>Android API 10 Platform</last-edited>\n          <splitter-proportions>\n            <option name=\"proportions\">\n              <list>\n                <option value=\"0.2\" />\n              </list>\n            </option>\n          </splitter-proportions>\n        </settings>\n      </state>\n    </states>\n  </component>\n</project>\n\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/.idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/OceanSurveyDemo-Android.iml\" filepath=\"$PROJECT_DIR$/OceanSurveyDemo-Android.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/app/app.iml\" filepath=\"$PROJECT_DIR$/app/app.iml\" />\n    </modules>\n  </component>\n</project>\n\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/.idea/scopes/scope_settings.xml",
    "content": "<component name=\"DependencyValidationManager\">\n  <state>\n    <option name=\"SKIP_IMPORT_STATEMENTS\" value=\"false\" />\n  </state>\n</component>"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/.idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"\" vcs=\"\" />\n    <mapping directory=\"$PROJECT_DIR$/../..\" vcs=\"Git\" />\n  </component>\n</project>\n\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/.idea/workspace.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ChangeListManager\">\n    <list default=\"true\" id=\"f054e40e-d9b9-41e4-bd6f-98fd9aaaf432\" name=\"Default\" comment=\"\" />\n    <ignored path=\"OceanSurveyDemo-Android.iws\" />\n    <ignored path=\".idea/workspace.xml\" />\n    <option name=\"TRACKING_ENABLED\" value=\"true\" />\n    <option name=\"SHOW_DIALOG\" value=\"false\" />\n    <option name=\"HIGHLIGHT_CONFLICTS\" value=\"true\" />\n    <option name=\"HIGHLIGHT_NON_ACTIVE_CHANGELIST\" value=\"false\" />\n    <option name=\"LAST_RESOLUTION\" value=\"IGNORE\" />\n  </component>\n  <component name=\"ChangesViewManager\" flattened_view=\"true\" show_ignored=\"false\" />\n  <component name=\"CreatePatchCommitExecutor\">\n    <option name=\"PATCH_PATH\" value=\"\" />\n  </component>\n  <component name=\"DaemonCodeAnalyzer\">\n    <disable_hints />\n  </component>\n  <component name=\"FavoritesManager\">\n    <favorites_list name=\"OceanSurveyDemo-Android\" />\n  </component>\n  <component name=\"Git.Settings\">\n    <option name=\"RECENT_GIT_ROOT_PATH\" value=\"$PROJECT_DIR$/../..\" />\n  </component>\n  <component name=\"ProjectFrameBounds\">\n    <option name=\"y\" value=\"23\" />\n    <option name=\"width\" value=\"1440\" />\n    <option name=\"height\" value=\"832\" />\n  </component>\n  <component name=\"ProjectLevelVcsManager\" settingsEditedManually=\"false\">\n    <OptionsSetting value=\"true\" id=\"Add\" />\n    <OptionsSetting value=\"true\" id=\"Remove\" />\n    <OptionsSetting value=\"true\" id=\"Checkout\" />\n    <OptionsSetting value=\"true\" id=\"Update\" />\n    <OptionsSetting value=\"true\" id=\"Status\" />\n    <OptionsSetting value=\"true\" id=\"Edit\" />\n    <ConfirmationsSetting value=\"0\" id=\"Add\" />\n    <ConfirmationsSetting value=\"0\" id=\"Remove\" />\n  </component>\n  <component name=\"ProjectReloadState\">\n    <option name=\"STATE\" value=\"0\" />\n  </component>\n  <component name=\"PropertiesComponent\">\n    <property name=\"GoToClass.includeLibraries\" value=\"false\" />\n    <property name=\"GoToClass.toSaveIncludeLibraries\" value=\"false\" />\n    <property name=\"GoToFile.includeJavaFiles\" value=\"false\" />\n    <property name=\"MemberChooser.sorted\" value=\"false\" />\n    <property name=\"MemberChooser.showClasses\" value=\"true\" />\n    <property name=\"MemberChooser.copyJavadoc\" value=\"false\" />\n    <property name=\"FullScreen\" value=\"false\" />\n  </component>\n  <component name=\"RunManager\">\n    <configuration default=\"true\" type=\"Remote\" factoryName=\"Remote\">\n      <option name=\"USE_SOCKET_TRANSPORT\" value=\"true\" />\n      <option name=\"SERVER_MODE\" value=\"false\" />\n      <option name=\"SHMEM_ADDRESS\" value=\"javadebug\" />\n      <option name=\"HOST\" value=\"localhost\" />\n      <option name=\"PORT\" value=\"5005\" />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"TestNG\" factoryName=\"TestNG\">\n      <module name=\"\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"SUITE_NAME\" />\n      <option name=\"PACKAGE_NAME\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"METHOD_NAME\" />\n      <option name=\"GROUP_NAME\" />\n      <option name=\"TEST_OBJECT\" value=\"CLASS\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$PROJECT_DIR$\" />\n      <option name=\"OUTPUT_DIRECTORY\" />\n      <option name=\"ANNOTATION_TYPE\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"moduleWithDependencies\" />\n      </option>\n      <option name=\"USE_DEFAULT_REPORTERS\" value=\"false\" />\n      <option name=\"PROPERTIES_FILE\" />\n      <envs />\n      <properties />\n      <listeners />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"Application\" factoryName=\"Application\">\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"VM_PARAMETERS\" />\n      <option name=\"PROGRAM_PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$PROJECT_DIR$\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"ENABLE_SWING_INSPECTOR\" value=\"false\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <module name=\"\" />\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"JUnit\" factoryName=\"JUnit\">\n      <module name=\"\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"PACKAGE_NAME\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"METHOD_NAME\" />\n      <option name=\"TEST_OBJECT\" value=\"class\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$PROJECT_DIR$\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"moduleWithDependencies\" />\n      </option>\n      <envs />\n      <patterns />\n      <method />\n    </configuration>\n    <list size=\"0\" />\n    <configuration name=\"&lt;template&gt;\" type=\"Applet\" default=\"true\" selected=\"false\">\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"HTML_FILE_NAME\" />\n      <option name=\"HTML_USED\" value=\"false\" />\n      <option name=\"WIDTH\" value=\"400\" />\n      <option name=\"HEIGHT\" value=\"300\" />\n      <option name=\"POLICY_FILE\" value=\"$APPLICATION_HOME_DIR$/bin/appletviewer.policy\" />\n      <option name=\"VM_PARAMETERS\" />\n    </configuration>\n    <configuration name=\"&lt;template&gt;\" type=\"#org.jetbrains.idea.devkit.run.PluginConfigurationType\" default=\"true\" selected=\"false\">\n      <option name=\"VM_PARAMETERS\" value=\"-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea\" />\n    </configuration>\n    <configuration name=\"&lt;template&gt;\" type=\"WebApp\" default=\"true\" selected=\"false\">\n      <Host>localhost</Host>\n      <Port>5050</Port>\n    </configuration>\n  </component>\n  <component name=\"ShelveChangesManager\" show_recycled=\"false\" />\n  <component name=\"SvnConfiguration\">\n    <configuration />\n  </component>\n  <component name=\"TaskManager\">\n    <task active=\"true\" id=\"Default\" summary=\"Default task\">\n      <changelist id=\"f054e40e-d9b9-41e4-bd6f-98fd9aaaf432\" name=\"Default\" comment=\"\" />\n      <created>1415694126178</created>\n      <updated>1415694126178</updated>\n    </task>\n    <servers />\n  </component>\n  <component name=\"ToolWindowManager\">\n    <frame x=\"0\" y=\"23\" width=\"1440\" height=\"832\" extended-state=\"6\" />\n    <editor active=\"false\" />\n    <layout>\n      <window_info id=\"Palette&#9;\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Changes\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Designer\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Palette\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Terminal\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Debug\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.4\" sideWeight=\"0.5\" order=\"3\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Event Log\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Favorites\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Version Control\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Gradle Console\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Build Variants\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Messages\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Android\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Gradle\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"TODO\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"6\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Structure\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.25\" sideWeight=\"0.5\" order=\"1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Maven Projects\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Commander\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"SLIDING\" type=\"SLIDING\" visible=\"false\" weight=\"0.4\" sideWeight=\"0.5\" order=\"0\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Project\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.25\" sideWeight=\"0.5\" order=\"0\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Run\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"2\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Memory Monitor\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"-1\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Cvs\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.25\" sideWeight=\"0.5\" order=\"4\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Message\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"0\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Find\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Ant Build\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.25\" sideWeight=\"0.5\" order=\"1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Inspection\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.4\" sideWeight=\"0.5\" order=\"5\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Hierarchy\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.25\" sideWeight=\"0.5\" order=\"2\" side_tool=\"false\" content_ui=\"combo\" />\n    </layout>\n  </component>\n  <component name=\"Vcs.Log.UiProperties\">\n    <option name=\"RECENTLY_FILTERED_USER_GROUPS\">\n      <collection />\n    </option>\n    <option name=\"RECENTLY_FILTERED_BRANCH_GROUPS\">\n      <collection />\n    </option>\n  </component>\n  <component name=\"VcsContentAnnotationSettings\">\n    <option name=\"myLimit\" value=\"2678400000\" />\n  </component>\n  <component name=\"VcsManagerConfiguration\">\n    <option name=\"myTodoPanelSettings\">\n      <TodoPanelSettings />\n    </option>\n  </component>\n  <component name=\"XDebuggerManager\">\n    <breakpoint-manager />\n  </component>\n</project>\n\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/.project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>Ocean Survey</name>\n\t<comment></comment>\n\t<projects>\n\t</projects>\n\t<buildSpec>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.jdt.core.javabuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.ApkBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t</buildSpec>\n\t<natures>\n\t\t<nature>com.android.ide.eclipse.adt.AndroidNature</nature>\n\t\t<nature>org.eclipse.jdt.core.javanature</nature>\n\t</natures>\n</projectDescription>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tpackage=\"com.getpebble.example.logging\" android:versionCode=\"13\"\n\tandroid:versionName=\"0.2\">\n\n\n\t<uses-sdk android:minSdkVersion=\"9\" android:targetSdkVersion=\"17\" />\n\n\t<application android:allowBackup=\"true\" android:icon=\"@drawable/ic_launcher\"\n\t\tandroid:label=\"@string/app_name\" android:theme=\"@style/AppTheme\">\n\t\t<activity android:name=\".ExampleDataLoggingActivity\"\n\t\t\tandroid:label=\"@string/app_name\" \n\t\t\tandroid:screenOrientation=\"nosensor\"\n            android:launchMode=\"singleTask\">\n\t\t\t<intent-filter>\n\t\t\t\t<action android:name=\"android.intent.action.MAIN\" />\n\t\t\t\t<category android:name=\"android.intent.category.LAUNCHER\" />\n\t\t\t</intent-filter>\n\n\t\t\t<intent-filter>\n\t\t\t    <action android:name=\"android.intent.action.SEND\" />\n        \t\t<category android:name=\"android.intent.category.DEFAULT\" />\n\t\t\t</intent-filter>\n\n\t\t</activity>\n\n\t\t\n\t</application>\n</manifest>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/OceanSurveyDemo-Android.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.path=\"$MODULE_DIR$\" external.root.project.path=\"$MODULE_DIR$\" external.system.id=\"GRADLE\" external.system.module.group=\"\" external.system.module.version=\"unspecified\" type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"FacetManager\">\n    <facet type=\"java-gradle\" name=\"Java-Gradle\">\n      <configuration>\n        <option name=\"BUILD_FOLDER_PATH\" value=\"$MODULE_DIR$/build\" />\n      </configuration>\n    </facet>\n  </component>\n  <component name=\"NewModuleRootManager\" inherit-compiler-output=\"true\">\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$\">\n      <excludeFolder url=\"file://$MODULE_DIR$/.gradle\" />\n    </content>\n    <orderEntry type=\"inheritedJdk\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n  </component>\n</module>\n\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/README.md",
    "content": "# Ocean Surveying\n\nAn example Android application that exercises the data spooling APIs of `PebbleKit`.\n\n## Dependencies\n\n1. Android SDK (http://developer.android.com/sdk/index.html)\n1. PebbleKit-Android, which targets Android API 10 by default\n1. Google Guava (https://code.google.com/p/guava-libraries/), included in `libs/`\n\n## Building the APK\n\nApache Ant may be used to build the example application from the command line.\nFor information, see the Android documentation on [building from the command line](http://developer.android.com/tools/building/building-cmdline.html).\n\nTo build this example application outside the directory structure of `pebblesdk-examples`, you may need to update the relative path of the `PebbleKit-Android` directory.\nTo do this, use the android command line tools to update the build scripts, indicating the new relative path to the\nPebbleKit directory.\nFor example, to compile this example application in its default location in the `pebblesdk-examples` repository:\n\n    rm project.properties; android update project --path ./ --library ../../../PebbleKit-Android/PebbleKit\n\nTo build and deploy a debug APK using Apache Ant:\n\n    ant clean debug install\n\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/ant.properties",
    "content": "# This file is used to override default values used by the Ant build system.\n#\n# This file must be checked into Version Control Systems, as it is\n# integral to the build system of your project.\n\n# This file is only used by the Ant script.\n\n# You can use this to override default values such as\n#  'source.dir' for the location of your java source folder and\n#  'out.dir' for the location of your output folder.\n\n# You can also use it define how the release builds are signed by declaring\n# the following properties:\n#  'key.store' for the location of your keystore and\n#  'key.alias' for the name of the key to use.\n# The password will be asked during the build when you use the 'release' target.\n\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/app/app.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.path=\"$MODULE_DIR$\" external.root.project.path=\"$MODULE_DIR$/..\" external.system.id=\"GRADLE\" external.system.module.group=\"OceanSurveyDemo-Android\" external.system.module.version=\"unspecified\" type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"FacetManager\">\n    <facet type=\"android-gradle\" name=\"Android-Gradle\">\n      <configuration>\n        <option name=\"GRADLE_PROJECT_PATH\" value=\":app\" />\n      </configuration>\n    </facet>\n    <facet type=\"android\" name=\"Android\">\n      <configuration>\n        <option name=\"SELECTED_BUILD_VARIANT\" value=\"debug\" />\n        <option name=\"SELECTED_TEST_ARTIFACT\" value=\"_android_test_\" />\n        <option name=\"ASSEMBLE_TASK_NAME\" value=\"assembleDebug\" />\n        <option name=\"COMPILE_JAVA_TASK_NAME\" value=\"compileDebugSources\" />\n        <option name=\"ASSEMBLE_TEST_TASK_NAME\" value=\"assembleDebugTest\" />\n        <option name=\"SOURCE_GEN_TASK_NAME\" value=\"generateDebugSources\" />\n        <option name=\"TEST_SOURCE_GEN_TASK_NAME\" value=\"generateDebugTestSources\" />\n        <option name=\"ALLOW_USER_CONFIGURATION\" value=\"false\" />\n        <option name=\"MANIFEST_FILE_RELATIVE_PATH\" value=\"/src/main/AndroidManifest.xml\" />\n        <option name=\"RES_FOLDER_RELATIVE_PATH\" value=\"/src/main/res\" />\n        <option name=\"RES_FOLDERS_RELATIVE_PATH\" value=\"file://$MODULE_DIR$/src/main/res\" />\n        <option name=\"ASSETS_FOLDER_RELATIVE_PATH\" value=\"/src/main/assets\" />\n      </configuration>\n    </facet>\n  </component>\n  <component name=\"NewModuleRootManager\" inherit-compiler-output=\"false\">\n    <output url=\"file://$MODULE_DIR$/build/intermediates/classes/debug\" />\n    <output-test url=\"file://$MODULE_DIR$/build/intermediates/classes/test/debug\" />\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$\">\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/r/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/aidl/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/buildConfig/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/rs/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/res/rs/debug\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/res/generated/debug\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/r/test/debug\" isTestSource=\"true\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/aidl/test/debug\" isTestSource=\"true\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/buildConfig/test/debug\" isTestSource=\"true\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/rs/test/debug\" isTestSource=\"true\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/res/rs/test/debug\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/res/generated/test/debug\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/res\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/resources\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/assets\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/aidl\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/java\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/jni\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/rs\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/res\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/resources\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/assets\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/aidl\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/java\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/jni\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/rs\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/res\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/resources\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/assets\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/aidl\" isTestSource=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/java\" isTestSource=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/jni\" isTestSource=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/rs\" isTestSource=\"true\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/assets\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/bundles\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/classes\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/dependency-cache\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/dex\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/dex-cache\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/incremental\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/jacoco\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/javaResources\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/libs\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/lint\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/manifests\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/ndk\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/pre-dexed\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/proguard\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/res\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/rs\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/symbols\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/outputs\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/tmp\" />\n    </content>\n    <orderEntry type=\"jdk\" jdkName=\"Android API 17 Platform\" jdkType=\"Android SDK\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n    <orderEntry type=\"library\" exported=\"\" name=\"pebblekit-2.6.0\" level=\"project\" />\n    <orderEntry type=\"library\" exported=\"\" name=\"support-v4-r7\" level=\"project\" />\n  </component>\n</module>\n\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nrepositories {\n    mavenCentral()\n    maven { url \"https://oss.sonatype.org/content/groups/public/\" }\n}\n\nandroid {\n    compileSdkVersion 17\n    buildToolsVersion '20.0.0'\n\n    defaultConfig {\n        applicationId \"com.example.pebblekit.datalogging\"\n        minSdkVersion 14\n        targetSdkVersion 17\n    }\n\n    lintOptions {\n        abortOnError false\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'\n        }\n    }\n}\n\ndependencies {\n    compile 'com.getpebble:pebblekit:2.6.0'\n    compile 'com.google.android:support-v4:r7@jar'\n}\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/app/src/main/.classpath",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<classpath>\n\t<classpathentry kind=\"src\" path=\"src\"/>\n\t<classpathentry kind=\"src\" path=\"java\"/>\n\t<classpathentry kind=\"src\" path=\"gen\"/>\n\t<classpathentry kind=\"con\" path=\"com.android.ide.eclipse.adt.ANDROID_FRAMEWORK\"/>\n\t<classpathentry exported=\"true\" kind=\"con\" path=\"com.android.ide.eclipse.adt.LIBRARIES\"/>\n\t<classpathentry exported=\"true\" kind=\"con\" path=\"com.android.ide.eclipse.adt.DEPENDENCIES\"/>\n\t<classpathentry kind=\"output\" path=\"bin/classes\"/>\n</classpath>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/app/src/main/.project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>ExampleDataLoggingActivity</name>\n\t<comment></comment>\n\t<projects>\n\t</projects>\n\t<buildSpec>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.jdt.core.javabuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.ApkBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t</buildSpec>\n\t<natures>\n\t\t<nature>com.android.ide.eclipse.adt.AndroidNature</nature>\n\t\t<nature>org.eclipse.jdt.core.javanature</nature>\n\t</natures>\n</projectDescription>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/app/src/main/.settings/org.eclipse.jdt.core.prefs",
    "content": "eclipse.preferences.version=1\norg.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6\norg.eclipse.jdt.core.compiler.compliance=1.6\norg.eclipse.jdt.core.compiler.source=1.6\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.example.PebbleKitExample\"\n  android:versionCode=\"1\"\n  android:versionName=\"1.0\">\n\n  <uses-permission android:name=\"android.permission.INTERNET\" />\n  />\n  \n  <application android:label=\"@string/app_name\">\n\n      <activity android:name=\".ExampleDataLoggingActivity\"\n          android:label=\"@string/app_name\"\n          android:screenOrientation=\"nosensor\"\n          android:launchMode=\"singleTask\">\n          <intent-filter>\n              <action android:name=\"android.intent.action.MAIN\" />\n              <category android:name=\"android.intent.category.LAUNCHER\" />\n          </intent-filter>\n\n          <intent-filter>\n              <action android:name=\"android.intent.action.SEND\" />\n              <category android:name=\"android.intent.category.DEFAULT\" />\n          </intent-filter>\n\n      </activity>\n\n  </application>\n</manifest> \n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/app/src/main/java/com/example/PebbleKitExample/ExampleDataLoggingActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.widget.TextView;\nimport com.getpebble.android.kit.PebbleKit;\n\nimport java.text.DateFormat;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.TimeZone;\nimport java.util.UUID;\n\n/**\n * Sample code demonstrating how Android applications can receive data logs from Pebble.\n */\npublic class ExampleDataLoggingActivity extends Activity {\n    private static final UUID OCEAN_SURVEY_APP_UUID = UUID.fromString(\"0A5399d9-5693-4F3E-B768-9C99B5F5DCEA\");\n    private static final DateFormat DATE_FORMAT = new SimpleDateFormat(\"HH:mm:ss\");\n\n    private final StringBuilder mDisplayText = new StringBuilder();\n\n    private PebbleKit.PebbleDataLogReceiver mDataLogReceiver = null;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_counter);\n        DATE_FORMAT.setTimeZone(TimeZone.getDefault());\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n        if (mDataLogReceiver != null) {\n            unregisterReceiver(mDataLogReceiver);\n            mDataLogReceiver = null;\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        final Handler handler = new Handler();\n\n        // To receive data logs, Android applications must register a \"DataLogReceiver\" to receive data.\n        //\n        // In this example, we're implementing a handler to receive unsigned integer data that was logged by a\n        // corresponding watch-app. In the watch-app, three separate logs were created, one per animal. Each log was\n        // tagged with a key indicating the animal to which the data corresponds. So, the tag will be used here to\n        // look up the animal name when data is received.\n        //\n        // The data being received contains the seconds since the epoch (a timestamp) of when an ocean faring animal\n        // was sighted. The \"timestamp\" indicates when the log was first created, and will not be used in this example.\n        mDataLogReceiver = new PebbleKit.PebbleDataLogReceiver(OCEAN_SURVEY_APP_UUID) {\n            @Override\n            public void receiveData(Context context, UUID logUuid, Long timestamp, Long tag,\n                                    Long secondsSinceEpoch) {\n                mDisplayText.append(\"\\n\");\n                mDisplayText.append(getLongAsTimestamp(secondsSinceEpoch));\n                mDisplayText.append(\": Saw a \");\n                mDisplayText.append(AnimalName.fromInt(tag.intValue()).getName());\n\n                handler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        updateUi();\n                    }\n                });\n            }\n        };\n\n        PebbleKit.registerDataLogReceiver(this, mDataLogReceiver);\n\n        PebbleKit.requestDataLogsForApp(this, OCEAN_SURVEY_APP_UUID);\n    }\n\n    private void updateUi() {\n        TextView textView = (TextView) findViewById(R.id.log_data_text_view);\n        textView.setText(mDisplayText.toString());\n    }\n\n    private String getLongAsTimestamp(Long l) {\n        return DATE_FORMAT.format(new Date(l.longValue() * 1000L)).toString();\n    }\n\n    private static enum AnimalName {\n        SEALION(0x5),\n        DOLPHIN(0xd),\n        PELICAN(0xb),\n        UNKNOWN(0xff);\n\n        public final int id;\n\n        private AnimalName(final int id) {\n            this.id = id;\n        }\n\n        public static AnimalName fromInt(final int id) {\n            for (AnimalName animal : values()) {\n                if (animal.id == id) {\n                    return animal;\n                }\n            }\n            return UNKNOWN;\n        }\n\n        public String getName() {\n            return name().toLowerCase();\n        }\n    }\n}\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/app/src/main/project.properties",
    "content": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# This file must be checked in Version Control Systems.\n#\n# To customize properties used by the Ant build system edit\n# \"ant.properties\", and override values to adapt the script to your\n# project structure.\n#\n# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):\n#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt\n\n# Project target.\ntarget=android-14\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/app/src/main/res/layout/activity_counter.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\"\n    tools:context=\".Example_Counter\" >\n\n    <EditText\n        android:id=\"@+id/log_data_text_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:clickable=\"false\"\n        android:cursorVisible=\"false\"\n        android:ems=\"10\"\n        android:focusable=\"false\"\n        android:focusableInTouchMode=\"false\" >\n\n        <requestFocus />\n    </EditText>\n\n</RelativeLayout>"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/app/src/main/res/menu/counter.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <item\n        android:id=\"@+id/action_settings\"\n        android:orderInCategory=\"100\"\n        android:title=\"@string/action_settings\"/>\n\n</menu>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/app/src/main/res/values/dimens.xml",
    "content": "<resources>\n\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n\n</resources>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"app_name\">Data Logging Demo</string>\n    <string name=\"action_settings\">Settings</string>\n\n</resources>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme, dependent on API level. This theme is replaced\n        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Light\">\n        <!--\n            Theme customizations available in newer API levels can go in\n            res/values-vXX/styles.xml, while customizations related to\n            backward-compatibility can go here.\n        -->\n    </style>\n\n    <!-- Application theme. -->\n    <style name=\"AppTheme\" parent=\"AppBaseTheme\">\n        <!-- All customizations that are NOT specific to a particular API-level can go here. -->\n    </style>\n\n</resources>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n    repositories {\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:1.0.1'\n    }\n}\n\nallprojects {\n    repositories {\n        jcenter()\n    }\n}\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/build.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project name=\"DataStreamingExample\" default=\"help\">\n\n    <!-- The local.properties file is created and updated by the 'android' tool.\n         It contains the path to the SDK. It should *NOT* be checked into\n         Version Control Systems. -->\n    <property file=\"local.properties\" />\n\n    <!-- The ant.properties file can be created by you. It is only edited by the\n         'android' tool to add properties to it.\n         This is the place to change some Ant specific build properties.\n         Here are some properties you may want to change/update:\n\n         source.dir\n             The name of the source directory. Default is 'src'.\n         out.dir\n             The name of the output directory. Default is 'bin'.\n\n         For other overridable properties, look at the beginning of the rules\n         files in the SDK, at tools/ant/build.xml\n\n         Properties related to the SDK location or the project target should\n         be updated using the 'android' tool with the 'update' action.\n\n         This file is an integral part of the build system for your\n         application and should be checked into Version Control Systems.\n\n         -->\n    <property file=\"ant.properties\" />\n\n    <!-- if sdk.dir was not set from one of the property file, then\n         get it from the ANDROID_HOME env var.\n         This must be done before we load project.properties since\n         the proguard config can use sdk.dir -->\n    <property environment=\"env\" />\n    <condition property=\"sdk.dir\" value=\"${env.ANDROID_HOME}\">\n        <isset property=\"env.ANDROID_HOME\" />\n    </condition>\n\n    <!-- The project.properties file is created and updated by the 'android'\n         tool, as well as ADT.\n\n         This contains project specific properties such as project target, and library\n         dependencies. Lower level build properties are stored in ant.properties\n         (or in .classpath for Eclipse projects).\n\n         This file is an integral part of the build system for your\n         application and should be checked into Version Control Systems. -->\n    <loadproperties srcFile=\"project.properties\" />\n\n    <!-- quick check on sdk.dir -->\n    <fail\n            message=\"sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable.\"\n            unless=\"sdk.dir\"\n    />\n\n    <!--\n        Import per project custom build rules if present at the root of the project.\n        This is the place to put custom intermediary targets such as:\n            -pre-build\n            -pre-compile\n            -post-compile (This is typically used for code obfuscation.\n                           Compiled code location: ${out.classes.absolute.dir}\n                           If this is not done in place, override ${out.dex.input.absolute.dir})\n            -post-package\n            -post-build\n            -pre-clean\n    -->\n    <import file=\"custom_rules.xml\" optional=\"true\" />\n\n    <!-- Import the actual build file.\n\n         To customize existing targets, there are two options:\n         - Customize only one target:\n             - copy/paste the target into this file, *before* the\n               <import> task.\n             - customize it to your needs.\n         - Customize the whole content of build.xml\n             - copy/paste the content of the rules files (minus the top node)\n               into this file, replacing the <import> task.\n             - customize to your needs.\n\n         ***********************\n         ****** IMPORTANT ******\n         ***********************\n         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,\n         in order to avoid having your file be overridden by tools such as \"android update project\"\n    -->\n    <!-- version-tag: 1 -->\n    <import file=\"${sdk.dir}/tools/ant/build.xml\" />\n\n</project>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Mon Feb 09 10:41:14 PST 2015\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-2.2.1-all.zip\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# For Cygwin, ensure paths are in UNIX format before anything is touched.\nif $cygwin ; then\n    [ -n \"$JAVA_HOME\" ] && JAVA_HOME=`cygpath --unix \"$JAVA_HOME\"`\nfi\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >&-\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >&-\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\r\nset CMD_LINE_ARGS=%$\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/proguard-project.txt",
    "content": "# To enable ProGuard in your project, edit project.properties\n# to define the proguard.config property as described in that file.\n#\n# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in ${sdk.dir}/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the ProGuard\n# include property in project.properties.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/project.properties",
    "content": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# This file must be checked in Version Control Systems.\n#\n# To customize properties used by the Ant build system edit\n# \"ant.properties\", and override values to adapt the script to your\n# project structure.\n#\n# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):\n#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt\n\n# Project target.\ntarget=android-14\nandroid.library.reference.1=../../../PebbleKit-Android/PebbleKit\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/res/layout/activity_counter.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\"\n    tools:context=\".Example_Counter\" >\n\n    <EditText\n        android:id=\"@+id/log_data_text_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:clickable=\"false\"\n        android:cursorVisible=\"false\"\n        android:ems=\"10\"\n        android:focusable=\"false\"\n        android:focusableInTouchMode=\"false\" >\n\n        <requestFocus />\n    </EditText>\n\n</RelativeLayout>"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/res/menu/counter.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <item\n        android:id=\"@+id/action_settings\"\n        android:orderInCategory=\"100\"\n        android:title=\"@string/action_settings\"/>\n\n</menu>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/res/values/dimens.xml",
    "content": "<resources>\n\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n\n</resources>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"app_name\">Ocean Survey</string>\n    <string name=\"action_settings\">Settings</string>\n    <string name=\"hello_world\">Hello world!</string>\n\n</resources>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/res/values/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme, dependent on API level. This theme is replaced\n        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Light\">\n        <!--\n            Theme customizations available in newer API levels can go in\n            res/values-vXX/styles.xml, while customizations related to\n            backward-compatibility can go here.\n        -->\n    </style>\n\n    <!-- Application theme. -->\n    <style name=\"AppTheme\" parent=\"AppBaseTheme\">\n        <!-- All customizations that are NOT specific to a particular API-level can go here. -->\n    </style>\n\n</resources>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/res/values-sw600dp/dimens.xml",
    "content": "<resources>\n\n    <!--\n         Customize dimensions originally defined in res/values/dimens.xml (such as\n         screen margins) for sw600dp devices (e.g. 7\" tablets) here.\n    -->\n\n</resources>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/res/values-sw720dp-land/dimens.xml",
    "content": "<resources>\n\n    <!--\n         Customize dimensions originally defined in res/values/dimens.xml (such as\n         screen margins) for sw720dp devices (e.g. 10\" tablets) in landscape here.\n    -->\n    <dimen name=\"activity_horizontal_margin\">128dp</dimen>\n\n</resources>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/settings.gradle",
    "content": "include ':app'\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-Android/src/com/getpebble/example/logging/ExampleDataLoggingActivity.java",
    "content": "package com.getpebble.example.logging;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.widget.TextView;\nimport com.getpebble.android.kit.PebbleKit;\nimport com.google.common.primitives.UnsignedInteger;\n\nimport java.text.DateFormat;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.TimeZone;\nimport java.util.UUID;\n\n/**\n * Sample code demonstrating how Android applications can receive data logs from Pebble.\n */\npublic class ExampleDataLoggingActivity extends Activity {\n    private static final UUID OCEAN_SURVEY_APP_UUID = UUID.fromString(\"0A5399d9-5693-4F3E-B768-9C99B5F5DCEA\");\n    private static final DateFormat DATE_FORMAT = new SimpleDateFormat(\"HH:mm:ss\");\n\n    private final StringBuilder mDisplayText = new StringBuilder();\n\n    private PebbleKit.PebbleDataLogReceiver mDataLogReceiver = null;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_counter);\n        DATE_FORMAT.setTimeZone(TimeZone.getDefault());\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n        if (mDataLogReceiver != null) {\n            unregisterReceiver(mDataLogReceiver);\n            mDataLogReceiver = null;\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        final Handler handler = new Handler();\n\n        // To receive data logs, Android applications must register a \"DataLogReceiver\" to receive data.\n        //\n        // In this example, we're implementing a handler to receive unsigned integer data that was logged by a\n        // corresponding watch-app. In the watch-app, three separate logs were created, one per animal. Each log was\n        // tagged with a key indicating the animal to which the data corresponds. So, the tag will be used here to\n        // look up the animal name when data is received.\n        //\n        // The data being received contains the seconds since the epoch (a timestamp) of when an ocean faring animal\n        // was sighted. The \"timestamp\" indicates when the log was first created, and will not be used in this example.\n        mDataLogReceiver = new PebbleKit.PebbleDataLogReceiver(OCEAN_SURVEY_APP_UUID) {\n            @Override\n            public void receiveData(Context context, UUID logUuid, UnsignedInteger timestamp, UnsignedInteger tag,\n                                    UnsignedInteger secondsSinceEpoch) {\n                mDisplayText.append(\"\\n\");\n                mDisplayText.append(getUintAsTimestamp(secondsSinceEpoch));\n                mDisplayText.append(\": Saw a \");\n                mDisplayText.append(AnimalName.fromInt(tag.intValue()).getName());\n\n                handler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        updateUi();\n                    }\n                });\n            }\n        };\n\n        PebbleKit.registerDataLogReceiver(this, mDataLogReceiver);\n\n        PebbleKit.requestDataLogsForApp(this, OCEAN_SURVEY_APP_UUID);\n    }\n\n    private void updateUi() {\n        TextView textView = (TextView) findViewById(R.id.log_data_text_view);\n        textView.setText(mDisplayText.toString());\n    }\n\n    private String getUintAsTimestamp(UnsignedInteger uint) {\n        return DATE_FORMAT.format(new Date(uint.longValue() * 1000L)).toString();\n    }\n\n    private static enum AnimalName {\n        SEALION(0x5),\n        DOLPHIN(0xd),\n        PELICAN(0xb),\n        UNKNOWN(0xff);\n\n        public final int id;\n\n        private AnimalName(final int id) {\n            this.id = id;\n        }\n\n        public static AnimalName fromInt(final int id) {\n            for (AnimalName animal : values()) {\n                if (animal.id == id) {\n                    return animal;\n                }\n            }\n            return UNKNOWN;\n        }\n\n        public String getName() {\n            return name().toLowerCase();\n        }\n    }\n}\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/OceanSurveyDemo/OSAppDelegate.h",
    "content": "//\n//  OSAppDelegate.h\n//\n//  Created by Martijn The on 8/13/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface OSAppDelegate : UIResponder <UIApplicationDelegate>\n\n@property (strong, nonatomic) UIWindow *window;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/OceanSurveyDemo/OSAppDelegate.m",
    "content": "//\n//  OSAppDelegate.m\n//\n//  Created by Martijn The on 8/13/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import \"OSAppDelegate.h\"\n\n#import \"OSDataLoggingViewController.h\"\n\n#import <PebbleKit/PebbleKit.h>\n\n@interface OSAppDelegate () <PBPebbleCentralDelegate>\n@end\n\n@implementation OSAppDelegate {\n  OSDataLoggingViewController *_dataLoggingViewController;\n}\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n  [PBPebbleCentral setDebugLogsEnabled:YES];\n  \n  uuid_t myAppUUIDbytes;\n  NSUUID *myAppUUID = [[NSUUID alloc] initWithUUIDString:@\"0a5399d9-5693-4f3e-b768-9c99b5f5dcea\"];\n  [myAppUUID getUUIDBytes:myAppUUIDbytes];\n  [[PBPebbleCentral defaultCentral] setAppUUID:[NSData dataWithBytes:myAppUUIDbytes length:16]];\n  [[PBPebbleCentral defaultCentral] setDelegate:self];\n\n  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];\n  _dataLoggingViewController = [[OSDataLoggingViewController alloc] initWithNibName:nil bundle:nil];\n  self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:_dataLoggingViewController];\n  [self.window makeKeyAndVisible];\n\n  return YES;\n}\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/OceanSurveyDemo/OSDataLoggingViewController.h",
    "content": "//\n//  OSDataLoggingViewController.h\n//\n//  Created by Martijn The on 8/13/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import <PebbleKit/PebbleKit.h>\n\n@interface OSDataLoggingViewController : UIViewController\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/OceanSurveyDemo/OSDataLoggingViewController.m",
    "content": "//\n//  OSDataLoggingViewController.m\n//\n//  Created by Martijn The on 8/13/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import \"OSDataLoggingViewController.h\"\n\nenum {\n  OSAnimalSealion = 0x5,\n  OSAnimalPelican = 0xb,\n  OSAnimalDolphin = 0xd,\n};\n\n@interface OSDataLoggingViewController () <PBDataLoggingServiceDelegate>\n\n@end\n\n@implementation OSDataLoggingViewController {\n  UITextView *_textView;\n  NSDateFormatter *_dateFormatter;\n}\n\n- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {\n  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];\n  if (self) {\n    self.navigationItem.title = @\"Ocean Survey\";\n    [[[PBPebbleCentral defaultCentral] dataLoggingService] setDelegate:self];\n\n    _dateFormatter = [[NSDateFormatter alloc] init];\n    _dateFormatter.timeZone = [NSTimeZone localTimeZone];\n    _dateFormatter.dateStyle = NSDateFormatterShortStyle;\n    _dateFormatter.timeStyle = NSDateFormatterShortStyle;\n  }\n  return self;\n}\n\n- (void)addLogLine:(NSString*)line {\n  line = [line stringByAppendingString:@\"\\n\"];\n  _textView.text = [_textView.text stringByAppendingString:line];\n}\n\n- (void)viewDidLoad {\n  [super viewDidLoad];\n  _textView = [[UITextView alloc] initWithFrame:self.view.bounds];\n  _textView.text = @\"Log:\\n-------------------\\n\";\n  _textView.editable = NO;\n  _textView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;\n  _textView.autoresizesSubviews = YES;\n  [self.view addSubview:_textView];\n}\n\n- (NSString*)animalStringWithTag:(UInt32)tag {\n  switch (tag) {\n    case OSAnimalSealion: return @\"Sealion\";\n    case OSAnimalPelican: return @\"Pelican\";\n    case OSAnimalDolphin: return @\"Dolphin\";\n  }\n  return @\"Unknown\";\n}\n\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt32s:(const UInt32 [])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)sessionMetadata{\n  for (int i = 0; i < numberOfItems; ++i) {\n    NSString *animal = [self animalStringWithTag:sessionMetadata.tag];\n    const UInt32 loggedTime = data[i];\n\n    /* Add seconds to GMT, since the watch only keeps local time. */\n    NSTimeZone *timeZone = [NSTimeZone localTimeZone];\n    NSInteger secondsOffset = [timeZone secondsFromGMT];\n    NSTimeInterval secondsSince1970 = loggedTime - secondsOffset;\n    NSDate *date = [NSDate dateWithTimeIntervalSince1970:secondsSince1970];\n\n    NSString *log = [NSString stringWithFormat:@\"%@: %@\", animal, [_dateFormatter stringFromDate:date]];\n    [self addLogLine:log];\n  }\n  // We consumed the data, let the data logging service know:\n  return YES;\n}\n\n- (void)dataLoggingService:(PBDataLoggingService *)service sessionDidFinish:(PBDataLoggingSessionMetadata *)sessionMetadata {\n  NSString *animal = [self animalStringWithTag:sessionMetadata.tag];\n  NSString *log = [NSString stringWithFormat:@\"%@ session closed.\", animal];\n  \n  [self addLogLine:log];\n}\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/OceanSurveyDemo/OceanSurveyDemo-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.getpebble.${PRODUCT_NAME:rfc1034identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UIStatusBarTintParameters</key>\n\t<dict>\n\t\t<key>UINavigationBar</key>\n\t\t<dict>\n\t\t\t<key>Style</key>\n\t\t\t<string>UIBarStyleDefault</string>\n\t\t\t<key>Translucent</key>\n\t\t\t<false/>\n\t\t</dict>\n\t</dict>\n\t<key>UISupportedExternalAccessoryProtocols</key>\n\t<array>\n\t\t<string>com.getpebble.public</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/OceanSurveyDemo/OceanSurveyDemo-Prefix.pch",
    "content": "#import <Availability.h>\n\n#ifndef __IPHONE_4_0\n#warning \"This project uses features only available in iOS SDK 4.0 and later.\"\n#endif\n\n#ifdef __OBJC__\n  #import <UIKit/UIKit.h>\n  #import <Foundation/Foundation.h>\n#endif\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/OceanSurveyDemo/appinfo.json",
    "content": "{\n  \"uuid\": \"0a5399d9-5693-4f3e-b768-9c99b5f5dcea\",\n  \"shortName\": \"Ocean Survey\",\n  \"longName\": \"Ocean Survey\",\n  \"companyName\": \"Pebble Environment Services\",\n  \"versionCode\": 1,\n  \"versionLabel\": \"1.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_ACTION_ICON_DOLPHIN\",\n        \"file\": \"images/dolphin.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_ACTION_ICON_SEALION\",\n        \"file\": \"images/sealion.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_ACTION_ICON_PELICAN\",\n        \"file\": \"images/pelican.png\"\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/OceanSurveyDemo/en.lproj/ACDespoolingViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"8.00\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1552</int>\n\t\t<string key=\"IBDocument.SystemVersion\">12E55</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">3084</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1187.39</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">626.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">2083</string>\n\t\t</object>\n\t\t<array key=\"IBDocument.IntegratedClassDependencies\">\n\t\t\t<string>IBNSLayoutConstraint</string>\n\t\t\t<string>IBProxyObject</string>\n\t\t\t<string>IBUIButton</string>\n\t\t\t<string>IBUILabel</string>\n\t\t\t<string>IBUIView</string>\n\t\t</array>\n\t\t<array key=\"IBDocument.PluginDependencies\">\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</array>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<string key=\"NS.key.0\">PluginDependencyRecalculationVersion</string>\n\t\t\t<integer value=\"1\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<array class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<object class=\"IBProxyObject\" id=\"372490531\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"263589821\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIView\" id=\"191373211\">\n\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t<object class=\"IBUIButton\" id=\"680636464\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 436}, {280, 44}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentHorizontalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIButtonType\">1</int>\n\t\t\t\t\t\t<string key=\"IBUINormalTitle\">Reset</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIHighlightedTitleColor\" id=\"761422818\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleShadowColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MC41AA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\">\n\t\t\t\t\t\t\t<int key=\"type\">2</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">15</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica-Bold</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">15</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"1054018590\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 47}, {280, 36}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"410627075\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Label</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUITextColor\" id=\"918091814\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MCAwIDAAA</bytes>\n\t\t\t\t\t\t\t<string key=\"IBUIColorCocoaTouchKeyPath\">darkTextColor</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\" id=\"1032518085\">\n\t\t\t\t\t\t\t<int key=\"type\">1</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">17</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\" id=\"603555887\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">17</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"410627075\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 91}, {280, 36}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"554770341\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Label</string>\n\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"918091814\"/>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"1032518085\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"603555887\"/>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"554770341\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 135}, {280, 36}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"680636464\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Label</string>\n\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"918091814\"/>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"1032518085\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"603555887\"/>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"173133637\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 15}, {280, 36}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">CRCs</string>\n\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"918091814\"/>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\" id=\"1013714752\">\n\t\t\t\t\t\t\t<int key=\"type\">1</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">12</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\" id=\"752466740\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">12</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"504158792\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 246}, {280, 36}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"380986689\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Label</string>\n\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"918091814\"/>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"1032518085\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"603555887\"/>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"380986689\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 290}, {280, 36}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"541343864\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Label</string>\n\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"918091814\"/>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"1032518085\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"603555887\"/>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"541343864\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 334}, {280, 36}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Label</string>\n\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"918091814\"/>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"1032518085\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"603555887\"/>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"529769919\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 214}, {280, 36}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Lengths</string>\n\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"918091814\"/>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"1013714752\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"752466740\"/>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t\t<string key=\"NSFrame\">{{0, 20}, {320, 499}}</string>\n\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"1054018590\"/>\n\t\t\t\t<reference key=\"IBUIBackgroundColor\" ref=\"761422818\"/>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedTabBarMetrics\" key=\"IBUISimulatedBottomBarMetrics\"/>\n\t\t\t\t<object class=\"IBUIScreenMetrics\" key=\"IBUISimulatedDestinationMetrics\">\n\t\t\t\t\t<string key=\"IBUISimulatedSizeMetricsClass\">IBUIScreenMetrics</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"IBUINormalizedOrientationToSizeMap\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<array key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<integer value=\"1\"/>\n\t\t\t\t\t\t\t<integer value=\"3\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array key=\"dict.values\">\n\t\t\t\t\t\t\t<string>{320, 568}</string>\n\t\t\t\t\t\t\t<string>{568, 320}</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</object>\n\t\t\t\t\t<string key=\"IBUITargetRuntime\">IBCocoaTouchFramework</string>\n\t\t\t\t\t<string key=\"IBUIDisplayName\">Retina 4 Full Screen</string>\n\t\t\t\t\t<int key=\"IBUIType\">2</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t</array>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<array class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">view</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">3</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_crcLabels</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1054018590\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">83</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_crcLabels</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"410627075\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">84</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_crcLabels</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"554770341\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">85</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_lengthLabels</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"504158792\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">86</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_lengthLabels</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"380986689\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">87</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_lengthLabels</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"541343864\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">88</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchEventConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">reset:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"680636464\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t\t<int key=\"IBEventType\">7</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">26</int>\n\t\t\t\t</object>\n\t\t\t</array>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<array key=\"orderedObjects\">\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<array key=\"object\" id=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"191373211\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"963789923\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">6</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"680636464\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">6</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"9099251\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"680636464\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">5</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">5</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"610342169\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">4</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"680636464\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">4</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"247811169\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">6</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"541343864\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">6</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"267038477\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"541343864\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">3</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"380986689\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">4</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">8</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">6</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">24</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"1001276629\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"541343864\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">5</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">5</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"759557254\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"380986689\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">3</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"504158792\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">4</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">8</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">6</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">24</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"537874975\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">6</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"380986689\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">6</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"74678532\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"380986689\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">5</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">5</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"497118837\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"504158792\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">5</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">5</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"386999537\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">6</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"504158792\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">6</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"830735616\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"504158792\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">3</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBLayoutConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">246</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">9</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"1064845083\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"529769919\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">5</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">5</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"733734157\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">6</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"529769919\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">6</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"811012381\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"529769919\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">3</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBLayoutConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">214</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">9</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"68009893\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"554770341\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">5</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">5</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"125485220\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">6</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"554770341\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">6</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"859591184\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"554770341\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">3</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"410627075\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">4</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">8</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">6</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">24</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"446752213\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"410627075\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">5</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">5</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"226192745\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"410627075\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">3</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"1054018590\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">4</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">8</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">6</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">24</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"382045550\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">6</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"410627075\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">6</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"759580687\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"1054018590\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">3</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBLayoutConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">47</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">9</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"500913000\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">6</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"1054018590\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">6</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"221683279\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"1054018590\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">5</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">5</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"840133968\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"173133637\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">3</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBLayoutConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">15</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">9</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"478635968\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"173133637\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">5</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">5</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"995785977\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">6</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"173133637\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">6</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<reference ref=\"680636464\"/>\n\t\t\t\t\t\t\t<reference ref=\"1054018590\"/>\n\t\t\t\t\t\t\t<reference ref=\"410627075\"/>\n\t\t\t\t\t\t\t<reference ref=\"554770341\"/>\n\t\t\t\t\t\t\t<reference ref=\"173133637\"/>\n\t\t\t\t\t\t\t<reference ref=\"504158792\"/>\n\t\t\t\t\t\t\t<reference ref=\"380986689\"/>\n\t\t\t\t\t\t\t<reference ref=\"541343864\"/>\n\t\t\t\t\t\t\t<reference ref=\"529769919\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"263589821\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">20</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"680636464\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">23</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"610342169\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">24</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"9099251\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">25</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"963789923\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">27</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1054018590\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"733582232\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"1054018590\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">8</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<nil key=\"secondItem\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">0</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBLayoutConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">36</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"1054018590\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">9</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">1</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">30</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"221683279\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">32</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"733582232\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1054018590\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">34</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"500913000\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">35</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"410627075\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"727850300\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"410627075\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">8</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<nil key=\"secondItem\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">0</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBLayoutConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">36</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"410627075\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">9</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">1</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">36</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"727850300\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"410627075\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">37</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"382045550\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">38</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"226192745\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">39</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"446752213\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">40</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"554770341\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"670489280\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"554770341\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">8</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<nil key=\"secondItem\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">0</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBLayoutConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">36</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"554770341\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">9</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">1</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">41</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"670489280\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"554770341\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">42</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"859591184\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">43</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"125485220\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">44</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"68009893\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">49</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"173133637\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"204811346\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"173133637\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">8</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<nil key=\"secondItem\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">0</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBLayoutConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">36</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"173133637\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">9</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">1</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">50</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"204811346\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"173133637\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">51</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"995785977\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">52</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"478635968\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">56</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"759580687\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">61</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"840133968\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">62</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"504158792\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"818395919\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"504158792\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">8</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<nil key=\"secondItem\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">0</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBLayoutConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">36</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"504158792\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">9</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">1</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">63</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"380986689\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"447028608\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"380986689\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">8</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<nil key=\"secondItem\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">0</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBLayoutConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">36</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"380986689\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">9</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">1</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">64</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"541343864\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"289392751\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"541343864\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">8</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<nil key=\"secondItem\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">0</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBLayoutConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">36</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"541343864\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">9</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">1</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">65</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"529769919\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"437410230\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"529769919\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">8</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<nil key=\"secondItem\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">0</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBLayoutConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">36</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"529769919\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">9</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">1</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">66</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"437410230\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"529769919\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">67</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"289392751\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"541343864\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">68</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"447028608\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"380986689\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">69</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"818395919\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"504158792\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">70</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"830735616\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">71</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"386999537\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">72</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"497118837\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">73</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"811012381\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">74</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"74678532\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">75</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1001276629\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">76</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"267038477\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">77</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"247811169\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">78</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"537874975\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">79</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"733734157\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">80</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1064845083\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">81</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"759557254\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t</object>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<string key=\"-1.CustomClassName\">ACDespoolingViewController</string>\n\t\t\t\t<string key=\"-1.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"-2.CustomClassName\">UIResponder</string>\n\t\t\t\t<string key=\"-2.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"1.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<array key=\"1.IBViewMetadataConstraints\">\n\t\t\t\t\t<reference ref=\"995785977\"/>\n\t\t\t\t\t<reference ref=\"478635968\"/>\n\t\t\t\t\t<reference ref=\"840133968\"/>\n\t\t\t\t\t<reference ref=\"221683279\"/>\n\t\t\t\t\t<reference ref=\"500913000\"/>\n\t\t\t\t\t<reference ref=\"759580687\"/>\n\t\t\t\t\t<reference ref=\"382045550\"/>\n\t\t\t\t\t<reference ref=\"226192745\"/>\n\t\t\t\t\t<reference ref=\"446752213\"/>\n\t\t\t\t\t<reference ref=\"859591184\"/>\n\t\t\t\t\t<reference ref=\"125485220\"/>\n\t\t\t\t\t<reference ref=\"68009893\"/>\n\t\t\t\t\t<reference ref=\"811012381\"/>\n\t\t\t\t\t<reference ref=\"733734157\"/>\n\t\t\t\t\t<reference ref=\"1064845083\"/>\n\t\t\t\t\t<reference ref=\"830735616\"/>\n\t\t\t\t\t<reference ref=\"386999537\"/>\n\t\t\t\t\t<reference ref=\"497118837\"/>\n\t\t\t\t\t<reference ref=\"74678532\"/>\n\t\t\t\t\t<reference ref=\"537874975\"/>\n\t\t\t\t\t<reference ref=\"759557254\"/>\n\t\t\t\t\t<reference ref=\"1001276629\"/>\n\t\t\t\t\t<reference ref=\"267038477\"/>\n\t\t\t\t\t<reference ref=\"247811169\"/>\n\t\t\t\t\t<reference ref=\"610342169\"/>\n\t\t\t\t\t<reference ref=\"9099251\"/>\n\t\t\t\t\t<reference ref=\"963789923\"/>\n\t\t\t\t</array>\n\t\t\t\t<string key=\"20.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<boolean value=\"NO\" key=\"20.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints\"/>\n\t\t\t\t<string key=\"23.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"24.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"25.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"27.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"27.IBViewMetadataConstraints\">\n\t\t\t\t\t<reference ref=\"733582232\"/>\n\t\t\t\t</array>\n\t\t\t\t<boolean value=\"NO\" key=\"27.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints\"/>\n\t\t\t\t<string key=\"30.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"32.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"34.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"35.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"35.IBViewMetadataConstraints\">\n\t\t\t\t\t<reference ref=\"727850300\"/>\n\t\t\t\t</array>\n\t\t\t\t<boolean value=\"NO\" key=\"35.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints\"/>\n\t\t\t\t<string key=\"36.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"37.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"38.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"39.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"40.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"40.IBViewMetadataConstraints\">\n\t\t\t\t\t<reference ref=\"670489280\"/>\n\t\t\t\t</array>\n\t\t\t\t<boolean value=\"NO\" key=\"40.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints\"/>\n\t\t\t\t<string key=\"41.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"42.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"43.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"44.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"49.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"49.IBViewMetadataConstraints\">\n\t\t\t\t\t<reference ref=\"204811346\"/>\n\t\t\t\t</array>\n\t\t\t\t<boolean value=\"NO\" key=\"49.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints\"/>\n\t\t\t\t<string key=\"50.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"51.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"52.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"56.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"61.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"62.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"62.IBViewMetadataConstraints\">\n\t\t\t\t\t<reference ref=\"818395919\"/>\n\t\t\t\t</array>\n\t\t\t\t<boolean value=\"NO\" key=\"62.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints\"/>\n\t\t\t\t<string key=\"63.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"63.IBViewMetadataConstraints\">\n\t\t\t\t\t<reference ref=\"447028608\"/>\n\t\t\t\t</array>\n\t\t\t\t<boolean value=\"NO\" key=\"63.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints\"/>\n\t\t\t\t<string key=\"64.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"64.IBViewMetadataConstraints\">\n\t\t\t\t\t<reference ref=\"289392751\"/>\n\t\t\t\t</array>\n\t\t\t\t<boolean value=\"NO\" key=\"64.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints\"/>\n\t\t\t\t<string key=\"65.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"65.IBViewMetadataConstraints\">\n\t\t\t\t\t<reference ref=\"437410230\"/>\n\t\t\t\t</array>\n\t\t\t\t<boolean value=\"NO\" key=\"65.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints\"/>\n\t\t\t\t<string key=\"66.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"67.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"68.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"69.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"70.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"71.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"72.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"73.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"74.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"75.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"76.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"77.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"78.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"79.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"80.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"81.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t</dictionary>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"unlocalizedProperties\"/>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"localizations\"/>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">88</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<array class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">ACDespoolingViewController</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actions\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">reset:</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">id</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actionInfosByName\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">reset:</string>\n\t\t\t\t\t\t<object class=\"IBActionInfo\" key=\"NS.object.0\">\n\t\t\t\t\t\t\t<string key=\"name\">reset:</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/ACDespoolingViewController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSLayoutConstraint</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/NSLayoutConstraint.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</array>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<bool key=\"IBDocument.UseAutolayout\">YES</bool>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">2083</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/OceanSurveyDemo/en.lproj/ACSecondViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"8.00\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1536</int>\n\t\t<string key=\"IBDocument.SystemVersion\">12A269</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">2837</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1187</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">624.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">1921</string>\n\t\t</object>\n\t\t<array key=\"IBDocument.IntegratedClassDependencies\">\n\t\t\t<string>IBNSLayoutConstraint</string>\n\t\t\t<string>IBProxyObject</string>\n\t\t\t<string>IBUILabel</string>\n\t\t\t<string>IBUITextView</string>\n\t\t\t<string>IBUIView</string>\n\t\t</array>\n\t\t<array key=\"IBDocument.PluginDependencies\">\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</array>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<string key=\"NS.key.0\">PluginDependencyRecalculationVersion</string>\n\t\t\t<integer value=\"1\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<array class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<object class=\"IBProxyObject\" id=\"372490531\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"263589821\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIView\" id=\"191373211\">\n\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"483052203\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 123}, {280, 43}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"255779567\"/>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t\t\t<object class=\"NSColorSpace\" key=\"NSCustomColorSpace\">\n\t\t\t\t\t\t\t\t<int key=\"NSID\">2</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Second View</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUITextColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MCAwIDAAA</bytes>\n\t\t\t\t\t\t\t<string key=\"IBUIColorCocoaTouchKeyPath\">darkTextColor</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">1</int>\n\t\t\t\t\t\t<float key=\"IBUIMinimumFontSize\">10</float>\n\t\t\t\t\t\t<int key=\"IBUITextAlignment\">1</int>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\">\n\t\t\t\t\t\t\t<string key=\"name\">Helvetica</string>\n\t\t\t\t\t\t\t<string key=\"family\">Helvetica</string>\n\t\t\t\t\t\t\t<int key=\"traits\">0</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">36</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">36</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUITextView\" id=\"255779567\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 206}, {280, 88}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<bool key=\"IBUIMultipleTouchEnabled\">YES</bool>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<bool key=\"IBUIShowsHorizontalScrollIndicator\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIDelaysContentTouches\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUICanCancelContentTouches\">NO</bool>\n\t\t\t\t\t\t<float key=\"IBUIMinimumZoomScale\">0.0</float>\n\t\t\t\t\t\t<float key=\"IBUIMaximumZoomScale\">0.0</float>\n\t\t\t\t\t\t<bool key=\"IBUIBouncesZoom\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIEditable\">NO</bool>\n\t\t\t\t\t\t<string type=\"base64-UTF8\" key=\"IBUIText\">TG9hZGVkIGJ5IHRoZSBzZWNvbmQgdmlldwpjb250cm9sbGVyIOKAlCBhbiBpbnN0YW5jZSBvZiBTZWNv\nbmRWaWV3Q29udHJvbGxlciDigJQgc3BlY2lmaWVkIGluIHRoZSBhcHAgZGVsZWdhdGUuA</string>\n\t\t\t\t\t\t<int key=\"IBUITextAlignment\">1</int>\n\t\t\t\t\t\t<object class=\"IBUITextInputTraits\" key=\"IBUITextInputTraits\">\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\">\n\t\t\t\t\t\t\t<int key=\"type\">1</int>\n\t\t\t\t\t\t\t<int key=\"size\">4</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">14</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t\t<string key=\"NSFrame\">{{0, 20}, {320, 499}}</string>\n\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"483052203\"/>\n\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedTabBarMetrics\" key=\"IBUISimulatedBottomBarMetrics\"/>\n\t\t\t\t<object class=\"IBUIScreenMetrics\" key=\"IBUISimulatedDestinationMetrics\">\n\t\t\t\t\t<string key=\"IBUISimulatedSizeMetricsClass\">IBUIScreenMetrics</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"IBUINormalizedOrientationToSizeMap\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<array key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<integer value=\"1\"/>\n\t\t\t\t\t\t\t<integer value=\"3\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array key=\"dict.values\">\n\t\t\t\t\t\t\t<string>{320, 568}</string>\n\t\t\t\t\t\t\t<string>{568, 320}</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</object>\n\t\t\t\t\t<string key=\"IBUITargetRuntime\">IBCocoaTouchFramework</string>\n\t\t\t\t\t<string key=\"IBUIDisplayName\">Retina 4 Full Screen</string>\n\t\t\t\t\t<int key=\"IBUIType\">2</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t</array>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<array class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">view</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">3</int>\n\t\t\t\t</object>\n\t\t\t</array>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<array key=\"orderedObjects\">\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<array key=\"object\" id=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"191373211\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"483052203\"/>\n\t\t\t\t\t\t\t<reference ref=\"255779567\"/>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"79547858\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">10</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"255779567\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">10</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBLayoutConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">0.0</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">9</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">40</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">2</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"625580078\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"255779567\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">3</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"483052203\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">4</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBLayoutConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">40</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">9</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">40</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"42039572\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"255779567\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">5</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">5</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"18532393\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">6</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"255779567\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">6</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"930858781\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">6</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"483052203\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">6</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"854126396\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"483052203\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">5</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"secondItem\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">5</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBNSLayoutSymbolicConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">20</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"191373211\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">8</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">29</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">3</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"263589821\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">5</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"483052203\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">7</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"255779567\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<object class=\"IBNSLayoutConstraint\" id=\"405679904\">\n\t\t\t\t\t\t\t\t<reference key=\"firstItem\" ref=\"255779567\"/>\n\t\t\t\t\t\t\t\t<int key=\"firstAttribute\">8</int>\n\t\t\t\t\t\t\t\t<int key=\"relation\">0</int>\n\t\t\t\t\t\t\t\t<nil key=\"secondItem\"/>\n\t\t\t\t\t\t\t\t<int key=\"secondAttribute\">0</int>\n\t\t\t\t\t\t\t\t<float key=\"multiplier\">1</float>\n\t\t\t\t\t\t\t\t<object class=\"IBLayoutConstant\" key=\"constant\">\n\t\t\t\t\t\t\t\t\t<double key=\"value\">88</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<float key=\"priority\">1000</float>\n\t\t\t\t\t\t\t\t<reference key=\"containingView\" ref=\"255779567\"/>\n\t\t\t\t\t\t\t\t<int key=\"scoringType\">3</int>\n\t\t\t\t\t\t\t\t<float key=\"scoringTypeFloat\">9</float>\n\t\t\t\t\t\t\t\t<int key=\"contentType\">1</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">9</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"854126396\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">10</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"930858781\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">12</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"18532393\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">13</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"42039572\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">14</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"405679904\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"255779567\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">15</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"625580078\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">17</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"79547858\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t</object>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<string key=\"-1.CustomClassName\">ACSecondViewController</string>\n\t\t\t\t<string key=\"-1.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"-2.CustomClassName\">UIResponder</string>\n\t\t\t\t<string key=\"-2.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"1.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"1.IBViewMetadataConstraints\">\n\t\t\t\t\t<reference ref=\"854126396\"/>\n\t\t\t\t\t<reference ref=\"930858781\"/>\n\t\t\t\t\t<reference ref=\"18532393\"/>\n\t\t\t\t\t<reference ref=\"42039572\"/>\n\t\t\t\t\t<reference ref=\"625580078\"/>\n\t\t\t\t\t<reference ref=\"79547858\"/>\n\t\t\t\t</array>\n\t\t\t\t<string key=\"10.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"12.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"13.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"14.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"15.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"17.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"5.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<boolean value=\"NO\" key=\"5.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints\"/>\n\t\t\t\t<string key=\"7.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<array key=\"7.IBViewMetadataConstraints\">\n\t\t\t\t\t<reference ref=\"405679904\"/>\n\t\t\t\t</array>\n\t\t\t\t<boolean value=\"NO\" key=\"7.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints\"/>\n\t\t\t\t<string key=\"9.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t</dictionary>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"unlocalizedProperties\"/>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"localizations\"/>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">17</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<array class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSLayoutConstraint</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/NSLayoutConstraint.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</array>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<bool key=\"IBDocument.UseAutolayout\">YES</bool>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">1921</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/OceanSurveyDemo/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/OceanSurveyDemo/main.m",
    "content": "//\n//  main.m\n//\n//  Created by Martijn The on 8/13/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n#import \"OSAppDelegate.h\"\n\nint main(int argc, char *argv[])\n{\n  @autoreleasepool {\n      return UIApplicationMain(argc, argv, nil, NSStringFromClass([OSAppDelegate class]));\n  }\n}\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/OceanSurveyDemo.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t0F872BA4182243AD0071E717 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F872BA3182243AD0071E717 /* CFNetwork.framework */; };\n\t\t1072217617CEF78A000C35FE /* OSAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1072217317CEF78A000C35FE /* OSAppDelegate.m */; };\n\t\t1072217717CEF78A000C35FE /* OSDataLoggingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1072217517CEF78A000C35FE /* OSDataLoggingViewController.m */; };\n\t\t107BAF1617BB246900B91FCD /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 107BAF1517BB246900B91FCD /* UIKit.framework */; };\n\t\t107BAF1817BB246900B91FCD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 107BAF1717BB246900B91FCD /* Foundation.framework */; };\n\t\t107BAF1A17BB246900B91FCD /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 107BAF1917BB246900B91FCD /* CoreGraphics.framework */; };\n\t\t107BAF2017BB246900B91FCD /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 107BAF1E17BB246900B91FCD /* InfoPlist.strings */; };\n\t\t107BAF2217BB246900B91FCD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 107BAF2117BB246900B91FCD /* main.m */; };\n\t\t107BAF2817BB246900B91FCD /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 107BAF2717BB246900B91FCD /* Default.png */; };\n\t\t107BAF2A17BB246900B91FCD /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 107BAF2917BB246900B91FCD /* Default@2x.png */; };\n\t\t107BAF2C17BB246900B91FCD /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 107BAF2B17BB246900B91FCD /* Default-568h@2x.png */; };\n\t\t107BAF6B17BB24BF00B91FCD /* CoreBluetooth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 107BAF6617BB24BF00B91FCD /* CoreBluetooth.framework */; };\n\t\t107BAF6C17BB24BF00B91FCD /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 107BAF6717BB24BF00B91FCD /* CoreMotion.framework */; };\n\t\t107BAF6D17BB24BF00B91FCD /* ExternalAccessory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 107BAF6817BB24BF00B91FCD /* ExternalAccessory.framework */; };\n\t\t107BAF6E17BB24BF00B91FCD /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 107BAF6917BB24BF00B91FCD /* libz.dylib */; };\n\t\t107BAF6F17BB24BF00B91FCD /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 107BAF6A17BB24BF00B91FCD /* MessageUI.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t0F872BA3182243AD0071E717 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; };\n\t\t1072217217CEF78A000C35FE /* OSAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OSAppDelegate.h; sourceTree = \"<group>\"; };\n\t\t1072217317CEF78A000C35FE /* OSAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OSAppDelegate.m; sourceTree = \"<group>\"; };\n\t\t1072217417CEF78A000C35FE /* OSDataLoggingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OSDataLoggingViewController.h; sourceTree = \"<group>\"; };\n\t\t1072217517CEF78A000C35FE /* OSDataLoggingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OSDataLoggingViewController.m; sourceTree = \"<group>\"; };\n\t\t107BAF1217BB246900B91FCD /* OceanSurveyDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OceanSurveyDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t107BAF1517BB246900B91FCD /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };\n\t\t107BAF1717BB246900B91FCD /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t107BAF1917BB246900B91FCD /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };\n\t\t107BAF1D17BB246900B91FCD /* OceanSurveyDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"OceanSurveyDemo-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t107BAF1F17BB246900B91FCD /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t107BAF2117BB246900B91FCD /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t107BAF2317BB246900B91FCD /* OceanSurveyDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"OceanSurveyDemo-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t107BAF2717BB246900B91FCD /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = \"<group>\"; };\n\t\t107BAF2917BB246900B91FCD /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Default@2x.png\"; sourceTree = \"<group>\"; };\n\t\t107BAF2B17BB246900B91FCD /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Default-568h@2x.png\"; sourceTree = \"<group>\"; };\n\t\t107BAF6617BB24BF00B91FCD /* CoreBluetooth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreBluetooth.framework; path = System/Library/Frameworks/CoreBluetooth.framework; sourceTree = SDKROOT; };\n\t\t107BAF6717BB24BF00B91FCD /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; };\n\t\t107BAF6817BB24BF00B91FCD /* ExternalAccessory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ExternalAccessory.framework; path = System/Library/Frameworks/ExternalAccessory.framework; sourceTree = SDKROOT; };\n\t\t107BAF6917BB24BF00B91FCD /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.dylib\"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };\n\t\t107BAF6A17BB24BF00B91FCD /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; };\n\t\t28B10E22A9204568AF3CA000 /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.xcconfig; path = Pods/Pods.xcconfig; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t107BAF0F17BB246900B91FCD /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t0F872BA4182243AD0071E717 /* CFNetwork.framework in Frameworks */,\n\t\t\t\t107BAF6B17BB24BF00B91FCD /* CoreBluetooth.framework in Frameworks */,\n\t\t\t\t107BAF6C17BB24BF00B91FCD /* CoreMotion.framework in Frameworks */,\n\t\t\t\t107BAF6D17BB24BF00B91FCD /* ExternalAccessory.framework in Frameworks */,\n\t\t\t\t107BAF6E17BB24BF00B91FCD /* libz.dylib in Frameworks */,\n\t\t\t\t107BAF6F17BB24BF00B91FCD /* MessageUI.framework in Frameworks */,\n\t\t\t\t107BAF1617BB246900B91FCD /* UIKit.framework in Frameworks */,\n\t\t\t\t107BAF1817BB246900B91FCD /* Foundation.framework in Frameworks */,\n\t\t\t\t107BAF1A17BB246900B91FCD /* CoreGraphics.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t107BAF0917BB246900B91FCD = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t107BAF1B17BB246900B91FCD /* OceanSurveyDemo */,\n\t\t\t\t107BAF1417BB246900B91FCD /* Frameworks */,\n\t\t\t\t107BAF1317BB246900B91FCD /* Products */,\n\t\t\t\t28B10E22A9204568AF3CA000 /* Pods.xcconfig */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t107BAF1317BB246900B91FCD /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t107BAF1217BB246900B91FCD /* OceanSurveyDemo.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t107BAF1417BB246900B91FCD /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0F872BA3182243AD0071E717 /* CFNetwork.framework */,\n\t\t\t\t107BAF6617BB24BF00B91FCD /* CoreBluetooth.framework */,\n\t\t\t\t107BAF6717BB24BF00B91FCD /* CoreMotion.framework */,\n\t\t\t\t107BAF6817BB24BF00B91FCD /* ExternalAccessory.framework */,\n\t\t\t\t107BAF6917BB24BF00B91FCD /* libz.dylib */,\n\t\t\t\t107BAF6A17BB24BF00B91FCD /* MessageUI.framework */,\n\t\t\t\t107BAF1517BB246900B91FCD /* UIKit.framework */,\n\t\t\t\t107BAF1717BB246900B91FCD /* Foundation.framework */,\n\t\t\t\t107BAF1917BB246900B91FCD /* CoreGraphics.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t107BAF1B17BB246900B91FCD /* OceanSurveyDemo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1072217217CEF78A000C35FE /* OSAppDelegate.h */,\n\t\t\t\t1072217317CEF78A000C35FE /* OSAppDelegate.m */,\n\t\t\t\t1072217417CEF78A000C35FE /* OSDataLoggingViewController.h */,\n\t\t\t\t1072217517CEF78A000C35FE /* OSDataLoggingViewController.m */,\n\t\t\t\t107BAF1C17BB246900B91FCD /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = OceanSurveyDemo;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t107BAF1C17BB246900B91FCD /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t107BAF1D17BB246900B91FCD /* OceanSurveyDemo-Info.plist */,\n\t\t\t\t107BAF1E17BB246900B91FCD /* InfoPlist.strings */,\n\t\t\t\t107BAF2117BB246900B91FCD /* main.m */,\n\t\t\t\t107BAF2317BB246900B91FCD /* OceanSurveyDemo-Prefix.pch */,\n\t\t\t\t107BAF2717BB246900B91FCD /* Default.png */,\n\t\t\t\t107BAF2917BB246900B91FCD /* Default@2x.png */,\n\t\t\t\t107BAF2B17BB246900B91FCD /* Default-568h@2x.png */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t107BAF1117BB246900B91FCD /* OceanSurveyDemo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 107BAF4317BB246900B91FCD /* Build configuration list for PBXNativeTarget \"OceanSurveyDemo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t77C4664C438F45B1B5D06091 /* Check Pods Manifest.lock */,\n\t\t\t\t107BAF0E17BB246900B91FCD /* Sources */,\n\t\t\t\t107BAF0F17BB246900B91FCD /* Frameworks */,\n\t\t\t\t107BAF1017BB246900B91FCD /* Resources */,\n\t\t\t\tFBA3BC2A56B44DB38F2B1C00 /* Copy Pods Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = OceanSurveyDemo;\n\t\t\tproductName = AccelDemo;\n\t\t\tproductReference = 107BAF1217BB246900B91FCD /* OceanSurveyDemo.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t107BAF0A17BB246900B91FCD /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tCLASSPREFIX = DS;\n\t\t\t\tLastUpgradeCheck = 0510;\n\t\t\t\tORGANIZATIONNAME = \"Pebble Technology Corp.\";\n\t\t\t};\n\t\t\tbuildConfigurationList = 107BAF0D17BB246900B91FCD /* Build configuration list for PBXProject \"OceanSurveyDemo\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 107BAF0917BB246900B91FCD;\n\t\t\tproductRefGroup = 107BAF1317BB246900B91FCD /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t107BAF1117BB246900B91FCD /* OceanSurveyDemo */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t107BAF1017BB246900B91FCD /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t107BAF2017BB246900B91FCD /* InfoPlist.strings in Resources */,\n\t\t\t\t107BAF2817BB246900B91FCD /* Default.png in Resources */,\n\t\t\t\t107BAF2A17BB246900B91FCD /* Default@2x.png in Resources */,\n\t\t\t\t107BAF2C17BB246900B91FCD /* Default-568h@2x.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t77C4664C438F45B1B5D06091 /* Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Check Pods Manifest.lock\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_ROOT}/../Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [[ $? != 0 ]] ; then\\n    cat << EOM\\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\nEOM\\n    exit 1\\nfi\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tFBA3BC2A56B44DB38F2B1C00 /* Copy Pods Resources */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Copy Pods Resources\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/Pods/Pods-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t107BAF0E17BB246900B91FCD /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1072217717CEF78A000C35FE /* OSDataLoggingViewController.m in Sources */,\n\t\t\t\t1072217617CEF78A000C35FE /* OSAppDelegate.m in Sources */,\n\t\t\t\t107BAF2217BB246900B91FCD /* main.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t107BAF1E17BB246900B91FCD /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t107BAF1F17BB246900B91FCD /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t107BAF4117BB246900B91FCD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t107BAF4217BB246900B91FCD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_CFLAGS = \"-DNS_BLOCK_ASSERTIONS=1\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t107BAF4417BB246900B91FCD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 28B10E22A9204568AF3CA000 /* Pods.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SRCROOT)/../../../PebbleKit-iOS\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"OceanSurveyDemo/OceanSurveyDemo-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"OceanSurveyDemo/OceanSurveyDemo-Info.plist\";\n\t\t\t\tPRODUCT_NAME = OceanSurveyDemo;\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t107BAF4517BB246900B91FCD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 28B10E22A9204568AF3CA000 /* Pods.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SRCROOT)/../../../PebbleKit-iOS\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"OceanSurveyDemo/OceanSurveyDemo-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"OceanSurveyDemo/OceanSurveyDemo-Info.plist\";\n\t\t\t\tPRODUCT_NAME = OceanSurveyDemo;\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t107BAF0D17BB246900B91FCD /* Build configuration list for PBXProject \"OceanSurveyDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t107BAF4117BB246900B91FCD /* Debug */,\n\t\t\t\t107BAF4217BB246900B91FCD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t107BAF4317BB246900B91FCD /* Build configuration list for PBXNativeTarget \"OceanSurveyDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t107BAF4417BB246900B91FCD /* Debug */,\n\t\t\t\t107BAF4517BB246900B91FCD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 107BAF0A17BB246900B91FCD /* Project object */;\n}\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/OceanSurveyDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:OceanSurveyDemo.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/OceanSurveyDemo.xcodeproj/project.xcworkspace/xcshareddata/OceanSurveyDemo.xccheckout",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDESourceControlProjectIdentifier</key>\n\t<string>B40A83A3-665E-4E52-B6F8-5C0CE8745FA7</string>\n\t<key>IDESourceControlProjectName</key>\n\t<string>OceanSurveyDemo</string>\n\t<key>IDESourceControlProjectOriginsDictionary</key>\n\t<dict>\n\t\t<key>3A0B87F4-437B-4F41-9F0F-BACA80C47296</key>\n\t\t<string>ssh://github.com/pebble/pebblesdk-examples.git</string>\n\t</dict>\n\t<key>IDESourceControlProjectPath</key>\n\t<string>ocean-survey-demo/OceanSurveyDemo-iOS/OceanSurveyDemo.xcodeproj/project.xcworkspace</string>\n\t<key>IDESourceControlProjectRelativeInstallPathDictionary</key>\n\t<dict>\n\t\t<key>3A0B87F4-437B-4F41-9F0F-BACA80C47296</key>\n\t\t<string>../../../..</string>\n\t</dict>\n\t<key>IDESourceControlProjectURL</key>\n\t<string>ssh://github.com/pebble/pebblesdk-examples.git</string>\n\t<key>IDESourceControlProjectVersion</key>\n\t<integer>110</integer>\n\t<key>IDESourceControlProjectWCCIdentifier</key>\n\t<string>3A0B87F4-437B-4F41-9F0F-BACA80C47296</string>\n\t<key>IDESourceControlProjectWCConfigurations</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>IDESourceControlRepositoryExtensionIdentifierKey</key>\n\t\t\t<string>public.vcs.git</string>\n\t\t\t<key>IDESourceControlWCCIdentifierKey</key>\n\t\t\t<string>3A0B87F4-437B-4F41-9F0F-BACA80C47296</string>\n\t\t\t<key>IDESourceControlWCCName</key>\n\t\t\t<string>pebblesdk-examples</string>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/OceanSurveyDemo.xcodeproj/xcshareddata/xcschemes/OceanSurvey.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0510\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"107BAF1117BB246900B91FCD\"\n               BuildableName = \"OceanSurveyDemo.app\"\n               BlueprintName = \"OceanSurveyDemo\"\n               ReferencedContainer = \"container:OceanSurveyDemo.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      buildConfiguration = \"Debug\">\n      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"107BAF1117BB246900B91FCD\"\n            BuildableName = \"OceanSurveyDemo.app\"\n            BlueprintName = \"OceanSurveyDemo\"\n            ReferencedContainer = \"container:OceanSurveyDemo.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </TestAction>\n   <LaunchAction\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      buildConfiguration = \"Debug\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"107BAF1117BB246900B91FCD\"\n            BuildableName = \"OceanSurveyDemo.app\"\n            BlueprintName = \"OceanSurveyDemo\"\n            ReferencedContainer = \"container:OceanSurveyDemo.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      buildConfiguration = \"Release\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"107BAF1117BB246900B91FCD\"\n            BuildableName = \"OceanSurveyDemo.app\"\n            BlueprintName = \"OceanSurveyDemo\"\n            ReferencedContainer = \"container:OceanSurveyDemo.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/OceanSurveyDemo.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version='1.0' encoding='UTF-8'?><Workspace version='1.0'><FileRef location='group:OceanSurveyDemo.xcodeproj'/><FileRef location='group:Pods/Pods.xcodeproj'/></Workspace>"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Podfile",
    "content": "pod \"PebbleKit\""
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/NSDictionary+Pebble.h",
    "content": "//\n//  NSDictionary+Pebble.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSDictionary (Pebble)\n\n/**\n *  Serializes the receiver into a Pebble dict.\n *  @note The receiver dictionary must comply to the following constraints:\n *  * The keys must be instances of NSNumber. Their -unsignedLongValue return value will be used as final key.\n *  * The values must be instances of either NSString, NSData or NSNumber. Use the NSNumber (stdint) category\n *  to specify the signedness and width of NSNumbers.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryUnsupportedKeyClass,\n *  PBErrorCodeDictionaryUnsupportedValueClass or PBErrorCodeDictionaryUnsupportedValueClass.\n *  @see -dictionaryFromPebbleDictionaryDataWithError:\n */\n- (NSData*)pebbleDictionaryData:(NSError * __autoreleasing *)error;\n\n@end\n\n@interface NSData (Pebble)\n\n/**\n *  Interprets the receiver as Pebble dict data and deserializes it into an NSDictionary.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryInternalConsistency.\n *  @see -pebbleDictionaryData:\n */\n- (NSDictionary*)dictionaryFromPebbleDictionaryDataWithError:(NSError * __autoreleasing *)error;\n\n@end"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/NSNumber+stdint.h",
    "content": "//\n//  NSNumber+stdint.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/**\n *  This category exposes the capabilities the underlying CFNumber to explicitely\n *  store the signedness and the width of the storage.\n */\n\n@interface NSNumber (stdint)\n\n/**\n *  Interprets the receiver as a 32-bits wide, unsigned integer.\n */\n- (uint32_t)uint32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, unsigned integer.\n */\n- (uint16_t)uint16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, unsigned integer.\n */\n- (uint8_t)uint8Value;\n\n/**\n *  Interprets the receiver as a 32-bits wide, signed integer.\n */\n- (int32_t)int32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, signed integer.\n */\n- (int16_t)int16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, signed integer.\n */\n- (int8_t)int8Value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint32:(uint32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint16:(uint16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint8:(uint8_t)value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt32:(int32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt16:(int16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt8:(int8_t)value;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a floating pointer number or not.\n */\n- (BOOL)isFloat;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a signed integer or not.\n */\n- (BOOL)isSigned;\n\n/**\n *  Gets the width in bytes of the integer that is stored by the receiver.\n */\n- (uint8_t)width;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBBitmap.h",
    "content": "//\n//  PBBitmap.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIImage.h>\n#import <PebbleKit/gtypes.h>\n\n/**\n *  Helper class to convert a UIImage to Pebble bitmap pixel data and GBitmap metadata.\n *  Refer to the documentation of Pebble's native watch app SDK on the GBitmap format.\n */\n\n@interface PBBitmap : NSObject\n\n/**\n *  The pixel data of the bitmap.\n *  This corresponds to the data as pointed to by GBitmap's `addr` field.\n */\n@property (nonatomic, readonly, strong) NSData *pixelData;\n\n/**\n *  The number of bytes per row.\n *  Always a multiple of 4 bytes.\n */\n@property (nonatomic, readonly, assign) uint16_t rowSizeBytes;\n\n/**\n *  Bitfield of metadata flags.\n *  This corresponds to GBitmap's `info_flags` field.\n */\n@property (nonatomic, readonly, assign) uint16_t infoFlags;\n\n/**\n *  The box of bits inside `pixelData`, that contains\n *  the actual image data to use.\n *  This corresponds to GBitmap's `bounds` field.\n */\n@property (nonatomic, readonly, assign) GRect bounds;\n\n/**\n *  Factory method to create a PBBitmap from a UIImage instance.\n *  @param image The UIImage from which to create the PBBitmap\n */\n+ (PBBitmap*)pebbleBitmapWithUIImage:(UIImage*)image;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBDataLoggingService.h",
    "content": "//\n//  PBDataLoggingService.h\n//  PebbleKit\n//\n//  Created by Martijn The on 7/19/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  Data logging datatypes.\n */\nenum {\n  //! Array of bytes\n  PBDataLoggingTypeByteArray = 0,\n  //! unsigned integer\n  PBDataLoggingTypeUInt = 2,\n  //! signed integer\n  PBDataLoggingTypeInt = 3,\n};\ntypedef UInt8 PBDataLoggingType;\n\n/**\n *  The metadata of a data logging session. Used to identify a session.\n */\n@interface PBDataLoggingSessionMetadata : NSObject <NSSecureCoding, NSCopying>\n\n/**\n *  A tag associated with the session.\n */\n@property (nonatomic, readonly) UInt32 tag;\n\n/**\n *  The timestamp of the moment the session was created by the watchapp.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The type of data stored in this session.\n */\n@property (nonatomic, readonly) PBDataLoggingType type;\n\n/**\n *  The size of a data item.\n */\n@property (nonatomic, readonly) UInt16 itemSize;\n\n/**\n *  The serial number of the watch that created the sessions.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  Creates a new data logging session metadata object, given all its property values.\n *  This method is provided to create a metadata object that can be used to\n *  compare it with a metadata object that is passed into one of the\n *  PBDataLoggingServiceDelegate methods.\n *  @param tag The tag associated with the session\n *  @param timestamp The timestamp of the creation of the session\n *  @param type The type of data stored in the session\n *  @param itemSize The size of a data item\n *  @param serialNumber The serial number of the watch that created the session\n *  @return A session metadata object with the specified information\n */\n+ (id)metadataWithTag:(UInt32)tag\n            timestamp:(UInt32)timestamp\n                 type:(PBDataLoggingType)type\n             itemSize:(UInt16)itemSize\n         serialNumber:(NSString *)serialNumber;\n\n/**\n *  Tests the equality of two data logging session metadata objects.\n *  This method can be used to compare two session metadata objects\n *  to check whether they are referring to the same session or not.\n *  @param sessionMetadata\n *  @return YES if all the property values of receiver are equal to the property\n *  values of the given session.\n *  @note Equivalent to -[PBDataLoggingSessionMetadata isEqual:]\n */\n- (BOOL)isEqualToDataLoggingSessionMetadata:(PBDataLoggingSessionMetadata *)sessionMetadata;\n@end\n\n/**\n *  Data logging delegate protocol. The object that implements this protocol\n *  is responsible for handling incoming data.\n */\n@protocol PBDataLoggingServiceDelegate <NSObject>\n@optional\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param bytes Pointer to the array of bytes.\n *  The array contains (numberOfItems * session.itemSize) bytes.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasByteArrays:(const UInt8 * const)bytes numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt8s:(const UInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt16s:(const UInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt32s:(const UInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt8s:(const SInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt16s:(const SInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt32s:(const SInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time a session is finished.\n *  This is guaranteed to be called only after all data has been received and\n *  consumed by the application.\n *  @param service The data logging service.\n *  @param session The metadata of the session.\n */\n- (void)dataLoggingService:(PBDataLoggingService *)service sessionDidFinish:(PBDataLoggingSessionMetadata *)session;\n\n@end\n\n/**\n *  The data logging service. Assign a delegate object in order to receive\n *  data from your watchapp.\n */\n@interface PBDataLoggingService : NSObject\n\n/**\n *  The delegate that has the responsility of handling callbacks from the\n *  data logging service.\n */\n@property (atomic, readwrite, weak) id<PBDataLoggingServiceDelegate> delegate;\n\n/**\n *  Sets the queue on which delegate methods will be executed.\n *  Callbacks are intended to be processed in the order as they come in, so it\n *  you must use a serial queue. If set to nil (default) the main queue is used.\n *  @param delegateQueue The queue on which the delegate methods will be executed.\n */\n- (void)setDelegateQueue:(dispatch_queue_t)delegateQueue;\n\n/**\n * Query the watch for data logging data.\n */\n- (void)pollForData;\n  \n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBErrors.h",
    "content": "//\n//  PBErrors.h\n//  PebbleSDK\n//\n//  Created by Martijn The on 7/26/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nextern NSString *PBErrorDomain;\n\n/**\n *  PebbleKit Error codes.\n *  Inspect the localizedDescription of any NSError objects for a description.\n */\n\ntypedef enum {\n  PBErrorCodeNoSupportedProtocolsInInfoPlist,\n  PBErrorCodeErrorCreatingSession,\n  PBErrorCodeOutputStreamError,\n  PBErrorCodeInputStreamError,\n  PBErrorCodeSendMessageTimeout,\n  PBErrorCodeEndpointDisallowed,\n  PBErrorCodeVersionInfoTimeout,\n  PBErrorCodeCannotCreateSessionWhileClosing,\n  PBErrorCodeNoAppUUID,\n  PBErrorCodeAppMessageRejected,\n  PBErrorCodeAppMessageAckTimeout,\n  PBErrorCodeDictionaryUnsupportedKeyClass,\n  PBErrorCodeDictionaryUnsupportedValueClass,\n  PBErrorCodeDictionaryInternalConsistency,\n  PBErrorCodeInvalidArguments,\n  PBErrorCodePebbleAppUnreachable,\n  PBErrorCodePebbleAppRequestTimeout,\n  PBErrorCodePebbleAppEmptyResponse,\n  PBErrorCodePebbleAppUnexpectedResponse,\n  PBErrorCodeServerNotAvailable,\n  PBErrorCodeDownloadFailed,\n  PBErrorCodePebbleNotConnected\n} PBErrorCode;\n\n@interface NSError (Pebble)\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode and with an underlying NSError object.\n *  @param code The error code for which to create the error\n *  @param error The underlying error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code underLyingError:(NSError*)error;\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode.\n *  @param code The error code for which to create the error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code;\n\n@end"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBLog.h",
    "content": "//\n//  PBLog.h\n//  PebbleApp\n//\n//  Created by Martijn The on 11/29/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import \"DDLog.h\"\n\n#ifndef PBWSLOG_CONTEXT\n#define PBWSLOG_CONTEXT 1\n#endif\n\nextern int PBLogLevel;\n\n#define LogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define WSLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n\n#define LogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBPebbleCentral.h",
    "content": "//\n//  PBPebbleCentral.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class PBWatch;\n@class PBDataLoggingService;\n@protocol PBPebbleCentralDelegate;\n\n/**\n PebbleCentral plays the central role for client iOS apps (e.g. RunKeeper).\n */\n@interface PBPebbleCentral : NSObject\n\n/**\n @returns The default central singleton instance.\n */\n+ (PBPebbleCentral*)defaultCentral;\n\n/**\n *  Enables debug logs. The logs will be routed to the system log (ASL) and\n *  console. It is advised to call this before making any other calls to PebbleKit.\n */\n+ (void)setDebugLogsEnabled:(BOOL)logsEnabled;\n\n/**\n The watches that are currently connected. Do not cache the array because it can change over time.\n */\n@property (nonatomic, readonly, strong) NSArray *connectedWatches;\n\n/**\n The watches that are stored in the user preferences of the application.\n */\n@property (nonatomic, readonly, strong) NSArray *registeredWatches;\n\n/**\n The central's delegate.\n */\n@property (nonatomic, readwrite, weak) id<PBPebbleCentralDelegate> delegate;\n\n/**\n *  The UUID is used as the identifier of the watch application and is used\n *  to make sure that appMessage and dataLogging communications arrives at its companion app\n *  on the other device (and not in another app).\n *  For most app message methods there is are two variants: one that does not take a UUID parameter and one that does take\n *  a UUID parameter (for example, -appMessagesAddReceiveUpdateHandler: vs appMessagesAddReceiveUpdateHandler:withUUID:).\n *  The methods that do not take a UUID, will use the UUID as set prior to this property.\n *  @param uuid The 16 byte UUID of your app.\n *  @note The UUID needs to be set before using either app message or data logging.\n */\n@property (nonatomic, strong, readwrite) NSData *appUUID;\n\n/**\n *  Verifies the currently set application UUID.\n *  @return YES if the currently set UUID is valid, NO if it is not.\n *  @see -setAppUuid:\n */\n- (BOOL)hasValidAppUUID;\n\n/**\n @returns YES if the Pebble iOS app is installed, NO if it is not installed.\n */\n- (BOOL)isMobileAppInstalled;\n\n/**\n Redirects to Pebble in the App Store, so the user can install the app.\n */\n- (void)installMobileApp;\n\n/**\n Wipes out the data associated with the registered watches, that is stored on the phone.\n */\n- (void)unregisterAllWatches;\n\n/**\n Returns the most recently connected watch from the -registeredWatches array.\n */\n- (PBWatch*)lastConnectedWatch;\n\n@property (nonatomic, readonly) PBDataLoggingService *dataLoggingService;\n\n@end\n\n\n@protocol PBPebbleCentralDelegate <NSObject>\n@optional\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was connected.\n @param isNew YES if the watch has been connected for the first time since the app has been installed or NO if not.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidConnect:(PBWatch*)watch isNew:(BOOL)isNew;\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was disconnected.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidDisconnect:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+AppMessages.h",
    "content": "//\n//  PBWatch+AppMessages.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\ntypedef NS_ENUM(UInt8, PBAppState) {\n  PBAppStateNotRunning = 0x00,\n  PBAppStateRunning = 0x01,\n};\n\n@interface PBWatch (AppMessages)\n\n/**\n *  Queries the watch whether AppMessages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isAppMessagesSupported YES if AppMessages are supported, NO if not.\n */\n- (void)appMessagesGetIsSupported:(void(^)(PBWatch *watch, BOOL isAppMessagesSupported))fetchedBlock;\n\n/**\n *  Pushes an update to the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Pushes an update to the watch application with the specified UUID.\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watchapp to which the update should be sent.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary withUUID:(NSData*)uuid onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with the specified UUID.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @param uuid The UUID of the watchapp for which sent messages should be handled by the onReceive block.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive withUUID:(NSData*)uuid;\n\n/**\n *  Add a handler for lifecycle events of watch applications.\n *  @param onLifecycleUpdate This block will be called when an application starts and\n *  stops running.\n *  @param watch The watch that has sent the event.\n *  @param uuid The uuid of the application that caused the event.\n *  @param newAppState The new state of the app (either PBAppStateNotRunning or PBAppStateRunning).\n */\n- (id)appMessagesAddAppLifecycleUpdateHandler:(void(^)(PBWatch *watch, NSUUID *uuid,\n                                                       PBAppState newAppState))onLifecycleUpdate;\n\n\n// INTERNAL USE ONLY\n- (id)appMessagesAddReceiveAllUpdatesHandler:(BOOL(^)(PBWatch *watch, NSUUID *uuid, NSDictionary *update))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -appMessagesAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -appMessagesAddReceiveUpdateHandler:\n *  @see -appMessagesAddReceiveUpdateHandler:\n */\n- (void)appMessagesRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Fetches the run state of the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]. You can use this method to determine whether the watch\n *  application is running or not.\n *  TODO: Ask Francois how this API works.\n *  @param onSent The block that will be called after the fetch state command has been\n *  sent to the watch.\n */\n- (void)appMessagesFetchAppState:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with the specified UUID.\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n/**\n *  Sends a command to kill the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to kill the watch application with the specified UUID.\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+Golf.h",
    "content": "//\n//  PBWatch+Golf.h\n//  PebbleKit\n//\n//  Created by Martijn The on 4/4/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n@interface PBWatch (Golf)\n\n/**\n *  The UUID of the Golf watch app.\n */\nextern NSData *PBGolfUUID;\n\n/**\n *  The key of the \"Front\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfFrontKey;\n\n/**\n *  The key of the \"Mid\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfMidKey;\n\n/**\n *  The key of the \"Back\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfBackKey;\n\n/**\n *  The key of the \"Hole\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfHoleKey;\n\n/**\n *  The key of the \"Par\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfParKey;\n\n/**\n *  The command IDs that can be sent back by the Golf watch app.\n *  @see -golfAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  GolfAppCommandPrevious = 0x01,\n  GolfAppCommandNext = 0x02,\n  GolfAppCommandSelect = 0x03,\n} GolfAppCommand;\n\n/**\n *  Queries the watch whether Golf Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isGolfSupported YES if Golf Messages are supported, NO if not.\n */\n- (void)golfGetIsSupported:(void(^)(PBWatch *watch, BOOL isGolfSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends an update to the golf app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey, PBGolfParKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n *  @see PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey and PBGolfParKey\n */\n- (void)golfAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Golf updates that are send by the Golf watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param command The command as sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -golfAppRemoveUpdateHandler:\n *  @see GolfAppCommand\n *  @see -golfAppRemoveUpdateHandler:\n */\n- (id)golfAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, GolfAppCommand command))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -golfAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -golfAppAddReceiveUpdateHandler:\n *  @see -golfAppAddReceiveUpdateHandler:\n */\n- (void)golfAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the golf app on the watch.\n *  @discussion It is recommended to perform this as the first call after -golfGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+Ping.h",
    "content": "//\n//  PBWatch+Ping.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/14/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n@interface PBWatch (Ping)\n\n/**\n * Sends a ping to the watch.\n * @param cookie A number identifying the ping.\n * @param onPong The block handler that will be called when the \"pong\" reply from the watch has been received.\n * @param watch The watch that sent the \"pong\" reply, which is \"self\". It is passed in to avoid retain loops.\n * @param cookie The cookie that was initially passed when calling this method.\n * @param onTimeout The block handler that will be called when the watch failed to reply in time.\n */\n- (void)pingWithCookie:(UInt32)cookie onPong:(void(^)(PBWatch *watch, UInt32 cookie))onPong onTimeout:(void(^)(PBWatch *watch, UInt32 cookie))onTimeout;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+PollServices.h",
    "content": "//\n//  PBWatch+PollServices.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n * PollServiceType\n */ \n\n\nenum {\n  PBPollRemoteServiceMail = 0,\n  PBPollRemoteServiceDataLogging = 1,\n  PBNumPollRemoteServices\n};\ntypedef UInt8 PBPollRemoteServiceType;\n\n@interface PBWatch (PollServices)\n// Call this upon connect with the watch to add handlers:\n- (id)addPollServicesHandler:(void(^)(PBWatch *))handler forService:(PBPollRemoteServiceType)service interval:(UInt8)interval;\n- (void)sendPollRequestForService:(PBPollRemoteServiceType)service;\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+Sports.h",
    "content": "//\n//  PBWatch+Sports.h\n//  PebbleKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n/**\n *  The UUID of the Sports watch app.\n */\nextern NSData *PBSportsUUID;\n\n/**\n *  The key of the \"Time\" field.\n *  The accompanying value must be an NSString (max. ~8 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsTimeKey;\n\n/**\n *  The key of the \"Distance\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDistanceKey;\n\n/**\n *  The key of the general purpose \"Data\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDataKey;\n\n/**\n *  The key of the \"Activity State\".\n *  The value must be an NSNumber created using +[NSNumber numberWithUint8:].\n *  @see SportsAppActivityState for valid values to use\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsActivityStateKey;\n\n/**\n *  Instances of this convenience class represent an update of the current time, distance and pace,\n *  and has a method to convert the values into a dictionary that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n@interface PBSportsUpdate : NSObject\n\n/**\n *  The current time in seconds. The possible range is currently limited from -7140. to 7140., inclusive. (±1h 59min 59sec).\n */\n@property (nonatomic, readwrite, assign) NSTimeInterval time;\n\n/**\n *  The current distance in km or mi. The possible range is currently limited from -99.9 to 99.9, inclusive.\n *  The unit of distance is dependent on the current unit setting.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float distance;\n\n/**\n *  General purpose data variable. The possible range is currently limited from -99.99 to 99.99, inclusive.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float data;\n\n/**\n *  Convenience method to create an update object.\n */\n+ (PBSportsUpdate*)updateWithTime:(NSTimeInterval)time distance:(float)distance data:(float)data;\n\n/**\n *  Creates an update dictionary from the receiver, that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n- (NSDictionary*)dictionary;\n\n/**\n *  Creates a formatted time string with from a total seconds value, formatted as \"h:mm:ss\".\n *  For example, supplying the value 3930.0f seconds will return @\"1:05:30\"\n *  @param seconds The number of seconds from which to create the time string.\n *  @return Formatted time as \"h:mm:ss\"\n */\n+ (NSString*)timeStringFromFloat:(float)seconds;\n\n@end\n\n@interface PBWatch (Sports)\n\n/**\n *  The state of the Sports activity.\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  SportsAppActivityStateInit = 0x00,\n  SportsAppActivityStateRunning = 0x01,\n  SportsAppActivityStatePaused = 0x02,\n  SportsAppActivityStateEnd = 0x03,\n} SportsAppActivityState;\n\n/**\n *  Queries the watch whether Sports Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isSportsSupported YES if Sports Messages are supported, NO if not.\n */\n- (void)sportsGetIsSupported:(void(^)(PBWatch *watch, BOOL isSportsSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the preferred\n *  unit system, either metric or imperial.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetMetric:(BOOL)isMetric onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents,\n *  to set the preferred  data label (either PACE or SPEED) and corresponding units.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetLabel:(BOOL)isPace onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the state of the\n *  sports activity. Currently only SportsAppActivityStateRunning and SportsAppActivityStatePaused are\n *  supported.\n *  @param state The new sports activity state\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetActivityState:(SportsAppActivityState)state onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends the update to the sports app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBSportsTimeKey, PBSportsPaceKey, PBSportsDistanceKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Sports updates that are send by the Sports watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param state The new sports activity state as set by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -sportsAppRemoveUpdateHandler:\n *  @see SportsAppActivityState\n *  @see -sportsAppRemoveUpdateHandler:\n */\n- (id)sportsAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, SportsAppActivityState state))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -sportsAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -sportsAppAddReceiveUpdateHandler:\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\n- (void)sportsAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the sports app on the watch.\n *  @discussion It is recommended to perform this as the first call after -sportsGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+Version.h",
    "content": "//\n//  PBWatch+Version.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/17/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  PBFirmwareVersion is a helper class that is able to parse the versionTag string\n *  into its components (os, major, minor, suffix) and facilitate comparisons\n *  between versions.\n *  Valid versions follow the following format:\n *  `vOS(.MAJOR(.MINOR(-SUFFIX)))`\n *  Where the fields OS, MAJOR, MINOR are positive, decimal integer numbers and SUFFIX\n *  an arbitrary string. MAJOR, MINOR and SUFFIX are optional (nested optionality).\n *  Examples of valid versions:\n *  `v1`\n *  `v2.1234.99-alpha-beta-gamma`\n */\n@interface PBFirmwareVersion : NSObject\n/**\n *  The OS version component.\n */\n@property (nonatomic, readonly) NSInteger os;\n\n/**\n *  The major version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger major;\n\n/**\n *  The minor version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger minor;\n\n/**\n *  The release suffix, which is the part following the dash '-'.\n *  @note If a version tag string does not contain a suffix, it will be set to an empty string.\n *  @discussion The release suffix is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *suffix;\n\n/**\n *  The version timestamp.\n *  @note The timestamp is in the final comparison equation, in the -compare: method, after evaluating\n *  os, major and minor components.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The version's git commit hash.\n *  @discussion The commit hash is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *commitHash;\n\n/**\n *  The version's git tag.\n */\n@property (nonatomic, readonly, copy) NSString *tag;\n\n/**\n *  Creates a PBFirmwareVersion object given a tag string and timestamp.\n */\n+ (PBFirmwareVersion*)firmwareVersionWithTag:(NSString*)tag commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Creates a PBFirmwareVersion object given its components.\n *  @discussion The tag string will be set to the canonical format vOS.MINOR.MAJOR(-SUFFIX).\n */\n+ (PBFirmwareVersion*)firmwareVersionWithOS:(NSInteger)os major:(NSInteger)major minor:(NSInteger)minor suffix:(NSString*)suffix commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Compares the receiver to another version object.\n *  @param aVersion The version to compare with the receiver.\n *  @return NSOrderedAscending if the value of aVersion is greater than the receiver’s,\n *  NSOrderedSame if they’re equal, and NSOrderedDescending if the value of aVersion is less than the receiver’s.\n */\n- (NSComparisonResult)compare:(PBFirmwareVersion *)aVersion;\n\n/**\n *  Convenience wrappers around -compare:\n */\n- (BOOL)isEqualOrNewer:(PBFirmwareVersion *)other;\n- (BOOL)isNewer:(PBFirmwareVersion *)other;\n- (BOOL)isEqualVersionOnly:(PBFirmwareVersion *)other;\n\n@end\n\n\n\n/**\n *  Values specifying the Pebble hardware platform variant.\n */\ntypedef enum {\n  FirmwareMetadataPlatformUnknown = 0,\n  FirmwareMetadataPlatformPebbleOneEV1 = 1,\n  FirmwareMetadataPlatformPebbleOneEV2 = 2,\n  FirmwareMetadataPlatformPebbleOneEV2_3 = 3,\n  FirmwareMetadataPlatformPebbleOneEV2_4 = 4,\n  FirmwareMetadataPlatformPebbleOnePointFive = 5,\n  FirmwareMetadataPlatformPebbleTwoPointZero = 6,\n  FirmwareMetadataPlatformPebbleOneBigboard = 0xff,\n  FirmwareMetadataPlatformPebbleOneBigboard2 = 0xfe,\n} FirmwareMetadataPlatform;\n\n/**\n *  Instances of PBFirmwareMetadata describe a firmware in terms of\n *  its version, whether it is a recovery firmware and its intended hardware\n *  platform.\n *  @see PBVersionInfo\n */\n\n@interface PBFirmwareMetadata : NSObject\n\n/**\n *  The version of the firmware.\n *  @see PBFirmwareVersion\n */\n@property (nonatomic, readonly) PBFirmwareVersion *version;\n\n/**\n *  YES if the firmware is a recovery firmware, NO if it is a regular firmware.\n */\n@property (nonatomic, readonly) BOOL isRecoveryFirmware;\n\n/**\n *  The hardware platform variant with which the firmware is compatible.\n */\n@property (nonatomic, readonly) FirmwareMetadataPlatform hardwarePlatform;\n\n/**\n *  Converts a <FirmwareMetadataPlatform> value to a string.\n *  @param hardwarePlatform The hardware platform value to convert\n *  @return A string of the hardware platform\n */\n+ (NSString*)hardwarePlatformToString:(FirmwareMetadataPlatform)hardwarePlatform;\n\n/**\n *  Converts an NSString hardware platform string to the corresponding\n *  FirmwareMetadataPlatform value.\n *  @param hardwarePlatformString The string representing the hardware platform.\n *  @return The hardware platform enum value\n */\n+ (FirmwareMetadataPlatform)stringToHardwarePlatform:(NSString *)hardwarePlatformString;\n\n@end\n\n/**\n *  Instances of PBResourceMetadata describe (system) resources.\n *  @see PBVersionInfo\n */\n\n@interface PBResourceMetadata : NSObject\n\n/**\n *  The version of the resources as the Epoch timestamp of the Git commit.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The checksum of the resources.\n */\n@property (nonatomic, readonly) UInt32 crc;\n\n/**\n *  The human-friendly string version of the resources.\n */\n@property (nonatomic, readonly, strong) NSString *friendlyVersion;\n\n/**\n *  YES if the metadata represents valid resources, NO if it does not.\n */\n- (BOOL)isValid;\n\n@end\n\n/**\n *  An instance of PBVersionInfo describes all the different system software (Pebble OS)\n *  on a Pebble watch and other auxiliary information.\n *  @see PBWatch\n */\n\n@interface PBVersionInfo : NSObject\n\n/**\n *  The metadata of the firmware that is running.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *runningFirmwareMetadata;\n\n/**\n *  The metadata of the recovery firmware that is in storage.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *recoveryFirmwareMetadata;\n\n/**\n *  The metadata of the system resources.\n */\n@property (nonatomic, readonly, strong) PBResourceMetadata *systemResources;\n\n/**\n *  The version of the bootloader.\n */\n@property (nonatomic, readonly) UInt32 bootloaderVersion;\n\n/**\n *  The version of the hardware.\n */\n@property (nonatomic, readonly, strong) NSString *hardwareVersion;\n\n/**\n *  The serial number.\n */\n@property (nonatomic, readonly, strong) NSString *serialNumber;\n\n/**\n *  The current Bluetooth device address.\n */\n@property (nonatomic, readonly, strong) NSData *deviceAddress;\n\n/**\n *  YES if valid recovery firmware is installed, NO if not.\n */\n- (BOOL)hasRecoveryFirmware;\n\n/**\n *  YES if valid system resources are installed, NO if not.\n */\n- (BOOL)hasSystemResources;\n\n@end\n\n@interface PBWatch (Version)\n\n/**\n *  Requests the version info from the receiver.\n *  @param handler The handler that will be called when the version info response has been received.\n *  @param onTimeout The handler that will be called if the watch did not respond within 5 seconds.\n *  @param watch The watch for which the version info was requested.\n *  @param versionInfo The version info response.\n *  @discussion The <PBVersionInfo> response will be cached. The latest version info can be\n *  accessed through the <versionInfo> property of <PBWatch>.\n */\n- (void)getVersionInfo:(void (^)(PBWatch *watch, PBVersionInfo *versionInfo))handler onTimeout:(void (^)(PBWatch *watch))onTimeout;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch.h",
    "content": "//\n//  PBWatch.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@protocol PBWatchDelegate;\n@class PBVersionInfo;\n@class PBDataLoggingService;\n\n/**\n *  Represents a Pebble watch.\n *\n *  On iOS, there is the notion of a \"communication session\" between an app and\n *  the Pebble watch. You can imagine this as a \"data pipe\" directly from the\n *  watch to your app. However, there is only one session for 3rd party apps.\n *  This one session has to be shared among all 3rd party apps that want to\n *  communicate with Pebble (excluding the official Pebble iOS app).\n *\n *  Unfortunately, the session can only be opened from the phone app. This means\n *  that the iOS app has to start talking to the watch first to open the\n *  communications channel; the other way around is not possible.\n *  Most methods in the PBWatch categories (Ping), (Version), (Sports), (Golf)\n *  and (AppMessages) all implicitly open the shared communication session.\n *\n *  Lastly, iOS provides no good way to manage how the one shared session is\n *  accessed or used. Simply, the last iOS app to try to open it, wins and gets\n *  to use it. Therefore, it is important that your iOS app does **not** try\n *  communicate when a Pebble is connected.\n *\n *  When the user has stopped using your app (e.g. when going to the background\n *  or when explicitely stopping a certain activity in the app) your iOS app\n *  should close the communication session using the -closeSession: method.\n */\n@interface PBWatch : NSObject\n\n/**\n *  YES if the receiver is connected and NO if the receiver is disconnected.\n *  @discussion This property is KVO-compliant.\n */\n@property (nonatomic, readonly, getter=isConnected) BOOL connected;\n\n/**\n *  The human-friendly name of the receiver.\n *  This is the same name as the user will see in the iOS Bluetooth Settings.\n */\n@property (nonatomic, readonly) NSString *name;\n\n/**\n *  The serial number of the receiver.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  The versionInfo of the receiver.\n *  @see PBVersionInfo\n */\n@property (nonatomic, readonly) PBVersionInfo *versionInfo;\n\n/**\n *  The delegate of the watch that will be notified of disconnections and errors.\n *  @see PBWatchDelegate\n */\n@property (nonatomic, readwrite, weak) id<PBWatchDelegate> delegate;\n\n/**\n *  The userInfo property can be used to associate application specific data\n *  with the watch. Note that the application itself is responsible for persisting\n *  the information if neccessary.\n */\n@property (nonatomic, readwrite, strong) id userInfo;\n\n/**\n *  The date when the watch was last known to be connected.\n *  This date will be updated automatically when the watch connects and\n *  disconnects. While the watch is being connected, this date will not be updated.\n */\n@property (nonatomic, readonly) NSDate *lastConnectedDate;\n\n/**\n *  Developer-friendly debugging description of the watch.\n *  @return localized, user-friendly summary of the receiver, including\n *  software and hardware version information, if available.\n */\n- (NSString*)friendlyDescription;\n\n/**\n *  Closes the communication session with the watch.\n *  Since there is only one, shared session for all 3rd party iOS apps,\n *  an app should close the session after the user is done using the app/watch-integration,\n *  so it can be used by other apps.\n *  The communication session is implicitely opened automatically when needed.\n *  @param onDone Callback block that will be called after the closing of the session\n *  has completed. If there is no open session, the onDone block will (also) be executed\n *  asynchronously on the calling queue.\n */\n- (void)closeSession:(void(^)(void))onDone;\n\n@end\n\n@protocol PBWatchDelegate <NSObject>\n@optional\n\n/**\n *  Called when the watch got disconnected.\n */\n- (void)watchDidDisconnect:(PBWatch*)watch;\n\n/**\n *  Called when the watch caught an error.\n */\n- (void)watch:(PBWatch*)watch handleError:(NSError*)error;\n\n/**\n *  Called when the internal EASession is about to be reset.\n */\n- (void)watchWillResetSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is opened\n */\n- (void)watchDidOpenSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is closed\n */\n- (void)watchDidCloseSession:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PebbleKit.h",
    "content": "//\n//  PebbleSDK.h\n//  PebbleSDK\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#import <PebbleKit/PBWatch.h>\n#import <PebbleKit/PBPebbleCentral.h>\n#import <PebbleKit/PBWatch+Ping.h>\n#import <PebbleKit/PBWatch+Version.h>\n#import <PebbleKit/PBErrors.h>\n#import <PebbleKit/PBWatch+AppMessages.h>\n#import <PebbleKit/NSNumber+stdint.h>\n#import <PebbleKit/PBWatch+Sports.h>\n#import <PebbleKit/PBWatch+Golf.h>\n#import <PebbleKit/PBBitmap.h>\n#import <PebbleKit/PBDataLoggingService.h>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/gtypes.h",
    "content": "//\n//  gtypes.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#ifndef PebbleKit_gtypes_h\n#define PebbleKit_gtypes_h\n\ntypedef struct GSize {\n  int16_t w;\n  int16_t h;\n} GSize;\n\ntypedef struct GPoint {\n  int16_t x;\n  int16_t y;\n} GPoint;\n\ntypedef struct GRect {\n  GPoint origin;\n  GSize size;\n} GRect;\n\n#endif\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/NSDictionary+Pebble.h",
    "content": "//\n//  NSDictionary+Pebble.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSDictionary (Pebble)\n\n/**\n *  Serializes the receiver into a Pebble dict.\n *  @note The receiver dictionary must comply to the following constraints:\n *  * The keys must be instances of NSNumber. Their -unsignedLongValue return value will be used as final key.\n *  * The values must be instances of either NSString, NSData or NSNumber. Use the NSNumber (stdint) category\n *  to specify the signedness and width of NSNumbers.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryUnsupportedKeyClass,\n *  PBErrorCodeDictionaryUnsupportedValueClass or PBErrorCodeDictionaryUnsupportedValueClass.\n *  @see -dictionaryFromPebbleDictionaryDataWithError:\n */\n- (NSData*)pebbleDictionaryData:(NSError * __autoreleasing *)error;\n\n@end\n\n@interface NSData (Pebble)\n\n/**\n *  Interprets the receiver as Pebble dict data and deserializes it into an NSDictionary.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryInternalConsistency.\n *  @see -pebbleDictionaryData:\n */\n- (NSDictionary*)dictionaryFromPebbleDictionaryDataWithError:(NSError * __autoreleasing *)error;\n\n@end"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/NSNumber+stdint.h",
    "content": "//\n//  NSNumber+stdint.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/**\n *  This category exposes the capabilities the underlying CFNumber to explicitely\n *  store the signedness and the width of the storage.\n */\n\n@interface NSNumber (stdint)\n\n/**\n *  Interprets the receiver as a 32-bits wide, unsigned integer.\n */\n- (uint32_t)uint32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, unsigned integer.\n */\n- (uint16_t)uint16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, unsigned integer.\n */\n- (uint8_t)uint8Value;\n\n/**\n *  Interprets the receiver as a 32-bits wide, signed integer.\n */\n- (int32_t)int32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, signed integer.\n */\n- (int16_t)int16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, signed integer.\n */\n- (int8_t)int8Value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint32:(uint32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint16:(uint16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint8:(uint8_t)value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt32:(int32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt16:(int16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt8:(int8_t)value;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a floating pointer number or not.\n */\n- (BOOL)isFloat;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a signed integer or not.\n */\n- (BOOL)isSigned;\n\n/**\n *  Gets the width in bytes of the integer that is stored by the receiver.\n */\n- (uint8_t)width;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBBitmap.h",
    "content": "//\n//  PBBitmap.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIImage.h>\n#import <PebbleKit/gtypes.h>\n\n/**\n *  Helper class to convert a UIImage to Pebble bitmap pixel data and GBitmap metadata.\n *  Refer to the documentation of Pebble's native watch app SDK on the GBitmap format.\n */\n\n@interface PBBitmap : NSObject\n\n/**\n *  The pixel data of the bitmap.\n *  This corresponds to the data as pointed to by GBitmap's `addr` field.\n */\n@property (nonatomic, readonly, strong) NSData *pixelData;\n\n/**\n *  The number of bytes per row.\n *  Always a multiple of 4 bytes.\n */\n@property (nonatomic, readonly, assign) uint16_t rowSizeBytes;\n\n/**\n *  Bitfield of metadata flags.\n *  This corresponds to GBitmap's `info_flags` field.\n */\n@property (nonatomic, readonly, assign) uint16_t infoFlags;\n\n/**\n *  The box of bits inside `pixelData`, that contains\n *  the actual image data to use.\n *  This corresponds to GBitmap's `bounds` field.\n */\n@property (nonatomic, readonly, assign) GRect bounds;\n\n/**\n *  Factory method to create a PBBitmap from a UIImage instance.\n *  @param image The UIImage from which to create the PBBitmap\n */\n+ (PBBitmap*)pebbleBitmapWithUIImage:(UIImage*)image;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBDataLoggingService.h",
    "content": "//\n//  PBDataLoggingService.h\n//  PebbleKit\n//\n//  Created by Martijn The on 7/19/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  Data logging datatypes.\n */\nenum {\n  //! Array of bytes\n  PBDataLoggingTypeByteArray = 0,\n  //! unsigned integer\n  PBDataLoggingTypeUInt = 2,\n  //! signed integer\n  PBDataLoggingTypeInt = 3,\n};\ntypedef UInt8 PBDataLoggingType;\n\n/**\n *  The metadata of a data logging session. Used to identify a session.\n */\n@interface PBDataLoggingSessionMetadata : NSObject <NSSecureCoding, NSCopying>\n\n/**\n *  A tag associated with the session.\n */\n@property (nonatomic, readonly) UInt32 tag;\n\n/**\n *  The timestamp of the moment the session was created by the watchapp.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The type of data stored in this session.\n */\n@property (nonatomic, readonly) PBDataLoggingType type;\n\n/**\n *  The size of a data item.\n */\n@property (nonatomic, readonly) UInt16 itemSize;\n\n/**\n *  The serial number of the watch that created the sessions.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  Creates a new data logging session metadata object, given all its property values.\n *  This method is provided to create a metadata object that can be used to\n *  compare it with a metadata object that is passed into one of the\n *  PBDataLoggingServiceDelegate methods.\n *  @param tag The tag associated with the session\n *  @param timestamp The timestamp of the creation of the session\n *  @param type The type of data stored in the session\n *  @param itemSize The size of a data item\n *  @param serialNumber The serial number of the watch that created the session\n *  @return A session metadata object with the specified information\n */\n+ (id)metadataWithTag:(UInt32)tag\n            timestamp:(UInt32)timestamp\n                 type:(PBDataLoggingType)type\n             itemSize:(UInt16)itemSize\n         serialNumber:(NSString *)serialNumber;\n\n/**\n *  Tests the equality of two data logging session metadata objects.\n *  This method can be used to compare two session metadata objects\n *  to check whether they are referring to the same session or not.\n *  @param sessionMetadata\n *  @return YES if all the property values of receiver are equal to the property\n *  values of the given session.\n *  @note Equivalent to -[PBDataLoggingSessionMetadata isEqual:]\n */\n- (BOOL)isEqualToDataLoggingSessionMetadata:(PBDataLoggingSessionMetadata *)sessionMetadata;\n@end\n\n/**\n *  Data logging delegate protocol. The object that implements this protocol\n *  is responsible for handling incoming data.\n */\n@protocol PBDataLoggingServiceDelegate <NSObject>\n@optional\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param bytes Pointer to the array of bytes.\n *  The array contains (numberOfItems * session.itemSize) bytes.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasByteArrays:(const UInt8 * const)bytes numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt8s:(const UInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt16s:(const UInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt32s:(const UInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt8s:(const SInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt16s:(const SInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt32s:(const SInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time a session is finished.\n *  This is guaranteed to be called only after all data has been received and\n *  consumed by the application.\n *  @param service The data logging service.\n *  @param session The metadata of the session.\n */\n- (void)dataLoggingService:(PBDataLoggingService *)service sessionDidFinish:(PBDataLoggingSessionMetadata *)session;\n\n@end\n\n/**\n *  The data logging service. Assign a delegate object in order to receive\n *  data from your watchapp.\n */\n@interface PBDataLoggingService : NSObject\n\n/**\n *  The delegate that has the responsility of handling callbacks from the\n *  data logging service.\n */\n@property (atomic, readwrite, weak) id<PBDataLoggingServiceDelegate> delegate;\n\n/**\n *  Sets the queue on which delegate methods will be executed.\n *  Callbacks are intended to be processed in the order as they come in, so it\n *  you must use a serial queue. If set to nil (default) the main queue is used.\n *  @param delegateQueue The queue on which the delegate methods will be executed.\n */\n- (void)setDelegateQueue:(dispatch_queue_t)delegateQueue;\n\n/**\n * Query the watch for data logging data.\n */\n- (void)pollForData;\n  \n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBErrors.h",
    "content": "//\n//  PBErrors.h\n//  PebbleSDK\n//\n//  Created by Martijn The on 7/26/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nextern NSString *PBErrorDomain;\n\n/**\n *  PebbleKit Error codes.\n *  Inspect the localizedDescription of any NSError objects for a description.\n */\n\ntypedef enum {\n  PBErrorCodeNoSupportedProtocolsInInfoPlist,\n  PBErrorCodeErrorCreatingSession,\n  PBErrorCodeOutputStreamError,\n  PBErrorCodeInputStreamError,\n  PBErrorCodeSendMessageTimeout,\n  PBErrorCodeEndpointDisallowed,\n  PBErrorCodeVersionInfoTimeout,\n  PBErrorCodeCannotCreateSessionWhileClosing,\n  PBErrorCodeNoAppUUID,\n  PBErrorCodeAppMessageRejected,\n  PBErrorCodeAppMessageAckTimeout,\n  PBErrorCodeDictionaryUnsupportedKeyClass,\n  PBErrorCodeDictionaryUnsupportedValueClass,\n  PBErrorCodeDictionaryInternalConsistency,\n  PBErrorCodeInvalidArguments,\n  PBErrorCodePebbleAppUnreachable,\n  PBErrorCodePebbleAppRequestTimeout,\n  PBErrorCodePebbleAppEmptyResponse,\n  PBErrorCodePebbleAppUnexpectedResponse,\n  PBErrorCodeServerNotAvailable,\n  PBErrorCodeDownloadFailed,\n  PBErrorCodePebbleNotConnected\n} PBErrorCode;\n\n@interface NSError (Pebble)\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode and with an underlying NSError object.\n *  @param code The error code for which to create the error\n *  @param error The underlying error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code underLyingError:(NSError*)error;\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode.\n *  @param code The error code for which to create the error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code;\n\n@end"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBLog.h",
    "content": "//\n//  PBLog.h\n//  PebbleApp\n//\n//  Created by Martijn The on 11/29/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import \"DDLog.h\"\n\n#ifndef PBWSLOG_CONTEXT\n#define PBWSLOG_CONTEXT 1\n#endif\n\nextern int PBLogLevel;\n\n#define LogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define WSLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n\n#define LogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBPebbleCentral.h",
    "content": "//\n//  PBPebbleCentral.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class PBWatch;\n@class PBDataLoggingService;\n@protocol PBPebbleCentralDelegate;\n\n/**\n PebbleCentral plays the central role for client iOS apps (e.g. RunKeeper).\n */\n@interface PBPebbleCentral : NSObject\n\n/**\n @returns The default central singleton instance.\n */\n+ (PBPebbleCentral*)defaultCentral;\n\n/**\n *  Enables debug logs. The logs will be routed to the system log (ASL) and\n *  console. It is advised to call this before making any other calls to PebbleKit.\n */\n+ (void)setDebugLogsEnabled:(BOOL)logsEnabled;\n\n/**\n The watches that are currently connected. Do not cache the array because it can change over time.\n */\n@property (nonatomic, readonly, strong) NSArray *connectedWatches;\n\n/**\n The watches that are stored in the user preferences of the application.\n */\n@property (nonatomic, readonly, strong) NSArray *registeredWatches;\n\n/**\n The central's delegate.\n */\n@property (nonatomic, readwrite, weak) id<PBPebbleCentralDelegate> delegate;\n\n/**\n *  The UUID is used as the identifier of the watch application and is used\n *  to make sure that appMessage and dataLogging communications arrives at its companion app\n *  on the other device (and not in another app).\n *  For most app message methods there is are two variants: one that does not take a UUID parameter and one that does take\n *  a UUID parameter (for example, -appMessagesAddReceiveUpdateHandler: vs appMessagesAddReceiveUpdateHandler:withUUID:).\n *  The methods that do not take a UUID, will use the UUID as set prior to this property.\n *  @param uuid The 16 byte UUID of your app.\n *  @note The UUID needs to be set before using either app message or data logging.\n */\n@property (nonatomic, strong, readwrite) NSData *appUUID;\n\n/**\n *  Verifies the currently set application UUID.\n *  @return YES if the currently set UUID is valid, NO if it is not.\n *  @see -setAppUuid:\n */\n- (BOOL)hasValidAppUUID;\n\n/**\n @returns YES if the Pebble iOS app is installed, NO if it is not installed.\n */\n- (BOOL)isMobileAppInstalled;\n\n/**\n Redirects to Pebble in the App Store, so the user can install the app.\n */\n- (void)installMobileApp;\n\n/**\n Wipes out the data associated with the registered watches, that is stored on the phone.\n */\n- (void)unregisterAllWatches;\n\n/**\n Returns the most recently connected watch from the -registeredWatches array.\n */\n- (PBWatch*)lastConnectedWatch;\n\n@property (nonatomic, readonly) PBDataLoggingService *dataLoggingService;\n\n@end\n\n\n@protocol PBPebbleCentralDelegate <NSObject>\n@optional\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was connected.\n @param isNew YES if the watch has been connected for the first time since the app has been installed or NO if not.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidConnect:(PBWatch*)watch isNew:(BOOL)isNew;\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was disconnected.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidDisconnect:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+AppMessages.h",
    "content": "//\n//  PBWatch+AppMessages.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\ntypedef NS_ENUM(UInt8, PBAppState) {\n  PBAppStateNotRunning = 0x00,\n  PBAppStateRunning = 0x01,\n};\n\n@interface PBWatch (AppMessages)\n\n/**\n *  Queries the watch whether AppMessages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isAppMessagesSupported YES if AppMessages are supported, NO if not.\n */\n- (void)appMessagesGetIsSupported:(void(^)(PBWatch *watch, BOOL isAppMessagesSupported))fetchedBlock;\n\n/**\n *  Pushes an update to the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Pushes an update to the watch application with the specified UUID.\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watchapp to which the update should be sent.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary withUUID:(NSData*)uuid onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with the specified UUID.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @param uuid The UUID of the watchapp for which sent messages should be handled by the onReceive block.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive withUUID:(NSData*)uuid;\n\n/**\n *  Add a handler for lifecycle events of watch applications.\n *  @param onLifecycleUpdate This block will be called when an application starts and\n *  stops running.\n *  @param watch The watch that has sent the event.\n *  @param uuid The uuid of the application that caused the event.\n *  @param newAppState The new state of the app (either PBAppStateNotRunning or PBAppStateRunning).\n */\n- (id)appMessagesAddAppLifecycleUpdateHandler:(void(^)(PBWatch *watch, NSUUID *uuid,\n                                                       PBAppState newAppState))onLifecycleUpdate;\n\n\n// INTERNAL USE ONLY\n- (id)appMessagesAddReceiveAllUpdatesHandler:(BOOL(^)(PBWatch *watch, NSUUID *uuid, NSDictionary *update))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -appMessagesAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -appMessagesAddReceiveUpdateHandler:\n *  @see -appMessagesAddReceiveUpdateHandler:\n */\n- (void)appMessagesRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Fetches the run state of the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]. You can use this method to determine whether the watch\n *  application is running or not.\n *  TODO: Ask Francois how this API works.\n *  @param onSent The block that will be called after the fetch state command has been\n *  sent to the watch.\n */\n- (void)appMessagesFetchAppState:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with the specified UUID.\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n/**\n *  Sends a command to kill the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to kill the watch application with the specified UUID.\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+Golf.h",
    "content": "//\n//  PBWatch+Golf.h\n//  PebbleKit\n//\n//  Created by Martijn The on 4/4/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n@interface PBWatch (Golf)\n\n/**\n *  The UUID of the Golf watch app.\n */\nextern NSData *PBGolfUUID;\n\n/**\n *  The key of the \"Front\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfFrontKey;\n\n/**\n *  The key of the \"Mid\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfMidKey;\n\n/**\n *  The key of the \"Back\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfBackKey;\n\n/**\n *  The key of the \"Hole\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfHoleKey;\n\n/**\n *  The key of the \"Par\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfParKey;\n\n/**\n *  The command IDs that can be sent back by the Golf watch app.\n *  @see -golfAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  GolfAppCommandPrevious = 0x01,\n  GolfAppCommandNext = 0x02,\n  GolfAppCommandSelect = 0x03,\n} GolfAppCommand;\n\n/**\n *  Queries the watch whether Golf Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isGolfSupported YES if Golf Messages are supported, NO if not.\n */\n- (void)golfGetIsSupported:(void(^)(PBWatch *watch, BOOL isGolfSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends an update to the golf app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey, PBGolfParKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n *  @see PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey and PBGolfParKey\n */\n- (void)golfAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Golf updates that are send by the Golf watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param command The command as sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -golfAppRemoveUpdateHandler:\n *  @see GolfAppCommand\n *  @see -golfAppRemoveUpdateHandler:\n */\n- (id)golfAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, GolfAppCommand command))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -golfAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -golfAppAddReceiveUpdateHandler:\n *  @see -golfAppAddReceiveUpdateHandler:\n */\n- (void)golfAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the golf app on the watch.\n *  @discussion It is recommended to perform this as the first call after -golfGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+Ping.h",
    "content": "//\n//  PBWatch+Ping.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/14/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n@interface PBWatch (Ping)\n\n/**\n * Sends a ping to the watch.\n * @param cookie A number identifying the ping.\n * @param onPong The block handler that will be called when the \"pong\" reply from the watch has been received.\n * @param watch The watch that sent the \"pong\" reply, which is \"self\". It is passed in to avoid retain loops.\n * @param cookie The cookie that was initially passed when calling this method.\n * @param onTimeout The block handler that will be called when the watch failed to reply in time.\n */\n- (void)pingWithCookie:(UInt32)cookie onPong:(void(^)(PBWatch *watch, UInt32 cookie))onPong onTimeout:(void(^)(PBWatch *watch, UInt32 cookie))onTimeout;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+PollServices.h",
    "content": "//\n//  PBWatch+PollServices.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n * PollServiceType\n */ \n\n\nenum {\n  PBPollRemoteServiceMail = 0,\n  PBPollRemoteServiceDataLogging = 1,\n  PBNumPollRemoteServices\n};\ntypedef UInt8 PBPollRemoteServiceType;\n\n@interface PBWatch (PollServices)\n// Call this upon connect with the watch to add handlers:\n- (id)addPollServicesHandler:(void(^)(PBWatch *))handler forService:(PBPollRemoteServiceType)service interval:(UInt8)interval;\n- (void)sendPollRequestForService:(PBPollRemoteServiceType)service;\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+Sports.h",
    "content": "//\n//  PBWatch+Sports.h\n//  PebbleKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n/**\n *  The UUID of the Sports watch app.\n */\nextern NSData *PBSportsUUID;\n\n/**\n *  The key of the \"Time\" field.\n *  The accompanying value must be an NSString (max. ~8 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsTimeKey;\n\n/**\n *  The key of the \"Distance\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDistanceKey;\n\n/**\n *  The key of the general purpose \"Data\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDataKey;\n\n/**\n *  The key of the \"Activity State\".\n *  The value must be an NSNumber created using +[NSNumber numberWithUint8:].\n *  @see SportsAppActivityState for valid values to use\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsActivityStateKey;\n\n/**\n *  Instances of this convenience class represent an update of the current time, distance and pace,\n *  and has a method to convert the values into a dictionary that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n@interface PBSportsUpdate : NSObject\n\n/**\n *  The current time in seconds. The possible range is currently limited from -7140. to 7140., inclusive. (±1h 59min 59sec).\n */\n@property (nonatomic, readwrite, assign) NSTimeInterval time;\n\n/**\n *  The current distance in km or mi. The possible range is currently limited from -99.9 to 99.9, inclusive.\n *  The unit of distance is dependent on the current unit setting.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float distance;\n\n/**\n *  General purpose data variable. The possible range is currently limited from -99.99 to 99.99, inclusive.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float data;\n\n/**\n *  Convenience method to create an update object.\n */\n+ (PBSportsUpdate*)updateWithTime:(NSTimeInterval)time distance:(float)distance data:(float)data;\n\n/**\n *  Creates an update dictionary from the receiver, that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n- (NSDictionary*)dictionary;\n\n/**\n *  Creates a formatted time string with from a total seconds value, formatted as \"h:mm:ss\".\n *  For example, supplying the value 3930.0f seconds will return @\"1:05:30\"\n *  @param seconds The number of seconds from which to create the time string.\n *  @return Formatted time as \"h:mm:ss\"\n */\n+ (NSString*)timeStringFromFloat:(float)seconds;\n\n@end\n\n@interface PBWatch (Sports)\n\n/**\n *  The state of the Sports activity.\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  SportsAppActivityStateInit = 0x00,\n  SportsAppActivityStateRunning = 0x01,\n  SportsAppActivityStatePaused = 0x02,\n  SportsAppActivityStateEnd = 0x03,\n} SportsAppActivityState;\n\n/**\n *  Queries the watch whether Sports Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isSportsSupported YES if Sports Messages are supported, NO if not.\n */\n- (void)sportsGetIsSupported:(void(^)(PBWatch *watch, BOOL isSportsSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the preferred\n *  unit system, either metric or imperial.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetMetric:(BOOL)isMetric onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents,\n *  to set the preferred  data label (either PACE or SPEED) and corresponding units.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetLabel:(BOOL)isPace onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the state of the\n *  sports activity. Currently only SportsAppActivityStateRunning and SportsAppActivityStatePaused are\n *  supported.\n *  @param state The new sports activity state\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetActivityState:(SportsAppActivityState)state onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends the update to the sports app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBSportsTimeKey, PBSportsPaceKey, PBSportsDistanceKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Sports updates that are send by the Sports watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param state The new sports activity state as set by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -sportsAppRemoveUpdateHandler:\n *  @see SportsAppActivityState\n *  @see -sportsAppRemoveUpdateHandler:\n */\n- (id)sportsAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, SportsAppActivityState state))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -sportsAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -sportsAppAddReceiveUpdateHandler:\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\n- (void)sportsAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the sports app on the watch.\n *  @discussion It is recommended to perform this as the first call after -sportsGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+Version.h",
    "content": "//\n//  PBWatch+Version.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/17/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  PBFirmwareVersion is a helper class that is able to parse the versionTag string\n *  into its components (os, major, minor, suffix) and facilitate comparisons\n *  between versions.\n *  Valid versions follow the following format:\n *  `vOS(.MAJOR(.MINOR(-SUFFIX)))`\n *  Where the fields OS, MAJOR, MINOR are positive, decimal integer numbers and SUFFIX\n *  an arbitrary string. MAJOR, MINOR and SUFFIX are optional (nested optionality).\n *  Examples of valid versions:\n *  `v1`\n *  `v2.1234.99-alpha-beta-gamma`\n */\n@interface PBFirmwareVersion : NSObject\n/**\n *  The OS version component.\n */\n@property (nonatomic, readonly) NSInteger os;\n\n/**\n *  The major version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger major;\n\n/**\n *  The minor version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger minor;\n\n/**\n *  The release suffix, which is the part following the dash '-'.\n *  @note If a version tag string does not contain a suffix, it will be set to an empty string.\n *  @discussion The release suffix is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *suffix;\n\n/**\n *  The version timestamp.\n *  @note The timestamp is in the final comparison equation, in the -compare: method, after evaluating\n *  os, major and minor components.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The version's git commit hash.\n *  @discussion The commit hash is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *commitHash;\n\n/**\n *  The version's git tag.\n */\n@property (nonatomic, readonly, copy) NSString *tag;\n\n/**\n *  Creates a PBFirmwareVersion object given a tag string and timestamp.\n */\n+ (PBFirmwareVersion*)firmwareVersionWithTag:(NSString*)tag commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Creates a PBFirmwareVersion object given its components.\n *  @discussion The tag string will be set to the canonical format vOS.MINOR.MAJOR(-SUFFIX).\n */\n+ (PBFirmwareVersion*)firmwareVersionWithOS:(NSInteger)os major:(NSInteger)major minor:(NSInteger)minor suffix:(NSString*)suffix commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Compares the receiver to another version object.\n *  @param aVersion The version to compare with the receiver.\n *  @return NSOrderedAscending if the value of aVersion is greater than the receiver’s,\n *  NSOrderedSame if they’re equal, and NSOrderedDescending if the value of aVersion is less than the receiver’s.\n */\n- (NSComparisonResult)compare:(PBFirmwareVersion *)aVersion;\n\n/**\n *  Convenience wrappers around -compare:\n */\n- (BOOL)isEqualOrNewer:(PBFirmwareVersion *)other;\n- (BOOL)isNewer:(PBFirmwareVersion *)other;\n- (BOOL)isEqualVersionOnly:(PBFirmwareVersion *)other;\n\n@end\n\n\n\n/**\n *  Values specifying the Pebble hardware platform variant.\n */\ntypedef enum {\n  FirmwareMetadataPlatformUnknown = 0,\n  FirmwareMetadataPlatformPebbleOneEV1 = 1,\n  FirmwareMetadataPlatformPebbleOneEV2 = 2,\n  FirmwareMetadataPlatformPebbleOneEV2_3 = 3,\n  FirmwareMetadataPlatformPebbleOneEV2_4 = 4,\n  FirmwareMetadataPlatformPebbleOnePointFive = 5,\n  FirmwareMetadataPlatformPebbleTwoPointZero = 6,\n  FirmwareMetadataPlatformPebbleOneBigboard = 0xff,\n  FirmwareMetadataPlatformPebbleOneBigboard2 = 0xfe,\n} FirmwareMetadataPlatform;\n\n/**\n *  Instances of PBFirmwareMetadata describe a firmware in terms of\n *  its version, whether it is a recovery firmware and its intended hardware\n *  platform.\n *  @see PBVersionInfo\n */\n\n@interface PBFirmwareMetadata : NSObject\n\n/**\n *  The version of the firmware.\n *  @see PBFirmwareVersion\n */\n@property (nonatomic, readonly) PBFirmwareVersion *version;\n\n/**\n *  YES if the firmware is a recovery firmware, NO if it is a regular firmware.\n */\n@property (nonatomic, readonly) BOOL isRecoveryFirmware;\n\n/**\n *  The hardware platform variant with which the firmware is compatible.\n */\n@property (nonatomic, readonly) FirmwareMetadataPlatform hardwarePlatform;\n\n/**\n *  Converts a <FirmwareMetadataPlatform> value to a string.\n *  @param hardwarePlatform The hardware platform value to convert\n *  @return A string of the hardware platform\n */\n+ (NSString*)hardwarePlatformToString:(FirmwareMetadataPlatform)hardwarePlatform;\n\n/**\n *  Converts an NSString hardware platform string to the corresponding\n *  FirmwareMetadataPlatform value.\n *  @param hardwarePlatformString The string representing the hardware platform.\n *  @return The hardware platform enum value\n */\n+ (FirmwareMetadataPlatform)stringToHardwarePlatform:(NSString *)hardwarePlatformString;\n\n@end\n\n/**\n *  Instances of PBResourceMetadata describe (system) resources.\n *  @see PBVersionInfo\n */\n\n@interface PBResourceMetadata : NSObject\n\n/**\n *  The version of the resources as the Epoch timestamp of the Git commit.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The checksum of the resources.\n */\n@property (nonatomic, readonly) UInt32 crc;\n\n/**\n *  The human-friendly string version of the resources.\n */\n@property (nonatomic, readonly, strong) NSString *friendlyVersion;\n\n/**\n *  YES if the metadata represents valid resources, NO if it does not.\n */\n- (BOOL)isValid;\n\n@end\n\n/**\n *  An instance of PBVersionInfo describes all the different system software (Pebble OS)\n *  on a Pebble watch and other auxiliary information.\n *  @see PBWatch\n */\n\n@interface PBVersionInfo : NSObject\n\n/**\n *  The metadata of the firmware that is running.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *runningFirmwareMetadata;\n\n/**\n *  The metadata of the recovery firmware that is in storage.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *recoveryFirmwareMetadata;\n\n/**\n *  The metadata of the system resources.\n */\n@property (nonatomic, readonly, strong) PBResourceMetadata *systemResources;\n\n/**\n *  The version of the bootloader.\n */\n@property (nonatomic, readonly) UInt32 bootloaderVersion;\n\n/**\n *  The version of the hardware.\n */\n@property (nonatomic, readonly, strong) NSString *hardwareVersion;\n\n/**\n *  The serial number.\n */\n@property (nonatomic, readonly, strong) NSString *serialNumber;\n\n/**\n *  The current Bluetooth device address.\n */\n@property (nonatomic, readonly, strong) NSData *deviceAddress;\n\n/**\n *  YES if valid recovery firmware is installed, NO if not.\n */\n- (BOOL)hasRecoveryFirmware;\n\n/**\n *  YES if valid system resources are installed, NO if not.\n */\n- (BOOL)hasSystemResources;\n\n@end\n\n@interface PBWatch (Version)\n\n/**\n *  Requests the version info from the receiver.\n *  @param handler The handler that will be called when the version info response has been received.\n *  @param onTimeout The handler that will be called if the watch did not respond within 5 seconds.\n *  @param watch The watch for which the version info was requested.\n *  @param versionInfo The version info response.\n *  @discussion The <PBVersionInfo> response will be cached. The latest version info can be\n *  accessed through the <versionInfo> property of <PBWatch>.\n */\n- (void)getVersionInfo:(void (^)(PBWatch *watch, PBVersionInfo *versionInfo))handler onTimeout:(void (^)(PBWatch *watch))onTimeout;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch.h",
    "content": "//\n//  PBWatch.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@protocol PBWatchDelegate;\n@class PBVersionInfo;\n@class PBDataLoggingService;\n\n/**\n *  Represents a Pebble watch.\n *\n *  On iOS, there is the notion of a \"communication session\" between an app and\n *  the Pebble watch. You can imagine this as a \"data pipe\" directly from the\n *  watch to your app. However, there is only one session for 3rd party apps.\n *  This one session has to be shared among all 3rd party apps that want to\n *  communicate with Pebble (excluding the official Pebble iOS app).\n *\n *  Unfortunately, the session can only be opened from the phone app. This means\n *  that the iOS app has to start talking to the watch first to open the\n *  communications channel; the other way around is not possible.\n *  Most methods in the PBWatch categories (Ping), (Version), (Sports), (Golf)\n *  and (AppMessages) all implicitly open the shared communication session.\n *\n *  Lastly, iOS provides no good way to manage how the one shared session is\n *  accessed or used. Simply, the last iOS app to try to open it, wins and gets\n *  to use it. Therefore, it is important that your iOS app does **not** try\n *  communicate when a Pebble is connected.\n *\n *  When the user has stopped using your app (e.g. when going to the background\n *  or when explicitely stopping a certain activity in the app) your iOS app\n *  should close the communication session using the -closeSession: method.\n */\n@interface PBWatch : NSObject\n\n/**\n *  YES if the receiver is connected and NO if the receiver is disconnected.\n *  @discussion This property is KVO-compliant.\n */\n@property (nonatomic, readonly, getter=isConnected) BOOL connected;\n\n/**\n *  The human-friendly name of the receiver.\n *  This is the same name as the user will see in the iOS Bluetooth Settings.\n */\n@property (nonatomic, readonly) NSString *name;\n\n/**\n *  The serial number of the receiver.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  The versionInfo of the receiver.\n *  @see PBVersionInfo\n */\n@property (nonatomic, readonly) PBVersionInfo *versionInfo;\n\n/**\n *  The delegate of the watch that will be notified of disconnections and errors.\n *  @see PBWatchDelegate\n */\n@property (nonatomic, readwrite, weak) id<PBWatchDelegate> delegate;\n\n/**\n *  The userInfo property can be used to associate application specific data\n *  with the watch. Note that the application itself is responsible for persisting\n *  the information if neccessary.\n */\n@property (nonatomic, readwrite, strong) id userInfo;\n\n/**\n *  The date when the watch was last known to be connected.\n *  This date will be updated automatically when the watch connects and\n *  disconnects. While the watch is being connected, this date will not be updated.\n */\n@property (nonatomic, readonly) NSDate *lastConnectedDate;\n\n/**\n *  Developer-friendly debugging description of the watch.\n *  @return localized, user-friendly summary of the receiver, including\n *  software and hardware version information, if available.\n */\n- (NSString*)friendlyDescription;\n\n/**\n *  Closes the communication session with the watch.\n *  Since there is only one, shared session for all 3rd party iOS apps,\n *  an app should close the session after the user is done using the app/watch-integration,\n *  so it can be used by other apps.\n *  The communication session is implicitely opened automatically when needed.\n *  @param onDone Callback block that will be called after the closing of the session\n *  has completed. If there is no open session, the onDone block will (also) be executed\n *  asynchronously on the calling queue.\n */\n- (void)closeSession:(void(^)(void))onDone;\n\n@end\n\n@protocol PBWatchDelegate <NSObject>\n@optional\n\n/**\n *  Called when the watch got disconnected.\n */\n- (void)watchDidDisconnect:(PBWatch*)watch;\n\n/**\n *  Called when the watch caught an error.\n */\n- (void)watch:(PBWatch*)watch handleError:(NSError*)error;\n\n/**\n *  Called when the internal EASession is about to be reset.\n */\n- (void)watchWillResetSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is opened\n */\n- (void)watchDidOpenSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is closed\n */\n- (void)watchDidCloseSession:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PebbleKit.h",
    "content": "//\n//  PebbleSDK.h\n//  PebbleSDK\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#import <PebbleKit/PBWatch.h>\n#import <PebbleKit/PBPebbleCentral.h>\n#import <PebbleKit/PBWatch+Ping.h>\n#import <PebbleKit/PBWatch+Version.h>\n#import <PebbleKit/PBErrors.h>\n#import <PebbleKit/PBWatch+AppMessages.h>\n#import <PebbleKit/NSNumber+stdint.h>\n#import <PebbleKit/PBWatch+Sports.h>\n#import <PebbleKit/PBWatch+Golf.h>\n#import <PebbleKit/PBBitmap.h>\n#import <PebbleKit/PBDataLoggingService.h>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/gtypes.h",
    "content": "//\n//  gtypes.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#ifndef PebbleKit_gtypes_h\n#define PebbleKit_gtypes_h\n\ntypedef struct GSize {\n  int16_t w;\n  int16_t h;\n} GSize;\n\ntypedef struct GPoint {\n  int16_t x;\n  int16_t y;\n} GPoint;\n\ntypedef struct GRect {\n  GPoint origin;\n  GSize size;\n} GRect;\n\n#endif\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/NSDictionary+Pebble.h",
    "content": "//\n//  NSDictionary+Pebble.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSDictionary (Pebble)\n\n/**\n *  Serializes the receiver into a Pebble dict.\n *  @note The receiver dictionary must comply to the following constraints:\n *  * The keys must be instances of NSNumber. Their -unsignedLongValue return value will be used as final key.\n *  * The values must be instances of either NSString, NSData or NSNumber. Use the NSNumber (stdint) category\n *  to specify the signedness and width of NSNumbers.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryUnsupportedKeyClass,\n *  PBErrorCodeDictionaryUnsupportedValueClass or PBErrorCodeDictionaryUnsupportedValueClass.\n *  @see -dictionaryFromPebbleDictionaryDataWithError:\n */\n- (NSData*)pebbleDictionaryData:(NSError * __autoreleasing *)error;\n\n@end\n\n@interface NSData (Pebble)\n\n/**\n *  Interprets the receiver as Pebble dict data and deserializes it into an NSDictionary.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryInternalConsistency.\n *  @see -pebbleDictionaryData:\n */\n- (NSDictionary*)dictionaryFromPebbleDictionaryDataWithError:(NSError * __autoreleasing *)error;\n\n@end"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/NSNumber+stdint.h",
    "content": "//\n//  NSNumber+stdint.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/**\n *  This category exposes the capabilities the underlying CFNumber to explicitely\n *  store the signedness and the width of the storage.\n */\n\n@interface NSNumber (stdint)\n\n/**\n *  Interprets the receiver as a 32-bits wide, unsigned integer.\n */\n- (uint32_t)uint32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, unsigned integer.\n */\n- (uint16_t)uint16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, unsigned integer.\n */\n- (uint8_t)uint8Value;\n\n/**\n *  Interprets the receiver as a 32-bits wide, signed integer.\n */\n- (int32_t)int32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, signed integer.\n */\n- (int16_t)int16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, signed integer.\n */\n- (int8_t)int8Value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint32:(uint32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint16:(uint16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint8:(uint8_t)value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt32:(int32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt16:(int16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt8:(int8_t)value;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a floating pointer number or not.\n */\n- (BOOL)isFloat;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a signed integer or not.\n */\n- (BOOL)isSigned;\n\n/**\n *  Gets the width in bytes of the integer that is stored by the receiver.\n */\n- (uint8_t)width;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBBitmap.h",
    "content": "//\n//  PBBitmap.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIImage.h>\n#import <PebbleKit/gtypes.h>\n\n/**\n *  Helper class to convert a UIImage to Pebble bitmap pixel data and GBitmap metadata.\n *  Refer to the documentation of Pebble's native watch app SDK on the GBitmap format.\n */\n\n@interface PBBitmap : NSObject\n\n/**\n *  The pixel data of the bitmap.\n *  This corresponds to the data as pointed to by GBitmap's `addr` field.\n */\n@property (nonatomic, readonly, strong) NSData *pixelData;\n\n/**\n *  The number of bytes per row.\n *  Always a multiple of 4 bytes.\n */\n@property (nonatomic, readonly, assign) uint16_t rowSizeBytes;\n\n/**\n *  Bitfield of metadata flags.\n *  This corresponds to GBitmap's `info_flags` field.\n */\n@property (nonatomic, readonly, assign) uint16_t infoFlags;\n\n/**\n *  The box of bits inside `pixelData`, that contains\n *  the actual image data to use.\n *  This corresponds to GBitmap's `bounds` field.\n */\n@property (nonatomic, readonly, assign) GRect bounds;\n\n/**\n *  Factory method to create a PBBitmap from a UIImage instance.\n *  @param image The UIImage from which to create the PBBitmap\n */\n+ (PBBitmap*)pebbleBitmapWithUIImage:(UIImage*)image;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBDataLoggingService.h",
    "content": "//\n//  PBDataLoggingService.h\n//  PebbleKit\n//\n//  Created by Martijn The on 7/19/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  Data logging datatypes.\n */\nenum {\n  //! Array of bytes\n  PBDataLoggingTypeByteArray = 0,\n  //! unsigned integer\n  PBDataLoggingTypeUInt = 2,\n  //! signed integer\n  PBDataLoggingTypeInt = 3,\n};\ntypedef UInt8 PBDataLoggingType;\n\n/**\n *  The metadata of a data logging session. Used to identify a session.\n */\n@interface PBDataLoggingSessionMetadata : NSObject <NSSecureCoding, NSCopying>\n\n/**\n *  A tag associated with the session.\n */\n@property (nonatomic, readonly) UInt32 tag;\n\n/**\n *  The timestamp of the moment the session was created by the watchapp.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The type of data stored in this session.\n */\n@property (nonatomic, readonly) PBDataLoggingType type;\n\n/**\n *  The size of a data item.\n */\n@property (nonatomic, readonly) UInt16 itemSize;\n\n/**\n *  The serial number of the watch that created the sessions.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  Creates a new data logging session metadata object, given all its property values.\n *  This method is provided to create a metadata object that can be used to\n *  compare it with a metadata object that is passed into one of the\n *  PBDataLoggingServiceDelegate methods.\n *  @param tag The tag associated with the session\n *  @param timestamp The timestamp of the creation of the session\n *  @param type The type of data stored in the session\n *  @param itemSize The size of a data item\n *  @param serialNumber The serial number of the watch that created the session\n *  @return A session metadata object with the specified information\n */\n+ (id)metadataWithTag:(UInt32)tag\n            timestamp:(UInt32)timestamp\n                 type:(PBDataLoggingType)type\n             itemSize:(UInt16)itemSize\n         serialNumber:(NSString *)serialNumber;\n\n/**\n *  Tests the equality of two data logging session metadata objects.\n *  This method can be used to compare two session metadata objects\n *  to check whether they are referring to the same session or not.\n *  @param sessionMetadata\n *  @return YES if all the property values of receiver are equal to the property\n *  values of the given session.\n *  @note Equivalent to -[PBDataLoggingSessionMetadata isEqual:]\n */\n- (BOOL)isEqualToDataLoggingSessionMetadata:(PBDataLoggingSessionMetadata *)sessionMetadata;\n@end\n\n/**\n *  Data logging delegate protocol. The object that implements this protocol\n *  is responsible for handling incoming data.\n */\n@protocol PBDataLoggingServiceDelegate <NSObject>\n@optional\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param bytes Pointer to the array of bytes.\n *  The array contains (numberOfItems * session.itemSize) bytes.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasByteArrays:(const UInt8 * const)bytes numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt8s:(const UInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt16s:(const UInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt32s:(const UInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt8s:(const SInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt16s:(const SInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt32s:(const SInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time a session is finished.\n *  This is guaranteed to be called only after all data has been received and\n *  consumed by the application.\n *  @param service The data logging service.\n *  @param session The metadata of the session.\n */\n- (void)dataLoggingService:(PBDataLoggingService *)service sessionDidFinish:(PBDataLoggingSessionMetadata *)session;\n\n@end\n\n/**\n *  The data logging service. Assign a delegate object in order to receive\n *  data from your watchapp.\n */\n@interface PBDataLoggingService : NSObject\n\n/**\n *  The delegate that has the responsility of handling callbacks from the\n *  data logging service.\n */\n@property (atomic, readwrite, weak) id<PBDataLoggingServiceDelegate> delegate;\n\n/**\n *  Sets the queue on which delegate methods will be executed.\n *  Callbacks are intended to be processed in the order as they come in, so it\n *  you must use a serial queue. If set to nil (default) the main queue is used.\n *  @param delegateQueue The queue on which the delegate methods will be executed.\n */\n- (void)setDelegateQueue:(dispatch_queue_t)delegateQueue;\n\n/**\n * Query the watch for data logging data.\n */\n- (void)pollForData;\n  \n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBErrors.h",
    "content": "//\n//  PBErrors.h\n//  PebbleSDK\n//\n//  Created by Martijn The on 7/26/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nextern NSString *PBErrorDomain;\n\n/**\n *  PebbleKit Error codes.\n *  Inspect the localizedDescription of any NSError objects for a description.\n */\n\ntypedef enum {\n  PBErrorCodeNoSupportedProtocolsInInfoPlist,\n  PBErrorCodeErrorCreatingSession,\n  PBErrorCodeOutputStreamError,\n  PBErrorCodeInputStreamError,\n  PBErrorCodeSendMessageTimeout,\n  PBErrorCodeEndpointDisallowed,\n  PBErrorCodeVersionInfoTimeout,\n  PBErrorCodeCannotCreateSessionWhileClosing,\n  PBErrorCodeNoAppUUID,\n  PBErrorCodeAppMessageRejected,\n  PBErrorCodeAppMessageAckTimeout,\n  PBErrorCodeDictionaryUnsupportedKeyClass,\n  PBErrorCodeDictionaryUnsupportedValueClass,\n  PBErrorCodeDictionaryInternalConsistency,\n  PBErrorCodeInvalidArguments,\n  PBErrorCodePebbleAppUnreachable,\n  PBErrorCodePebbleAppRequestTimeout,\n  PBErrorCodePebbleAppEmptyResponse,\n  PBErrorCodePebbleAppUnexpectedResponse,\n  PBErrorCodeServerNotAvailable,\n  PBErrorCodeDownloadFailed,\n  PBErrorCodePebbleNotConnected\n} PBErrorCode;\n\n@interface NSError (Pebble)\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode and with an underlying NSError object.\n *  @param code The error code for which to create the error\n *  @param error The underlying error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code underLyingError:(NSError*)error;\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode.\n *  @param code The error code for which to create the error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code;\n\n@end"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBLog.h",
    "content": "//\n//  PBLog.h\n//  PebbleApp\n//\n//  Created by Martijn The on 11/29/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import \"DDLog.h\"\n\n#ifndef PBWSLOG_CONTEXT\n#define PBWSLOG_CONTEXT 1\n#endif\n\nextern int PBLogLevel;\n\n#define LogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define WSLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n\n#define LogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBPebbleCentral.h",
    "content": "//\n//  PBPebbleCentral.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class PBWatch;\n@class PBDataLoggingService;\n@protocol PBPebbleCentralDelegate;\n\n/**\n PebbleCentral plays the central role for client iOS apps (e.g. RunKeeper).\n */\n@interface PBPebbleCentral : NSObject\n\n/**\n @returns The default central singleton instance.\n */\n+ (PBPebbleCentral*)defaultCentral;\n\n/**\n *  Enables debug logs. The logs will be routed to the system log (ASL) and\n *  console. It is advised to call this before making any other calls to PebbleKit.\n */\n+ (void)setDebugLogsEnabled:(BOOL)logsEnabled;\n\n/**\n The watches that are currently connected. Do not cache the array because it can change over time.\n */\n@property (nonatomic, readonly, strong) NSArray *connectedWatches;\n\n/**\n The watches that are stored in the user preferences of the application.\n */\n@property (nonatomic, readonly, strong) NSArray *registeredWatches;\n\n/**\n The central's delegate.\n */\n@property (nonatomic, readwrite, weak) id<PBPebbleCentralDelegate> delegate;\n\n/**\n *  The UUID is used as the identifier of the watch application and is used\n *  to make sure that appMessage and dataLogging communications arrives at its companion app\n *  on the other device (and not in another app).\n *  For most app message methods there is are two variants: one that does not take a UUID parameter and one that does take\n *  a UUID parameter (for example, -appMessagesAddReceiveUpdateHandler: vs appMessagesAddReceiveUpdateHandler:withUUID:).\n *  The methods that do not take a UUID, will use the UUID as set prior to this property.\n *  @param uuid The 16 byte UUID of your app.\n *  @note The UUID needs to be set before using either app message or data logging.\n */\n@property (nonatomic, strong, readwrite) NSData *appUUID;\n\n/**\n *  Verifies the currently set application UUID.\n *  @return YES if the currently set UUID is valid, NO if it is not.\n *  @see -setAppUuid:\n */\n- (BOOL)hasValidAppUUID;\n\n/**\n @returns YES if the Pebble iOS app is installed, NO if it is not installed.\n */\n- (BOOL)isMobileAppInstalled;\n\n/**\n Redirects to Pebble in the App Store, so the user can install the app.\n */\n- (void)installMobileApp;\n\n/**\n Wipes out the data associated with the registered watches, that is stored on the phone.\n */\n- (void)unregisterAllWatches;\n\n/**\n Returns the most recently connected watch from the -registeredWatches array.\n */\n- (PBWatch*)lastConnectedWatch;\n\n@property (nonatomic, readonly) PBDataLoggingService *dataLoggingService;\n\n@end\n\n\n@protocol PBPebbleCentralDelegate <NSObject>\n@optional\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was connected.\n @param isNew YES if the watch has been connected for the first time since the app has been installed or NO if not.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidConnect:(PBWatch*)watch isNew:(BOOL)isNew;\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was disconnected.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidDisconnect:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+AppMessages.h",
    "content": "//\n//  PBWatch+AppMessages.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\ntypedef NS_ENUM(UInt8, PBAppState) {\n  PBAppStateNotRunning = 0x00,\n  PBAppStateRunning = 0x01,\n};\n\n@interface PBWatch (AppMessages)\n\n/**\n *  Queries the watch whether AppMessages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isAppMessagesSupported YES if AppMessages are supported, NO if not.\n */\n- (void)appMessagesGetIsSupported:(void(^)(PBWatch *watch, BOOL isAppMessagesSupported))fetchedBlock;\n\n/**\n *  Pushes an update to the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Pushes an update to the watch application with the specified UUID.\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watchapp to which the update should be sent.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary withUUID:(NSData*)uuid onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with the specified UUID.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @param uuid The UUID of the watchapp for which sent messages should be handled by the onReceive block.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive withUUID:(NSData*)uuid;\n\n/**\n *  Add a handler for lifecycle events of watch applications.\n *  @param onLifecycleUpdate This block will be called when an application starts and\n *  stops running.\n *  @param watch The watch that has sent the event.\n *  @param uuid The uuid of the application that caused the event.\n *  @param newAppState The new state of the app (either PBAppStateNotRunning or PBAppStateRunning).\n */\n- (id)appMessagesAddAppLifecycleUpdateHandler:(void(^)(PBWatch *watch, NSUUID *uuid,\n                                                       PBAppState newAppState))onLifecycleUpdate;\n\n\n// INTERNAL USE ONLY\n- (id)appMessagesAddReceiveAllUpdatesHandler:(BOOL(^)(PBWatch *watch, NSUUID *uuid, NSDictionary *update))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -appMessagesAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -appMessagesAddReceiveUpdateHandler:\n *  @see -appMessagesAddReceiveUpdateHandler:\n */\n- (void)appMessagesRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Fetches the run state of the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]. You can use this method to determine whether the watch\n *  application is running or not.\n *  TODO: Ask Francois how this API works.\n *  @param onSent The block that will be called after the fetch state command has been\n *  sent to the watch.\n */\n- (void)appMessagesFetchAppState:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with the specified UUID.\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n/**\n *  Sends a command to kill the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to kill the watch application with the specified UUID.\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+Golf.h",
    "content": "//\n//  PBWatch+Golf.h\n//  PebbleKit\n//\n//  Created by Martijn The on 4/4/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n@interface PBWatch (Golf)\n\n/**\n *  The UUID of the Golf watch app.\n */\nextern NSData *PBGolfUUID;\n\n/**\n *  The key of the \"Front\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfFrontKey;\n\n/**\n *  The key of the \"Mid\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfMidKey;\n\n/**\n *  The key of the \"Back\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfBackKey;\n\n/**\n *  The key of the \"Hole\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfHoleKey;\n\n/**\n *  The key of the \"Par\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfParKey;\n\n/**\n *  The command IDs that can be sent back by the Golf watch app.\n *  @see -golfAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  GolfAppCommandPrevious = 0x01,\n  GolfAppCommandNext = 0x02,\n  GolfAppCommandSelect = 0x03,\n} GolfAppCommand;\n\n/**\n *  Queries the watch whether Golf Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isGolfSupported YES if Golf Messages are supported, NO if not.\n */\n- (void)golfGetIsSupported:(void(^)(PBWatch *watch, BOOL isGolfSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends an update to the golf app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey, PBGolfParKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n *  @see PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey and PBGolfParKey\n */\n- (void)golfAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Golf updates that are send by the Golf watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param command The command as sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -golfAppRemoveUpdateHandler:\n *  @see GolfAppCommand\n *  @see -golfAppRemoveUpdateHandler:\n */\n- (id)golfAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, GolfAppCommand command))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -golfAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -golfAppAddReceiveUpdateHandler:\n *  @see -golfAppAddReceiveUpdateHandler:\n */\n- (void)golfAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the golf app on the watch.\n *  @discussion It is recommended to perform this as the first call after -golfGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+Ping.h",
    "content": "//\n//  PBWatch+Ping.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/14/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n@interface PBWatch (Ping)\n\n/**\n * Sends a ping to the watch.\n * @param cookie A number identifying the ping.\n * @param onPong The block handler that will be called when the \"pong\" reply from the watch has been received.\n * @param watch The watch that sent the \"pong\" reply, which is \"self\". It is passed in to avoid retain loops.\n * @param cookie The cookie that was initially passed when calling this method.\n * @param onTimeout The block handler that will be called when the watch failed to reply in time.\n */\n- (void)pingWithCookie:(UInt32)cookie onPong:(void(^)(PBWatch *watch, UInt32 cookie))onPong onTimeout:(void(^)(PBWatch *watch, UInt32 cookie))onTimeout;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+PollServices.h",
    "content": "//\n//  PBWatch+PollServices.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n * PollServiceType\n */ \n\n\nenum {\n  PBPollRemoteServiceMail = 0,\n  PBPollRemoteServiceDataLogging = 1,\n  PBNumPollRemoteServices\n};\ntypedef UInt8 PBPollRemoteServiceType;\n\n@interface PBWatch (PollServices)\n// Call this upon connect with the watch to add handlers:\n- (id)addPollServicesHandler:(void(^)(PBWatch *))handler forService:(PBPollRemoteServiceType)service interval:(UInt8)interval;\n- (void)sendPollRequestForService:(PBPollRemoteServiceType)service;\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+Sports.h",
    "content": "//\n//  PBWatch+Sports.h\n//  PebbleKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n/**\n *  The UUID of the Sports watch app.\n */\nextern NSData *PBSportsUUID;\n\n/**\n *  The key of the \"Time\" field.\n *  The accompanying value must be an NSString (max. ~8 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsTimeKey;\n\n/**\n *  The key of the \"Distance\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDistanceKey;\n\n/**\n *  The key of the general purpose \"Data\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDataKey;\n\n/**\n *  The key of the \"Activity State\".\n *  The value must be an NSNumber created using +[NSNumber numberWithUint8:].\n *  @see SportsAppActivityState for valid values to use\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsActivityStateKey;\n\n/**\n *  Instances of this convenience class represent an update of the current time, distance and pace,\n *  and has a method to convert the values into a dictionary that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n@interface PBSportsUpdate : NSObject\n\n/**\n *  The current time in seconds. The possible range is currently limited from -7140. to 7140., inclusive. (±1h 59min 59sec).\n */\n@property (nonatomic, readwrite, assign) NSTimeInterval time;\n\n/**\n *  The current distance in km or mi. The possible range is currently limited from -99.9 to 99.9, inclusive.\n *  The unit of distance is dependent on the current unit setting.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float distance;\n\n/**\n *  General purpose data variable. The possible range is currently limited from -99.99 to 99.99, inclusive.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float data;\n\n/**\n *  Convenience method to create an update object.\n */\n+ (PBSportsUpdate*)updateWithTime:(NSTimeInterval)time distance:(float)distance data:(float)data;\n\n/**\n *  Creates an update dictionary from the receiver, that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n- (NSDictionary*)dictionary;\n\n/**\n *  Creates a formatted time string with from a total seconds value, formatted as \"h:mm:ss\".\n *  For example, supplying the value 3930.0f seconds will return @\"1:05:30\"\n *  @param seconds The number of seconds from which to create the time string.\n *  @return Formatted time as \"h:mm:ss\"\n */\n+ (NSString*)timeStringFromFloat:(float)seconds;\n\n@end\n\n@interface PBWatch (Sports)\n\n/**\n *  The state of the Sports activity.\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  SportsAppActivityStateInit = 0x00,\n  SportsAppActivityStateRunning = 0x01,\n  SportsAppActivityStatePaused = 0x02,\n  SportsAppActivityStateEnd = 0x03,\n} SportsAppActivityState;\n\n/**\n *  Queries the watch whether Sports Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isSportsSupported YES if Sports Messages are supported, NO if not.\n */\n- (void)sportsGetIsSupported:(void(^)(PBWatch *watch, BOOL isSportsSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the preferred\n *  unit system, either metric or imperial.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetMetric:(BOOL)isMetric onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents,\n *  to set the preferred  data label (either PACE or SPEED) and corresponding units.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetLabel:(BOOL)isPace onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the state of the\n *  sports activity. Currently only SportsAppActivityStateRunning and SportsAppActivityStatePaused are\n *  supported.\n *  @param state The new sports activity state\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetActivityState:(SportsAppActivityState)state onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends the update to the sports app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBSportsTimeKey, PBSportsPaceKey, PBSportsDistanceKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Sports updates that are send by the Sports watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param state The new sports activity state as set by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -sportsAppRemoveUpdateHandler:\n *  @see SportsAppActivityState\n *  @see -sportsAppRemoveUpdateHandler:\n */\n- (id)sportsAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, SportsAppActivityState state))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -sportsAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -sportsAppAddReceiveUpdateHandler:\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\n- (void)sportsAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the sports app on the watch.\n *  @discussion It is recommended to perform this as the first call after -sportsGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+Version.h",
    "content": "//\n//  PBWatch+Version.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/17/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  PBFirmwareVersion is a helper class that is able to parse the versionTag string\n *  into its components (os, major, minor, suffix) and facilitate comparisons\n *  between versions.\n *  Valid versions follow the following format:\n *  `vOS(.MAJOR(.MINOR(-SUFFIX)))`\n *  Where the fields OS, MAJOR, MINOR are positive, decimal integer numbers and SUFFIX\n *  an arbitrary string. MAJOR, MINOR and SUFFIX are optional (nested optionality).\n *  Examples of valid versions:\n *  `v1`\n *  `v2.1234.99-alpha-beta-gamma`\n */\n@interface PBFirmwareVersion : NSObject\n/**\n *  The OS version component.\n */\n@property (nonatomic, readonly) NSInteger os;\n\n/**\n *  The major version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger major;\n\n/**\n *  The minor version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger minor;\n\n/**\n *  The release suffix, which is the part following the dash '-'.\n *  @note If a version tag string does not contain a suffix, it will be set to an empty string.\n *  @discussion The release suffix is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *suffix;\n\n/**\n *  The version timestamp.\n *  @note The timestamp is in the final comparison equation, in the -compare: method, after evaluating\n *  os, major and minor components.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The version's git commit hash.\n *  @discussion The commit hash is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *commitHash;\n\n/**\n *  The version's git tag.\n */\n@property (nonatomic, readonly, copy) NSString *tag;\n\n/**\n *  Creates a PBFirmwareVersion object given a tag string and timestamp.\n */\n+ (PBFirmwareVersion*)firmwareVersionWithTag:(NSString*)tag commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Creates a PBFirmwareVersion object given its components.\n *  @discussion The tag string will be set to the canonical format vOS.MINOR.MAJOR(-SUFFIX).\n */\n+ (PBFirmwareVersion*)firmwareVersionWithOS:(NSInteger)os major:(NSInteger)major minor:(NSInteger)minor suffix:(NSString*)suffix commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Compares the receiver to another version object.\n *  @param aVersion The version to compare with the receiver.\n *  @return NSOrderedAscending if the value of aVersion is greater than the receiver’s,\n *  NSOrderedSame if they’re equal, and NSOrderedDescending if the value of aVersion is less than the receiver’s.\n */\n- (NSComparisonResult)compare:(PBFirmwareVersion *)aVersion;\n\n/**\n *  Convenience wrappers around -compare:\n */\n- (BOOL)isEqualOrNewer:(PBFirmwareVersion *)other;\n- (BOOL)isNewer:(PBFirmwareVersion *)other;\n- (BOOL)isEqualVersionOnly:(PBFirmwareVersion *)other;\n\n@end\n\n\n\n/**\n *  Values specifying the Pebble hardware platform variant.\n */\ntypedef enum {\n  FirmwareMetadataPlatformUnknown = 0,\n  FirmwareMetadataPlatformPebbleOneEV1 = 1,\n  FirmwareMetadataPlatformPebbleOneEV2 = 2,\n  FirmwareMetadataPlatformPebbleOneEV2_3 = 3,\n  FirmwareMetadataPlatformPebbleOneEV2_4 = 4,\n  FirmwareMetadataPlatformPebbleOnePointFive = 5,\n  FirmwareMetadataPlatformPebbleTwoPointZero = 6,\n  FirmwareMetadataPlatformPebbleOneBigboard = 0xff,\n  FirmwareMetadataPlatformPebbleOneBigboard2 = 0xfe,\n} FirmwareMetadataPlatform;\n\n/**\n *  Instances of PBFirmwareMetadata describe a firmware in terms of\n *  its version, whether it is a recovery firmware and its intended hardware\n *  platform.\n *  @see PBVersionInfo\n */\n\n@interface PBFirmwareMetadata : NSObject\n\n/**\n *  The version of the firmware.\n *  @see PBFirmwareVersion\n */\n@property (nonatomic, readonly) PBFirmwareVersion *version;\n\n/**\n *  YES if the firmware is a recovery firmware, NO if it is a regular firmware.\n */\n@property (nonatomic, readonly) BOOL isRecoveryFirmware;\n\n/**\n *  The hardware platform variant with which the firmware is compatible.\n */\n@property (nonatomic, readonly) FirmwareMetadataPlatform hardwarePlatform;\n\n/**\n *  Converts a <FirmwareMetadataPlatform> value to a string.\n *  @param hardwarePlatform The hardware platform value to convert\n *  @return A string of the hardware platform\n */\n+ (NSString*)hardwarePlatformToString:(FirmwareMetadataPlatform)hardwarePlatform;\n\n/**\n *  Converts an NSString hardware platform string to the corresponding\n *  FirmwareMetadataPlatform value.\n *  @param hardwarePlatformString The string representing the hardware platform.\n *  @return The hardware platform enum value\n */\n+ (FirmwareMetadataPlatform)stringToHardwarePlatform:(NSString *)hardwarePlatformString;\n\n@end\n\n/**\n *  Instances of PBResourceMetadata describe (system) resources.\n *  @see PBVersionInfo\n */\n\n@interface PBResourceMetadata : NSObject\n\n/**\n *  The version of the resources as the Epoch timestamp of the Git commit.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The checksum of the resources.\n */\n@property (nonatomic, readonly) UInt32 crc;\n\n/**\n *  The human-friendly string version of the resources.\n */\n@property (nonatomic, readonly, strong) NSString *friendlyVersion;\n\n/**\n *  YES if the metadata represents valid resources, NO if it does not.\n */\n- (BOOL)isValid;\n\n@end\n\n/**\n *  An instance of PBVersionInfo describes all the different system software (Pebble OS)\n *  on a Pebble watch and other auxiliary information.\n *  @see PBWatch\n */\n\n@interface PBVersionInfo : NSObject\n\n/**\n *  The metadata of the firmware that is running.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *runningFirmwareMetadata;\n\n/**\n *  The metadata of the recovery firmware that is in storage.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *recoveryFirmwareMetadata;\n\n/**\n *  The metadata of the system resources.\n */\n@property (nonatomic, readonly, strong) PBResourceMetadata *systemResources;\n\n/**\n *  The version of the bootloader.\n */\n@property (nonatomic, readonly) UInt32 bootloaderVersion;\n\n/**\n *  The version of the hardware.\n */\n@property (nonatomic, readonly, strong) NSString *hardwareVersion;\n\n/**\n *  The serial number.\n */\n@property (nonatomic, readonly, strong) NSString *serialNumber;\n\n/**\n *  The current Bluetooth device address.\n */\n@property (nonatomic, readonly, strong) NSData *deviceAddress;\n\n/**\n *  YES if valid recovery firmware is installed, NO if not.\n */\n- (BOOL)hasRecoveryFirmware;\n\n/**\n *  YES if valid system resources are installed, NO if not.\n */\n- (BOOL)hasSystemResources;\n\n@end\n\n@interface PBWatch (Version)\n\n/**\n *  Requests the version info from the receiver.\n *  @param handler The handler that will be called when the version info response has been received.\n *  @param onTimeout The handler that will be called if the watch did not respond within 5 seconds.\n *  @param watch The watch for which the version info was requested.\n *  @param versionInfo The version info response.\n *  @discussion The <PBVersionInfo> response will be cached. The latest version info can be\n *  accessed through the <versionInfo> property of <PBWatch>.\n */\n- (void)getVersionInfo:(void (^)(PBWatch *watch, PBVersionInfo *versionInfo))handler onTimeout:(void (^)(PBWatch *watch))onTimeout;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch.h",
    "content": "//\n//  PBWatch.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@protocol PBWatchDelegate;\n@class PBVersionInfo;\n@class PBDataLoggingService;\n\n/**\n *  Represents a Pebble watch.\n *\n *  On iOS, there is the notion of a \"communication session\" between an app and\n *  the Pebble watch. You can imagine this as a \"data pipe\" directly from the\n *  watch to your app. However, there is only one session for 3rd party apps.\n *  This one session has to be shared among all 3rd party apps that want to\n *  communicate with Pebble (excluding the official Pebble iOS app).\n *\n *  Unfortunately, the session can only be opened from the phone app. This means\n *  that the iOS app has to start talking to the watch first to open the\n *  communications channel; the other way around is not possible.\n *  Most methods in the PBWatch categories (Ping), (Version), (Sports), (Golf)\n *  and (AppMessages) all implicitly open the shared communication session.\n *\n *  Lastly, iOS provides no good way to manage how the one shared session is\n *  accessed or used. Simply, the last iOS app to try to open it, wins and gets\n *  to use it. Therefore, it is important that your iOS app does **not** try\n *  communicate when a Pebble is connected.\n *\n *  When the user has stopped using your app (e.g. when going to the background\n *  or when explicitely stopping a certain activity in the app) your iOS app\n *  should close the communication session using the -closeSession: method.\n */\n@interface PBWatch : NSObject\n\n/**\n *  YES if the receiver is connected and NO if the receiver is disconnected.\n *  @discussion This property is KVO-compliant.\n */\n@property (nonatomic, readonly, getter=isConnected) BOOL connected;\n\n/**\n *  The human-friendly name of the receiver.\n *  This is the same name as the user will see in the iOS Bluetooth Settings.\n */\n@property (nonatomic, readonly) NSString *name;\n\n/**\n *  The serial number of the receiver.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  The versionInfo of the receiver.\n *  @see PBVersionInfo\n */\n@property (nonatomic, readonly) PBVersionInfo *versionInfo;\n\n/**\n *  The delegate of the watch that will be notified of disconnections and errors.\n *  @see PBWatchDelegate\n */\n@property (nonatomic, readwrite, weak) id<PBWatchDelegate> delegate;\n\n/**\n *  The userInfo property can be used to associate application specific data\n *  with the watch. Note that the application itself is responsible for persisting\n *  the information if neccessary.\n */\n@property (nonatomic, readwrite, strong) id userInfo;\n\n/**\n *  The date when the watch was last known to be connected.\n *  This date will be updated automatically when the watch connects and\n *  disconnects. While the watch is being connected, this date will not be updated.\n */\n@property (nonatomic, readonly) NSDate *lastConnectedDate;\n\n/**\n *  Developer-friendly debugging description of the watch.\n *  @return localized, user-friendly summary of the receiver, including\n *  software and hardware version information, if available.\n */\n- (NSString*)friendlyDescription;\n\n/**\n *  Closes the communication session with the watch.\n *  Since there is only one, shared session for all 3rd party iOS apps,\n *  an app should close the session after the user is done using the app/watch-integration,\n *  so it can be used by other apps.\n *  The communication session is implicitely opened automatically when needed.\n *  @param onDone Callback block that will be called after the closing of the session\n *  has completed. If there is no open session, the onDone block will (also) be executed\n *  asynchronously on the calling queue.\n */\n- (void)closeSession:(void(^)(void))onDone;\n\n@end\n\n@protocol PBWatchDelegate <NSObject>\n@optional\n\n/**\n *  Called when the watch got disconnected.\n */\n- (void)watchDidDisconnect:(PBWatch*)watch;\n\n/**\n *  Called when the watch caught an error.\n */\n- (void)watch:(PBWatch*)watch handleError:(NSError*)error;\n\n/**\n *  Called when the internal EASession is about to be reset.\n */\n- (void)watchWillResetSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is opened\n */\n- (void)watchDidOpenSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is closed\n */\n- (void)watchDidCloseSession:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PebbleKit.h",
    "content": "//\n//  PebbleSDK.h\n//  PebbleSDK\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#import <PebbleKit/PBWatch.h>\n#import <PebbleKit/PBPebbleCentral.h>\n#import <PebbleKit/PBWatch+Ping.h>\n#import <PebbleKit/PBWatch+Version.h>\n#import <PebbleKit/PBErrors.h>\n#import <PebbleKit/PBWatch+AppMessages.h>\n#import <PebbleKit/NSNumber+stdint.h>\n#import <PebbleKit/PBWatch+Sports.h>\n#import <PebbleKit/PBWatch+Golf.h>\n#import <PebbleKit/PBBitmap.h>\n#import <PebbleKit/PBDataLoggingService.h>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/gtypes.h",
    "content": "//\n//  gtypes.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#ifndef PebbleKit_gtypes_h\n#define PebbleKit_gtypes_h\n\ntypedef struct GSize {\n  int16_t w;\n  int16_t h;\n} GSize;\n\ntypedef struct GPoint {\n  int16_t x;\n  int16_t y;\n} GPoint;\n\ntypedef struct GRect {\n  GPoint origin;\n  GSize size;\n} GRect;\n\n#endif\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/CHMultiDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMultiDictionary.h\n \n Copyright (c) 2008-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n#import \"CHMutableDictionary.h\"\n\n/**\n @file CHMultiDictionary.h\n \n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> in which multiple values may be associated with a given key.\n */\n\n/**\n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> implementation, in which multiple values may be associated with a given key.\n \n A map is the same as a \"dictionary\", \"associative array\", etc. and consists of a unique set of keys and a collection of values. In a standard map, each key is associated with one value; in a multimap, more than one value may be associated with a given key. A multimap is appropriate for any situation in which one item may correspond to (map to) multiple values, such as a term in an book index and occurrences of that term, courses for which a student is registered, etc.\n \n The values for a key may or may not be ordered. This implementation does not maintain an ordering for objects associated with a key, nor does it allow for multiple occurrences of an object associated with the same key. Internally, this class uses an NSMutableDictionary, and the associated values for each key are stored in distinct NSMutableSet instances. (Just as with NSDictionary, each key added to a CHMultiDictionary is copied using \\link NSCopying#copyWithZone: -copyWithZone:\\endlink and all keys must conform to the NSCopying protocol.) Objects are retained on insertion and released on removal or deallocation.\n \n Since NSDictionary and NSSet conform to the NSCoding protocol, any internal data can be serialized. However, NSSet cannot automatically be written to or read from a property list, since it has no specified order. Thus, instances of CHMultiDictionary must be encoded as an NSData object before saving to disk.\n \n Currently, this implementation does not support key-value coding, observing, or binding like NSDictionary does. Consequently, the distinction between \"object\" and \"value\" is blurrier, although hopefully consistent with the Cocoa APIs in general....\n \n Unlike NSDictionary and other Cocoa collections, CHMultiDictionary has not been designed with mutable and immutable variants. A multimap is not that much more useful if it is immutable, so any copies made of this class are mutable by definition.\n */\n@interface CHMultiDictionary : CHMutableDictionary {\n\tNSUInteger objectCount; // Number of objects currently in the dictionary.\n}\n\n#pragma mark Querying Contents\n\n/**\n Returns the number of objects in the receiver, associated with any key.\n \n @return The number of objects in the receiver. This is the sum total of objects associated with each key in the dictonary.\n \n @see allObjects\n */\n- (NSUInteger) countForAllKeys;\n\n/**\n Returns the number of objects associated with a given key.\n \n @param aKey The key for which to return the object count.\n @return The number of objects associated with a given key in the dictionary.\n \n @see objectsForKey:\n */\n- (NSUInteger) countForKey:(id)aKey;\n\n/**\n Returns an array of objects associated with a given key.\n \n @param aKey The key for which to return the corresponding objects.\n @return An NSSet of objects associated with a given key, or nil if the key is not in the receiver.\n \n @see countForKey:\n @see removeObjectsForKey:\n */\n- (NSSet*) objectsForKey:(id)aKey;\n\n#pragma mark Modifying Contents\n\n/**\n Adds a given object to an entry for a given key in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param anObject An object to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#addObject: -[NSMutableSet addObject:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObject:(id)anObject forKey:(id)aKey;\n\n/**\n Adds the given object(s) to a key entry in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param objectSet A set of objects to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#unionSet: -[NSMutableSet unionSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n/**\n Remove @b all occurrences of @a anObject associated with a given key.\n \n @param aKey The key for which to remove an entry.\n @param anObject An object (possibly) associated with @a aKey in the receiver. Objects are considered to be equal if -compare: returns NSOrderedSame.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n If @a aKey does not exist in the receiver, or if @a anObject is not associated with @a aKey, the contents of the receiver are not modified.\n \n @see containsObject\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) removeObject:(id)anObject forKey:(id)aKey;\n\n/**\n Remove a given key and its associated value(s) from the receiver.\n \n @param aKey The key for which to remove an entry.\n \n If @a aKey does not exist in the receiver, there is no effect on the receiver.\n \n @see objectsForKey:\n @see removeObject:forKey:\n */\n- (void) removeObjectsForKey:(id)aKey;\n\n/**\n Sets the object(s) associated with a key entry in the receiver.\n \n @param aKey The key with which to associate the objects in @a objectSet.\n @param objectSet A set of objects to associate with @a key. If @a objectSet is empty, the contents of the receiver are not modified. If an entry for @a key already exists in the receiver, @a objectSet is added using \\link NSMutableSet#setSet: -[NSMutableSet setSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) setObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/CHMutableDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMutableDictionary.h\n \n Copyright (c) 2009-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n__attribute__((visibility(\"hidden\"))) void createCollectableCFMutableDictionary(CFMutableDictionaryRef* dictionary, NSUInteger initialCapacity);\n\n/**\n @file CHMutableDictionary.h\n \n A mutable dictionary class.\n */\n\n/**\n A mutable dictionary class.\n \n A CFMutableDictionaryRef is used internally to store the key-value pairs. Subclasses may choose to add other instance variables to enable a specific ordering of keys, override methods to modify behavior, and add methods to extend existing behaviors. However, all subclasses should behave like a standard Cocoa dictionary as much as possible, and document clearly when they do not.\n \n @note Any method inherited from NSDictionary or NSMutableDictionary is supported by this class and its children. Please see the documentation for those classes for details.\n \n @todo Implement @c -copy and @c -mutableCopy differently (so users can actually obtain an immutable copy) and make mutation methods aware of immutability?\n */\n@interface CHMutableDictionary : NSMutableDictionary {\n  CFMutableDictionaryRef dictionary; // A Core Foundation dictionary.\n}\n\n- (id) initWithCapacity:(NSUInteger)numItems;\n\n- (NSUInteger) count;\n- (NSEnumerator*) keyEnumerator;\n- (id) objectForKey:(id)aKey;\n- (void) removeAllObjects;\n- (void) removeObjectForKey:(id)aKey;\n- (void) setObject:(id)anObject forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/DDASLLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import <asl.h>\n\n#import \"DDLog.h\"\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for the Apple System Log facility.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log\n * - StdErr (if stderr is a TTY) so log statements show up in Xcode console\n * \n * To duplicate NSLog() functionality you can simply add this logger and a tty logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use a file logger and a tty logger.\n**/\n\n@interface DDASLLogger : DDAbstractLogger <DDLogger>\n{\n    aslclient client;\n}\n\n+ (instancetype)sharedInstance;\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/DDFileLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"DDLog.h\"\n\n@class DDLogFileInfo;\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger to write log statements to a file.\n**/\n\n\n// Default configuration and safety/sanity values.\n// \n// maximumFileSize         -> DEFAULT_LOG_MAX_FILE_SIZE\n// rollingFrequency        -> DEFAULT_LOG_ROLLING_FREQUENCY\n// maximumNumberOfLogFiles -> DEFAULT_LOG_MAX_NUM_LOG_FILES\n// \n// You should carefully consider the proper configuration values for your application.\n\n#define DEFAULT_LOG_MAX_FILE_SIZE     (1024 * 1024)   //  1 MB\n#define DEFAULT_LOG_ROLLING_FREQUENCY (60 * 60 * 24)  // 24 Hours\n#define DEFAULT_LOG_MAX_NUM_LOG_FILES (5)             //  5 Files\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// The LogFileManager protocol is designed to allow you to control all aspects of your log files.\n// \n// The primary purpose of this is to allow you to do something with the log files after they have been rolled.\n// Perhaps you want to compress them to save disk space.\n// Perhaps you want to upload them to an FTP server.\n// Perhaps you want to run some analytics on the file.\n// \n// A default LogFileManager is, of course, provided.\n// The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property.\n// \n// This protocol provides various methods to fetch the list of log files.\n// \n// There are two variants: sorted and unsorted.\n// If sorting is not necessary, the unsorted variant is obviously faster.\n// The sorted variant will return an array sorted by when the log files were created,\n// with the most recently created log file at index 0, and the oldest log file at the end of the array.\n// \n// You can fetch only the log file paths (full path including name), log file names (name only),\n// or an array of DDLogFileInfo objects.\n// The DDLogFileInfo class is documented below, and provides a handy wrapper that\n// gives you easy access to various file attributes such as the creation date or the file size.\n\n@protocol DDLogFileManager <NSObject>\n@required\n\n// Public properties\n\n/**\n * The maximum number of archived log files to keep on disk.\n * For example, if this property is set to 3,\n * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk.\n * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted.\n * \n * You may optionally disable deleting old/rolled/archived log files by setting this property to zero.\n**/\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n// Public methods\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n// Private methods (only to be used by DDFileLogger)\n\n- (NSString *)createNewLogFile;\n\n@optional\n\n// Notifications from DDFileLogger\n\n- (void)didArchiveLogFile:(NSString *)logFilePath;\n- (void)didRollAndArchiveLogFile:(NSString *)logFilePath;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Default log file manager.\n * \n * All log files are placed inside the logsDirectory.\n * If a specific logsDirectory isn't specified, the default directory is used.\n * On Mac, this is in ~/Library/Logs/<Application Name>.\n * On iPhone, this is in ~/Library/Caches/Logs.\n * \n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n * \n * Archived log files are automatically deleted according to the maximumNumberOfLogFiles property.\n**/\n@interface DDLogFileManagerDefault : NSObject <DDLogFileManager>\n{\n    NSUInteger maximumNumberOfLogFiles;\n    NSString *_logsDirectory;\n}\n\n- (id)init;\n- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory;\n\n/*\n * Methods to override.\n *\n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n *\n * If you wish to change default filename, you can override following two methods.\n * - newLogFileName method would be called on new logfile creation.\n * - isLogFile: method would be called to filter logfiles from all other files in logsDirectory.\n *   You have to parse given filename and return YES if it is logFile.\n *\n * **NOTE**\n * newLogFileName returns filename. If appropriate file already exists, number would be added\n * to filename before extension. You have to handle this case in isLogFile: method.\n *\n * Example:\n * - newLogFileName returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 2.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03 1.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 3.log\" would be created.\n**/\n- (NSString *)newLogFileName;\n- (BOOL)isLogFile:(NSString *)fileName;\n\n/* Inherited from DDLogFileManager protocol:\n\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n*/\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Most users will want file log messages to be prepended with the date and time.\n * Rather than forcing the majority of users to write their own formatter,\n * we will supply a logical default formatter.\n * Users can easily replace this formatter with their own by invoking the setLogFormatter method.\n * It can also be removed by calling setLogFormatter, and passing a nil parameter.\n * \n * In addition to the convenience of having a logical default formatter,\n * it will also provide a template that makes it easy for developers to copy and change.\n**/\n@interface DDLogFileFormatterDefault : NSObject <DDLogFormatter>\n{\n    NSDateFormatter *dateFormatter;\n}\n\n- (id)init;\n- (instancetype)initWithDateFormatter:(NSDateFormatter *)dateFormatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDFileLogger : DDAbstractLogger <DDLogger>\n{\n    __strong id <DDLogFileManager> logFileManager;\n    \n    DDLogFileInfo *currentLogFileInfo;\n    NSFileHandle *currentLogFileHandle;\n    \n    dispatch_source_t currentLogFileVnode;\n    dispatch_source_t rollingTimer;\n    \n    unsigned long long maximumFileSize;\n    NSTimeInterval rollingFrequency;\n}\n\n- (id)init;\n- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)logFileManager;\n\n/**\n * Log File Rolling:\n * \n * maximumFileSize:\n *   The approximate maximum size to allow log files to grow.\n *   If a log file is larger than this value after a log statement is appended,\n *   then the log file is rolled.\n * \n * rollingFrequency\n *   How often to roll the log file.\n *   The frequency is given as an NSTimeInterval, which is a double that specifies the interval in seconds.\n *   Once the log file gets to be this old, it is rolled.\n * \n * Both the maximumFileSize and the rollingFrequency are used to manage rolling.\n * Whichever occurs first will cause the log file to be rolled.\n * \n * For example:\n * The rollingFrequency is 24 hours,\n * but the log file surpasses the maximumFileSize after only 20 hours.\n * The log file will be rolled at that 20 hour mark.\n * A new log file will be created, and the 24 hour timer will be restarted.\n * \n * You may optionally disable rolling due to filesize by setting maximumFileSize to zero.\n * If you do so, rolling is based solely on rollingFrequency.\n * \n * You may optionally disable rolling due to time by setting rollingFrequency to zero (or any non-positive number).\n * If you do so, rolling is based solely on maximumFileSize.\n * \n * If you disable both maximumFileSize and rollingFrequency, then the log file won't ever be rolled.\n * This is strongly discouraged.\n**/\n@property (readwrite, assign) unsigned long long maximumFileSize;\n@property (readwrite, assign) NSTimeInterval rollingFrequency;\n\n/**\n * The DDLogFileManager instance can be used to retrieve the list of log files,\n * and configure the maximum number of archived log files to keep.\n * \n * @see DDLogFileManager.maximumNumberOfLogFiles\n**/\n@property (strong, nonatomic, readonly) id <DDLogFileManager> logFileManager;\n\n\n// You can optionally force the current log file to be rolled with this method.\n// CompletionBlock will be called on main queue.\n\n- (void)rollLogFileWithCompletionBlock:(void (^)())completionBlock;\n\n// Method is deprecated. Use rollLogFileWithCompletionBlock: method instead.\n\n- (void)rollLogFile __attribute((deprecated));\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * DDLogFileInfo is a simple class that provides access to various file attributes.\n * It provides good performance as it only fetches the information if requested,\n * and it caches the information to prevent duplicate fetches.\n * \n * It was designed to provide quick snapshots of the current state of log files,\n * and to help sort log files in an array.\n * \n * This class does not monitor the files, or update it's cached attribute values if the file changes on disk.\n * This is not what the class was designed for.\n * \n * If you absolutely must get updated values,\n * you can invoke the reset method which will clear the cache.\n**/\n@interface DDLogFileInfo : NSObject\n{\n    __strong NSString *filePath;\n    __strong NSString *fileName;\n    \n    __strong NSDictionary *fileAttributes;\n    \n    __strong NSDate *creationDate;\n    __strong NSDate *modificationDate;\n    \n    unsigned long long fileSize;\n}\n\n@property (strong, nonatomic, readonly) NSString *filePath;\n@property (strong, nonatomic, readonly) NSString *fileName;\n\n@property (strong, nonatomic, readonly) NSDictionary *fileAttributes;\n\n@property (strong, nonatomic, readonly) NSDate *creationDate;\n@property (strong, nonatomic, readonly) NSDate *modificationDate;\n\n@property (nonatomic, readonly) unsigned long long fileSize;\n\n@property (nonatomic, readonly) NSTimeInterval age;\n\n@property (nonatomic, readwrite) BOOL isArchived;\n\n+ (instancetype)logFileWithPath:(NSString *)filePath;\n\n- (instancetype)initWithFilePath:(NSString *)filePath;\n\n- (void)reset;\n- (void)renameFile:(NSString *)newFileName;\n\n#if TARGET_IPHONE_SIMULATOR\n\n// So here's the situation.\n// Extended attributes are perfect for what we're trying to do here (marking files as archived).\n// This is exactly what extended attributes were designed for.\n// \n// But Apple screws us over on the simulator.\n// Everytime you build-and-go, they copy the application into a new folder on the hard drive,\n// and as part of the process they strip extended attributes from our log files.\n// Normally, a copy of a file preserves extended attributes.\n// So obviously Apple has gone to great lengths to piss us off.\n// \n// Thus we use a slightly different tactic for marking log files as archived in the simulator.\n// That way it \"just works\" and there's no confusion when testing.\n// \n// The difference in method names is indicative of the difference in functionality.\n// On the simulator we add an attribute by appending a filename extension.\n// \n// For example:\n// log-ABC123.txt -> log-ABC123.archived.txt\n\n- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName;\n\n- (void)addExtensionAttributeWithName:(NSString *)attrName;\n- (void)removeExtensionAttributeWithName:(NSString *)attrName;\n\n#else\n\n// Normal use of extended attributes used everywhere else,\n// such as on Macs and on iPhone devices.\n\n- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName;\n\n- (void)addExtendedAttributeWithName:(NSString *)attrName;\n- (void)removeExtendedAttributeWithName:(NSString *)attrName;\n\n#endif\n\n- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another;\n- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/DDLog.h",
    "content": "#import <Foundation/Foundation.h>\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * Otherwise, here is a quick refresher.\n * There are three steps to using the macros:\n * \n * Step 1:\n * Import the header in your implementation file:\n * \n * #import \"DDLog.h\"\n * \n * Step 2:\n * Define your logging level in your implementation file:\n * \n * // Log levels: off, error, warn, info, verbose\n * static const int ddLogLevel = LOG_LEVEL_VERBOSE;\n * \n * Step 2 [3rd party frameworks]:\n *\n * Define your LOG_LEVEL_DEF to a different variable/function than ddLogLevel:\n *\n * // #undef LOG_LEVEL_DEF // Undefine first only if needed\n * #define LOG_LEVEL_DEF myLibLogLevel\n *\n * Define your logging level in your implementation file:\n *\n * // Log levels: off, error, warn, info, verbose\n * static const int myLibLogLevel = LOG_LEVEL_VERBOSE;\n *\n * Step 3:\n * Replace your NSLog statements with DDLog statements according to the severity of the message.\n * \n * NSLog(@\"Fatal error, no dohickey found!\"); -> DDLogError(@\"Fatal error, no dohickey found!\");\n * \n * DDLog works exactly the same as NSLog.\n * This means you can pass it multiple variables just like NSLog.\n**/\n\n#ifndef LOG_LEVEL_DEF\n    #define LOG_LEVEL_DEF ddLogLevel\n#endif\n\n@class DDLogMessage;\n\n@protocol DDLogger;\n@protocol DDLogFormatter;\n\n/**\n * This is the single macro that all other macros below compile into.\n * This big multiline macro makes all the other macros easier to read.\n**/\n\n#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \\\n  [DDLog log:isAsynchronous                                             \\\n       level:lvl                                                        \\\n        flag:flg                                                        \\\n     context:ctx                                                        \\\n        file:__FILE__                                                   \\\n    function:fnct                                                       \\\n        line:__LINE__                                                   \\\n         tag:atag                                                       \\\n      format:(frmt), ##__VA_ARGS__]\n\n/**\n * Define the Objective-C and C versions of the macro.\n * These automatically inject the proper function name for either an objective-c method or c function.\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_OBJC_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MACRO(async, lvl, flg, ctx, nil, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MACRO(async, lvl, flg, ctx, nil, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define version of the macro that only execute if the logLevel is above the threshold.\n * The compiled versions essentially look like this:\n * \n * if (logFlagForThisLogMsg & ddLogLevel) { execute log message }\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels.\n * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques.\n * \n * Note that when compiler optimizations are enabled (as they are for your release builds),\n * the log messages above your logging threshold will automatically be compiled out.\n * \n * (If the compiler sees ddLogLevel declared as a constant, the compiler simply checks to see if the 'if' statement\n *  would execute, and if not it strips it from the binary.)\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define versions of the macros that also accept tags.\n * \n * The DDLogMessage object includes a 'tag' ivar that may be used for a variety of purposes.\n * It may be used to pass custom information to loggers or formatters.\n * Or it may be used by 3rd party extensions to the framework.\n * \n * Thes macros just make it a little easier to extend logging functionality.\n**/\n\n#define LOG_OBJC_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n                 LOG_MACRO(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n              LOG_MACRO(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n             LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n          LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n/**\n * Define the standard options.\n * \n * We default to only 4 levels because it makes it easier for beginners\n * to make the transition to a logging framework.\n * \n * More advanced users may choose to completely customize the levels (and level names) to suite their needs.\n * For more information on this see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n * \n * Advanced users may also notice that we're using a bitmask.\n * This is to allow for custom fine grained logging:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/FineGrainedLogging\n * \n * -- Flags --\n * \n * Typically you will use the LOG_LEVELS (see below), but the flags may be used directly in certain situations.\n * For example, say you have a lot of warning log messages, and you wanted to disable them.\n * However, you still needed to see your error and info log messages.\n * You could accomplish that with the following:\n * \n * static const int ddLogLevel = LOG_FLAG_ERROR | LOG_FLAG_INFO;\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * Flags may also be consulted when writing custom log formatters,\n * as the DDLogMessage class captures the individual flag that caused the log message to fire.\n * \n * -- Levels --\n * \n * Log levels are simply the proper bitmask of the flags.\n * \n * -- Booleans --\n * \n * The booleans may be used when your logging code involves more than one line.\n * For example:\n * \n * if (LOG_VERBOSE) {\n *     for (id sprocket in sprockets)\n *         DDLogVerbose(@\"sprocket: %@\", [sprocket description])\n * }\n * \n * -- Async --\n * \n * Defines the default asynchronous options.\n * The default philosophy for asynchronous logging is very simple:\n * \n * Log messages with errors should be executed synchronously.\n *     After all, an error just occurred. The application could be unstable.\n * \n * All other log messages, such as debug output, are executed asynchronously.\n *     After all, if it wasn't an error, then it was just informational output,\n *     or something the application was easily able to recover from.\n * \n * -- Changes --\n * \n * You are strongly discouraged from modifying this file.\n * If you do, you make it more difficult on yourself to merge future bug fixes and improvements from the project.\n * Instead, create your own MyLogging.h or ApplicationNameLogging.h or CompanyLogging.h\n * \n * For an example of customizing your logging experience, see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n**/\n\n#define LOG_FLAG_ERROR    (1 << 0)  // 0...00001\n#define LOG_FLAG_WARN     (1 << 1)  // 0...00010\n#define LOG_FLAG_INFO     (1 << 2)  // 0...00100\n#define LOG_FLAG_DEBUG    (1 << 3)  // 0...01000\n#define LOG_FLAG_VERBOSE  (1 << 4)  // 0...10000\n\n#define LOG_LEVEL_OFF     0\n#define LOG_LEVEL_ERROR   (LOG_FLAG_ERROR)                                                                          // 0...00001\n#define LOG_LEVEL_WARN    (LOG_FLAG_ERROR | LOG_FLAG_WARN)                                                          // 0...00011\n#define LOG_LEVEL_INFO    (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO)                                          // 0...00111\n#define LOG_LEVEL_DEBUG   (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG)                         // 0...01111\n#define LOG_LEVEL_VERBOSE (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG | LOG_FLAG_VERBOSE)      // 0...11111\n\n#define LOG_ERROR    (LOG_LEVEL_DEF & LOG_FLAG_ERROR)\n#define LOG_WARN     (LOG_LEVEL_DEF & LOG_FLAG_WARN)\n#define LOG_INFO     (LOG_LEVEL_DEF & LOG_FLAG_INFO)\n#define LOG_DEBUG    (LOG_LEVEL_DEF & LOG_FLAG_DEBUG)\n#define LOG_VERBOSE  (LOG_LEVEL_DEF & LOG_FLAG_VERBOSE)\n\n#define LOG_ASYNC_ENABLED YES\n\n#define LOG_ASYNC_ERROR    ( NO && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_WARN     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_INFO     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_DEBUG    (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_VERBOSE  (YES && LOG_ASYNC_ENABLED)\n\n#define DDLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogDebug(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define DDLogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogCDebug(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n/**\n * The THIS_FILE macro gives you an NSString of the file name.\n * For simplicity and clarity, the file name does not include the full path or file extension.\n * \n * For example: DDLogWarn(@\"%@: Unable to find thingy\", THIS_FILE) -> @\"MyViewController: Unable to find thingy\"\n**/\n\nNSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy);\n\n#define THIS_FILE (DDExtractFileNameWithoutExtension(__FILE__, NO))\n\n/**\n * The THIS_METHOD macro gives you the name of the current objective-c method.\n * \n * For example: DDLogWarn(@\"%@ - Requires non-nil strings\", THIS_METHOD) -> @\"setMake:model: requires non-nil strings\"\n * \n * Note: This does NOT work in straight C functions (non objective-c).\n * Instead you should use the predefined __FUNCTION__ macro.\n**/\n\n#define THIS_METHOD NSStringFromSelector(_cmd)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDLog : NSObject\n\n/**\n * Provides access to the underlying logging queue.\n * This may be helpful to Logger classes for things like thread synchronization.\n**/\n\n+ (dispatch_queue_t)loggingQueue;\n\n/**\n * Logging Primitive.\n * \n * This method is used by the macros above.\n * It is suggested you stick with the macros as they're easier to use.\n**/\n\n+ (void)log:(BOOL)synchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format, ... __attribute__ ((format (__NSString__, 9, 10)));\n\n/**\n * Logging Primitive.\n * \n * This method can be used if you have a prepared va_list.\n**/\n\n+ (void)log:(BOOL)asynchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format\n       args:(va_list)argList;\n\n\n/**\n * Since logging can be asynchronous, there may be times when you want to flush the logs.\n * The framework invokes this automatically when the application quits.\n**/\n\n+ (void)flushLog;\n\n/** \n * Loggers\n * \n * If you want your log statements to go somewhere,\n * you should create and add a logger.\n**/\n\n+ (void)addLogger:(id <DDLogger>)logger;    // adds the logger using maximum log level (LOG_LEVEL_VERBOSE)\n\n/**\n * Please use as logLevels the LOG_LEVEL_* macros\n *\n**/\n+ (void)addLogger:(id <DDLogger>)logger withLogLevel:(int)logLevel;\n\n+ (void)removeLogger:(id <DDLogger>)logger;\n+ (void)removeAllLoggers;\n\n/**\n * Registered Dynamic Logging\n * \n * These methods allow you to obtain a list of classes that are using registered dynamic logging,\n * and also provides methods to get and set their log level during run time.\n**/\n\n+ (NSArray *)registeredClasses;\n+ (NSArray *)registeredClassNames;\n\n+ (int)logLevelForClass:(Class)aClass;\n+ (int)logLevelForClassWithName:(NSString *)aClassName;\n\n+ (void)setLogLevel:(int)logLevel forClass:(Class)aClass;\n+ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogger <NSObject>\n@required\n\n- (void)logMessage:(DDLogMessage *)logMessage;\n\n/**\n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n**/\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@optional\n\n/**\n * Since logging is asynchronous, adding and removing loggers is also asynchronous.\n * In other words, the loggers are added and removed at appropriate times with regards to log messages.\n * \n * - Loggers will not receive log messages that were executed prior to when they were added.\n * - Loggers will not receive log messages that were executed after they were removed.\n * \n * These methods are executed in the logging thread/queue.\n * This is the same thread/queue that will execute every logMessage: invocation.\n * Loggers may use these methods for thread synchronization or other setup/teardown tasks.\n**/\n- (void)didAddLogger;\n- (void)willRemoveLogger;\n\n/**\n * Some loggers may buffer IO for optimization purposes.\n * For example, a database logger may only save occasionaly as the disk IO is slow.\n * In such loggers, this method should be implemented to flush any pending IO.\n * \n * This allows invocations of DDLog's flushLog method to be propogated to loggers that need it.\n * \n * Note that DDLog's flushLog method is invoked automatically when the application quits,\n * and it may be also invoked manually by the developer prior to application crashes, or other such reasons.\n**/\n- (void)flush;\n\n/**\n * Each logger is executed concurrently with respect to the other loggers.\n * Thus, a dedicated dispatch queue is used for each logger.\n * Logger implementations may optionally choose to provide their own dispatch queue.\n**/\n- (dispatch_queue_t)loggerQueue;\n\n/**\n * If the logger implementation does not choose to provide its own queue,\n * one will automatically be created for it.\n * The created queue will receive its name from this method.\n * This may be helpful for debugging or profiling reasons.\n**/\n- (NSString *)loggerName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogFormatter <NSObject>\n@required\n\n/**\n * Formatters may optionally be added to any logger.\n * This allows for increased flexibility in the logging environment.\n * For example, log messages for log files may be formatted differently than log messages for the console.\n * \n * For more information about formatters, see the \"Custom Formatters\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The formatter may also optionally filter the log message by returning nil,\n * in which case the logger will not log the message.\n**/\n- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;\n\n@optional\n\n/**\n * A single formatter instance can be added to multiple loggers.\n * These methods provides hooks to notify the formatter of when it's added/removed.\n *\n * This is primarily for thread-safety.\n * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers.\n * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter),\n * it could possibly use these hooks to switch to thread-safe versions of the code.\n**/\n- (void)didAddToLogger:(id <DDLogger>)logger;\n- (void)willRemoveFromLogger:(id <DDLogger>)logger;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDRegisteredDynamicLogging\n\n/**\n * Implement these methods to allow a file's log level to be managed from a central location.\n * \n * This is useful if you'd like to be able to change log levels for various parts\n * of your code from within the running application.\n * \n * Imagine pulling up the settings for your application,\n * and being able to configure the logging level on a per file basis.\n * \n * The implementation can be very straight-forward:\n * \n * + (int)ddLogLevel\n * {\n *     return ddLogLevel;\n * }\n *  \n * + (void)ddSetLogLevel:(int)logLevel\n * {\n *     ddLogLevel = logLevel;\n * }\n**/\n\n+ (int)ddLogLevel;\n+ (void)ddSetLogLevel:(int)logLevel;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogMessage class encapsulates information about the log message.\n * If you write custom loggers or formatters, you will be dealing with objects of this class.\n**/\n\nenum {\n    DDLogMessageCopyFile     = 1 << 0,\n    DDLogMessageCopyFunction = 1 << 1\n};\ntypedef int DDLogMessageOptions;\n\n@interface DDLogMessage : NSObject <NSCopying>\n{\n\n// The public variables below can be accessed directly (for speed).\n// For example: logMessage->logLevel\n    \n@public\n    int logLevel;\n    int logFlag;\n    int logContext;\n    NSString *logMsg;\n    NSDate *timestamp;\n    char *file;\n    char *function;\n    int lineNumber;\n    mach_port_t machThreadID;\n    char *queueLabel;\n    NSString *threadName;\n    \n    // For 3rd party extensions to the framework, where flags and contexts aren't enough.\n    id tag;\n    \n    // For 3rd party extensions that manually create DDLogMessage instances.\n    DDLogMessageOptions options;\n}\n\n/**\n * Standard init method for a log message object.\n * Used by the logging primitives. (And the macros use the logging primitives.)\n * \n * If you find need to manually create logMessage objects, there is one thing you should be aware of:\n * \n * If no flags are passed, the method expects the file and function parameters to be string literals.\n * That is, it expects the given strings to exist for the duration of the object's lifetime,\n * and it expects the given strings to be immutable.\n * In other words, it does not copy these strings, it simply points to them.\n * This is due to the fact that __FILE__ and __FUNCTION__ are usually used to specify these parameters,\n * so it makes sense to optimize and skip the unnecessary allocations.\n * However, if you need them to be copied you may use the options parameter to specify this.\n * Options is a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction.\n**/\n- (instancetype)initWithLogMsg:(NSString *)logMsg\n                         level:(int)logLevel\n                          flag:(int)logFlag\n                       context:(int)logContext\n                          file:(const char *)file\n                      function:(const char *)function\n                          line:(int)line\n                           tag:(id)tag\n                       options:(DDLogMessageOptions)optionsMask;\n\n/**\n * Returns the threadID as it appears in NSLog.\n * That is, it is a hexadecimal value which is calculated from the machThreadID.\n**/\n- (NSString *)threadID;\n\n/**\n * Convenience property to get just the file name, as the file variable is generally the full file path.\n * This method does not include the file extension, which is generally unwanted for logging purposes.\n**/\n- (NSString *)fileName;\n\n/**\n * Returns the function variable in NSString form.\n**/\n- (NSString *)methodName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogger protocol specifies that an optional formatter can be added to a logger.\n * Most (but not all) loggers will want to support formatters.\n * \n * However, writting getters and setters in a thread safe manner,\n * while still maintaining maximum speed for the logging process, is a difficult task.\n * \n * To do it right, the implementation of the getter/setter has strict requiremenets:\n * - Must NOT require the logMessage method to acquire a lock.\n * - Must NOT require the logMessage method to access an atomic property (also a lock of sorts).\n * \n * To simplify things, an abstract logger is provided that implements the getter and setter.\n * \n * Logger implementations may simply extend this class,\n * and they can ACCESS THE FORMATTER VARIABLE DIRECTLY from within their logMessage method!\n**/\n\n@interface DDAbstractLogger : NSObject <DDLogger>\n{\n    id <DDLogFormatter> formatter;\n    \n    dispatch_queue_t loggerQueue;\n}\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n// For thread-safety assertions\n- (BOOL)isOnGlobalLoggingQueue;\n- (BOOL)isOnInternalLoggerQueue;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/DDTTYLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#if TARGET_OS_IPHONE\n#import <UIKit/UIColor.h>   // iOS\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n#import <AppKit/NSColor.h>  // OS X with AppKit\n#else\n#import \"CLIColor.h\"        // OS X without AppKit\n#endif\n\n#import \"DDLog.h\"\n\n#define LOG_CONTEXT_ALL INT_MAX\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for Terminal output or Xcode console output,\n * depending on where you are running your code.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log (so it shows up in Console.app)\n * - StdErr (if stderr is a TTY, so log statements show up in Xcode console)\n * \n * To duplicate NSLog() functionality you can simply add this logger and an asl logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use only a file logger and a tty logger.\n**/\n\n@interface DDTTYLogger : DDAbstractLogger <DDLogger>\n{\n    NSCalendar *calendar;\n    NSUInteger calendarUnitFlags;\n    \n    NSString *appName;\n    char *app;\n    size_t appLen;\n    \n    NSString *processID;\n    char *pid;\n    size_t pidLen;\n    \n    BOOL colorsEnabled;\n    NSMutableArray *colorProfilesArray;\n    NSMutableDictionary *colorProfilesDict;\n}\n\n+ (instancetype)sharedInstance;\n\n/* Inherited from the DDLogger protocol:\n * \n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n * \n * More information about formatters can be found here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The actual implementation of these methods is inherited from DDAbstractLogger.\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n \n*/\n\n/**\n * Want to use different colors for different log levels?\n * Enable this property.\n * \n * If you run the application via the Terminal (not Xcode),\n * the logger will map colors to xterm-256color or xterm-color (if available).\n * \n * Xcode does NOT natively support colors in the Xcode debugging console.\n * You'll need to install the XcodeColors plugin to see colors in the Xcode console.\n * https://github.com/robbiehanson/XcodeColors\n * \n * The default value if NO.\n**/\n@property (readwrite, assign) BOOL colorsEnabled;\n\n/**\n * The default color set (foregroundColor, backgroundColor) is:\n * \n * - LOG_FLAG_ERROR = (red, nil)\n * - LOG_FLAG_WARN  = (orange, nil)\n * \n * You can customize the colors however you see fit.\n * Please note that you are passing a flag, NOT a level.\n * \n * GOOD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_FLAG_INFO];  // <- Good :)\n *  BAD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_LEVEL_INFO]; // <- BAD! :(\n * \n * LOG_FLAG_INFO  = 0...00100\n * LOG_LEVEL_INFO = 0...00111 <- Would match LOG_FLAG_INFO and LOG_FLAG_WARN and LOG_FLAG_ERROR\n * \n * If you run the application within Xcode, then the XcodeColors plugin is required.\n * \n * If you run the application from a shell, then DDTTYLogger will automatically map the given color to\n * the closest available color. (xterm-256color or xterm-color which have 256 and 16 supported colors respectively.)\n * \n * This method invokes setForegroundColor:backgroundColor:forFlag:context: and applies it to `LOG_CONTEXT_ALL`.\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask;\n#endif\n\n/**\n * Just like setForegroundColor:backgroundColor:flag, but allows you to specify a particular logging context.\n * \n * A logging context is often used to identify log messages coming from a 3rd party framework,\n * although logging context's can be used for many different functions.\n * \n * Use LOG_CONTEXT_ALL to set the deafult color for all contexts that have no specific color set defined.\n * \n * Logging context's are explained in further detail here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomContext\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#endif\n\n/**\n * Similar to the methods above, but allows you to map DDLogMessage->tag to a particular color profile.\n * For example, you could do something like this:\n * \n * static NSString *const PurpleTag = @\"PurpleTag\";\n * \n * #define DDLogPurple(frmt, ...) LOG_OBJC_TAG_MACRO(NO, 0, 0, 0, PurpleTag, frmt, ##__VA_ARGS__)\n * \n * And then in your applicationDidFinishLaunching, or wherever you configure Lumberjack:\n * \n * #if TARGET_OS_IPHONE\n *   UIColor *purple = [UIColor colorWithRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n * #else\n *   NSColor *purple = [NSColor colorWithCalibratedRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n *\n * Note: For CLI OS X projects that don't link with AppKit use CLIColor objects instead\n * \n * [[DDTTYLogger sharedInstance] setForegroundColor:purple backgroundColor:nil forTag:PurpleTag];\n * [DDLog addLogger:[DDTTYLogger sharedInstance]];\n * \n * This would essentially give you a straight NSLog replacement that prints in purple:\n * \n * DDLogPurple(@\"I'm a purple log message!\");\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forTag:(id <NSCopying>)tag;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forTag:(id <NSCopying>)tag;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forTag:(id <NSCopying>)tag;\n#endif\n\n/**\n * Clearing color profiles.\n**/\n- (void)clearColorsForFlag:(int)mask;\n- (void)clearColorsForFlag:(int)mask context:(int)context;\n- (void)clearColorsForTag:(id <NSCopying>)tag;\n- (void)clearColorsForAllFlags;\n- (void)clearColorsForAllTags;\n- (void)clearAllColors;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/NSJSONSerialization+ObjectWithNString.h",
    "content": "//\n//  NSJSONSerialization+ObjectWithNString.h\n//  Ejecta\n//\n//  Created by matth on 7/19/13.\n//\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (ObjectWithNString)\n+ (id)JSONObjectWithString:(NSString *)string options:(NSJSONReadingOptions)opt error:(NSError **)error;\n+ (NSString*)stringWithNSDictionary:(NSDictionary*)dictionary;\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/NSJSONSerialization+PBJSONHelpers.h",
    "content": "//\n//  NSJSONSerialization+PBJSONHelpers.h\n//  PebbleVendor\n//\n//  Created by matth on 9/17/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (PBJSONHelpers)\n\n/** @name Reflection helpers */\n\n/**\n * Derived from the Box SDK (MIT license) NSJSONSerialization+BoxAdditions...\n * https://github.com/box/box-ios-sdk-v2/tree/master/BoxSDK/Categories\n \n * Ensure that the object at `key` in `dictionary` is a member of the expected class.\n * `NSNull` may be specified as an allowable value. This method may return nil if `key`\n * is not present in `dictionary`.\n *\n * @param key The key to lookup in `dictionary`.\n * @param dictionary A dictionary resulting from deserializing a JSON object.\n * @param cls The expected class of the value at key.\n * @param nullAllowed If true, `NSNull` will be returned. If not, NSNull will be converted to nil. Property getters that pass `YES` for this parameter should have the return type of `id`.\n *\n * @return The object at `key` in `dictionary` if expectations are satisfied; `nil` otherwise.\n */\n+ (id)ensureObjectForKey:(NSString *)key inDictionary:(NSDictionary *)dictionary hasExpectedType:(Class)cls nullAllowed:(BOOL)nullAllowed;\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/NSString+HexData.h",
    "content": "//\n//  NSString+HexData.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 11/19/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSString (HexData)\n\n- (NSData*)hexData;\n\n@end\n\n\n@interface NSData (HexString)\n\n- (NSString*)hexString;\n\n@end"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/UIDevice-Hardware.h",
    "content": "/*\n Erica Sadun, http://ericasadun.com\n iPhone Developer's Cookbook, 6.x Edition\n BSD License, Use at your own risk\n */\n\n#import <UIKit/UIKit.h>\n\ntypedef enum {\n    UIDeviceFamilyiPhone,\n    UIDeviceFamilyiPod,\n    UIDeviceFamilyiPad,\n    UIDeviceFamilyAppleTV,\n    UIDeviceFamilyUnknown,\n    \n} UIDeviceFamily;\n\n@interface UIDevice (Hardware)\n- (NSString *) platform;\n- (NSString *) hwmodel;\n- (NSString *) platformString;\n\n- (NSUInteger) cpuFrequency;\n- (NSUInteger) busFrequency;\n- (NSUInteger) cpuCount;\n- (NSUInteger) totalMemory;\n- (NSUInteger) userMemory;\n\n- (NSNumber *) totalDiskSpace;\n- (NSNumber *) freeDiskSpace;\n\n- (NSString *) macaddress;\n\n- (BOOL) hasRetinaDisplay;\n- (BOOL) hasBluetoothMAP;\n- (UIDeviceFamily) deviceFamily;\n@end"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/CHMultiDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMultiDictionary.h\n \n Copyright (c) 2008-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n#import \"CHMutableDictionary.h\"\n\n/**\n @file CHMultiDictionary.h\n \n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> in which multiple values may be associated with a given key.\n */\n\n/**\n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> implementation, in which multiple values may be associated with a given key.\n \n A map is the same as a \"dictionary\", \"associative array\", etc. and consists of a unique set of keys and a collection of values. In a standard map, each key is associated with one value; in a multimap, more than one value may be associated with a given key. A multimap is appropriate for any situation in which one item may correspond to (map to) multiple values, such as a term in an book index and occurrences of that term, courses for which a student is registered, etc.\n \n The values for a key may or may not be ordered. This implementation does not maintain an ordering for objects associated with a key, nor does it allow for multiple occurrences of an object associated with the same key. Internally, this class uses an NSMutableDictionary, and the associated values for each key are stored in distinct NSMutableSet instances. (Just as with NSDictionary, each key added to a CHMultiDictionary is copied using \\link NSCopying#copyWithZone: -copyWithZone:\\endlink and all keys must conform to the NSCopying protocol.) Objects are retained on insertion and released on removal or deallocation.\n \n Since NSDictionary and NSSet conform to the NSCoding protocol, any internal data can be serialized. However, NSSet cannot automatically be written to or read from a property list, since it has no specified order. Thus, instances of CHMultiDictionary must be encoded as an NSData object before saving to disk.\n \n Currently, this implementation does not support key-value coding, observing, or binding like NSDictionary does. Consequently, the distinction between \"object\" and \"value\" is blurrier, although hopefully consistent with the Cocoa APIs in general....\n \n Unlike NSDictionary and other Cocoa collections, CHMultiDictionary has not been designed with mutable and immutable variants. A multimap is not that much more useful if it is immutable, so any copies made of this class are mutable by definition.\n */\n@interface CHMultiDictionary : CHMutableDictionary {\n\tNSUInteger objectCount; // Number of objects currently in the dictionary.\n}\n\n#pragma mark Querying Contents\n\n/**\n Returns the number of objects in the receiver, associated with any key.\n \n @return The number of objects in the receiver. This is the sum total of objects associated with each key in the dictonary.\n \n @see allObjects\n */\n- (NSUInteger) countForAllKeys;\n\n/**\n Returns the number of objects associated with a given key.\n \n @param aKey The key for which to return the object count.\n @return The number of objects associated with a given key in the dictionary.\n \n @see objectsForKey:\n */\n- (NSUInteger) countForKey:(id)aKey;\n\n/**\n Returns an array of objects associated with a given key.\n \n @param aKey The key for which to return the corresponding objects.\n @return An NSSet of objects associated with a given key, or nil if the key is not in the receiver.\n \n @see countForKey:\n @see removeObjectsForKey:\n */\n- (NSSet*) objectsForKey:(id)aKey;\n\n#pragma mark Modifying Contents\n\n/**\n Adds a given object to an entry for a given key in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param anObject An object to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#addObject: -[NSMutableSet addObject:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObject:(id)anObject forKey:(id)aKey;\n\n/**\n Adds the given object(s) to a key entry in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param objectSet A set of objects to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#unionSet: -[NSMutableSet unionSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n/**\n Remove @b all occurrences of @a anObject associated with a given key.\n \n @param aKey The key for which to remove an entry.\n @param anObject An object (possibly) associated with @a aKey in the receiver. Objects are considered to be equal if -compare: returns NSOrderedSame.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n If @a aKey does not exist in the receiver, or if @a anObject is not associated with @a aKey, the contents of the receiver are not modified.\n \n @see containsObject\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) removeObject:(id)anObject forKey:(id)aKey;\n\n/**\n Remove a given key and its associated value(s) from the receiver.\n \n @param aKey The key for which to remove an entry.\n \n If @a aKey does not exist in the receiver, there is no effect on the receiver.\n \n @see objectsForKey:\n @see removeObject:forKey:\n */\n- (void) removeObjectsForKey:(id)aKey;\n\n/**\n Sets the object(s) associated with a key entry in the receiver.\n \n @param aKey The key with which to associate the objects in @a objectSet.\n @param objectSet A set of objects to associate with @a key. If @a objectSet is empty, the contents of the receiver are not modified. If an entry for @a key already exists in the receiver, @a objectSet is added using \\link NSMutableSet#setSet: -[NSMutableSet setSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) setObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/CHMutableDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMutableDictionary.h\n \n Copyright (c) 2009-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n__attribute__((visibility(\"hidden\"))) void createCollectableCFMutableDictionary(CFMutableDictionaryRef* dictionary, NSUInteger initialCapacity);\n\n/**\n @file CHMutableDictionary.h\n \n A mutable dictionary class.\n */\n\n/**\n A mutable dictionary class.\n \n A CFMutableDictionaryRef is used internally to store the key-value pairs. Subclasses may choose to add other instance variables to enable a specific ordering of keys, override methods to modify behavior, and add methods to extend existing behaviors. However, all subclasses should behave like a standard Cocoa dictionary as much as possible, and document clearly when they do not.\n \n @note Any method inherited from NSDictionary or NSMutableDictionary is supported by this class and its children. Please see the documentation for those classes for details.\n \n @todo Implement @c -copy and @c -mutableCopy differently (so users can actually obtain an immutable copy) and make mutation methods aware of immutability?\n */\n@interface CHMutableDictionary : NSMutableDictionary {\n  CFMutableDictionaryRef dictionary; // A Core Foundation dictionary.\n}\n\n- (id) initWithCapacity:(NSUInteger)numItems;\n\n- (NSUInteger) count;\n- (NSEnumerator*) keyEnumerator;\n- (id) objectForKey:(id)aKey;\n- (void) removeAllObjects;\n- (void) removeObjectForKey:(id)aKey;\n- (void) setObject:(id)anObject forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/DDASLLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import <asl.h>\n\n#import \"DDLog.h\"\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for the Apple System Log facility.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log\n * - StdErr (if stderr is a TTY) so log statements show up in Xcode console\n * \n * To duplicate NSLog() functionality you can simply add this logger and a tty logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use a file logger and a tty logger.\n**/\n\n@interface DDASLLogger : DDAbstractLogger <DDLogger>\n{\n    aslclient client;\n}\n\n+ (instancetype)sharedInstance;\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/DDFileLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"DDLog.h\"\n\n@class DDLogFileInfo;\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger to write log statements to a file.\n**/\n\n\n// Default configuration and safety/sanity values.\n// \n// maximumFileSize         -> DEFAULT_LOG_MAX_FILE_SIZE\n// rollingFrequency        -> DEFAULT_LOG_ROLLING_FREQUENCY\n// maximumNumberOfLogFiles -> DEFAULT_LOG_MAX_NUM_LOG_FILES\n// \n// You should carefully consider the proper configuration values for your application.\n\n#define DEFAULT_LOG_MAX_FILE_SIZE     (1024 * 1024)   //  1 MB\n#define DEFAULT_LOG_ROLLING_FREQUENCY (60 * 60 * 24)  // 24 Hours\n#define DEFAULT_LOG_MAX_NUM_LOG_FILES (5)             //  5 Files\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// The LogFileManager protocol is designed to allow you to control all aspects of your log files.\n// \n// The primary purpose of this is to allow you to do something with the log files after they have been rolled.\n// Perhaps you want to compress them to save disk space.\n// Perhaps you want to upload them to an FTP server.\n// Perhaps you want to run some analytics on the file.\n// \n// A default LogFileManager is, of course, provided.\n// The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property.\n// \n// This protocol provides various methods to fetch the list of log files.\n// \n// There are two variants: sorted and unsorted.\n// If sorting is not necessary, the unsorted variant is obviously faster.\n// The sorted variant will return an array sorted by when the log files were created,\n// with the most recently created log file at index 0, and the oldest log file at the end of the array.\n// \n// You can fetch only the log file paths (full path including name), log file names (name only),\n// or an array of DDLogFileInfo objects.\n// The DDLogFileInfo class is documented below, and provides a handy wrapper that\n// gives you easy access to various file attributes such as the creation date or the file size.\n\n@protocol DDLogFileManager <NSObject>\n@required\n\n// Public properties\n\n/**\n * The maximum number of archived log files to keep on disk.\n * For example, if this property is set to 3,\n * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk.\n * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted.\n * \n * You may optionally disable deleting old/rolled/archived log files by setting this property to zero.\n**/\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n// Public methods\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n// Private methods (only to be used by DDFileLogger)\n\n- (NSString *)createNewLogFile;\n\n@optional\n\n// Notifications from DDFileLogger\n\n- (void)didArchiveLogFile:(NSString *)logFilePath;\n- (void)didRollAndArchiveLogFile:(NSString *)logFilePath;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Default log file manager.\n * \n * All log files are placed inside the logsDirectory.\n * If a specific logsDirectory isn't specified, the default directory is used.\n * On Mac, this is in ~/Library/Logs/<Application Name>.\n * On iPhone, this is in ~/Library/Caches/Logs.\n * \n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n * \n * Archived log files are automatically deleted according to the maximumNumberOfLogFiles property.\n**/\n@interface DDLogFileManagerDefault : NSObject <DDLogFileManager>\n{\n    NSUInteger maximumNumberOfLogFiles;\n    NSString *_logsDirectory;\n}\n\n- (id)init;\n- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory;\n\n/*\n * Methods to override.\n *\n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n *\n * If you wish to change default filename, you can override following two methods.\n * - newLogFileName method would be called on new logfile creation.\n * - isLogFile: method would be called to filter logfiles from all other files in logsDirectory.\n *   You have to parse given filename and return YES if it is logFile.\n *\n * **NOTE**\n * newLogFileName returns filename. If appropriate file already exists, number would be added\n * to filename before extension. You have to handle this case in isLogFile: method.\n *\n * Example:\n * - newLogFileName returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 2.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03 1.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 3.log\" would be created.\n**/\n- (NSString *)newLogFileName;\n- (BOOL)isLogFile:(NSString *)fileName;\n\n/* Inherited from DDLogFileManager protocol:\n\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n*/\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Most users will want file log messages to be prepended with the date and time.\n * Rather than forcing the majority of users to write their own formatter,\n * we will supply a logical default formatter.\n * Users can easily replace this formatter with their own by invoking the setLogFormatter method.\n * It can also be removed by calling setLogFormatter, and passing a nil parameter.\n * \n * In addition to the convenience of having a logical default formatter,\n * it will also provide a template that makes it easy for developers to copy and change.\n**/\n@interface DDLogFileFormatterDefault : NSObject <DDLogFormatter>\n{\n    NSDateFormatter *dateFormatter;\n}\n\n- (id)init;\n- (instancetype)initWithDateFormatter:(NSDateFormatter *)dateFormatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDFileLogger : DDAbstractLogger <DDLogger>\n{\n    __strong id <DDLogFileManager> logFileManager;\n    \n    DDLogFileInfo *currentLogFileInfo;\n    NSFileHandle *currentLogFileHandle;\n    \n    dispatch_source_t currentLogFileVnode;\n    dispatch_source_t rollingTimer;\n    \n    unsigned long long maximumFileSize;\n    NSTimeInterval rollingFrequency;\n}\n\n- (id)init;\n- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)logFileManager;\n\n/**\n * Log File Rolling:\n * \n * maximumFileSize:\n *   The approximate maximum size to allow log files to grow.\n *   If a log file is larger than this value after a log statement is appended,\n *   then the log file is rolled.\n * \n * rollingFrequency\n *   How often to roll the log file.\n *   The frequency is given as an NSTimeInterval, which is a double that specifies the interval in seconds.\n *   Once the log file gets to be this old, it is rolled.\n * \n * Both the maximumFileSize and the rollingFrequency are used to manage rolling.\n * Whichever occurs first will cause the log file to be rolled.\n * \n * For example:\n * The rollingFrequency is 24 hours,\n * but the log file surpasses the maximumFileSize after only 20 hours.\n * The log file will be rolled at that 20 hour mark.\n * A new log file will be created, and the 24 hour timer will be restarted.\n * \n * You may optionally disable rolling due to filesize by setting maximumFileSize to zero.\n * If you do so, rolling is based solely on rollingFrequency.\n * \n * You may optionally disable rolling due to time by setting rollingFrequency to zero (or any non-positive number).\n * If you do so, rolling is based solely on maximumFileSize.\n * \n * If you disable both maximumFileSize and rollingFrequency, then the log file won't ever be rolled.\n * This is strongly discouraged.\n**/\n@property (readwrite, assign) unsigned long long maximumFileSize;\n@property (readwrite, assign) NSTimeInterval rollingFrequency;\n\n/**\n * The DDLogFileManager instance can be used to retrieve the list of log files,\n * and configure the maximum number of archived log files to keep.\n * \n * @see DDLogFileManager.maximumNumberOfLogFiles\n**/\n@property (strong, nonatomic, readonly) id <DDLogFileManager> logFileManager;\n\n\n// You can optionally force the current log file to be rolled with this method.\n// CompletionBlock will be called on main queue.\n\n- (void)rollLogFileWithCompletionBlock:(void (^)())completionBlock;\n\n// Method is deprecated. Use rollLogFileWithCompletionBlock: method instead.\n\n- (void)rollLogFile __attribute((deprecated));\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * DDLogFileInfo is a simple class that provides access to various file attributes.\n * It provides good performance as it only fetches the information if requested,\n * and it caches the information to prevent duplicate fetches.\n * \n * It was designed to provide quick snapshots of the current state of log files,\n * and to help sort log files in an array.\n * \n * This class does not monitor the files, or update it's cached attribute values if the file changes on disk.\n * This is not what the class was designed for.\n * \n * If you absolutely must get updated values,\n * you can invoke the reset method which will clear the cache.\n**/\n@interface DDLogFileInfo : NSObject\n{\n    __strong NSString *filePath;\n    __strong NSString *fileName;\n    \n    __strong NSDictionary *fileAttributes;\n    \n    __strong NSDate *creationDate;\n    __strong NSDate *modificationDate;\n    \n    unsigned long long fileSize;\n}\n\n@property (strong, nonatomic, readonly) NSString *filePath;\n@property (strong, nonatomic, readonly) NSString *fileName;\n\n@property (strong, nonatomic, readonly) NSDictionary *fileAttributes;\n\n@property (strong, nonatomic, readonly) NSDate *creationDate;\n@property (strong, nonatomic, readonly) NSDate *modificationDate;\n\n@property (nonatomic, readonly) unsigned long long fileSize;\n\n@property (nonatomic, readonly) NSTimeInterval age;\n\n@property (nonatomic, readwrite) BOOL isArchived;\n\n+ (instancetype)logFileWithPath:(NSString *)filePath;\n\n- (instancetype)initWithFilePath:(NSString *)filePath;\n\n- (void)reset;\n- (void)renameFile:(NSString *)newFileName;\n\n#if TARGET_IPHONE_SIMULATOR\n\n// So here's the situation.\n// Extended attributes are perfect for what we're trying to do here (marking files as archived).\n// This is exactly what extended attributes were designed for.\n// \n// But Apple screws us over on the simulator.\n// Everytime you build-and-go, they copy the application into a new folder on the hard drive,\n// and as part of the process they strip extended attributes from our log files.\n// Normally, a copy of a file preserves extended attributes.\n// So obviously Apple has gone to great lengths to piss us off.\n// \n// Thus we use a slightly different tactic for marking log files as archived in the simulator.\n// That way it \"just works\" and there's no confusion when testing.\n// \n// The difference in method names is indicative of the difference in functionality.\n// On the simulator we add an attribute by appending a filename extension.\n// \n// For example:\n// log-ABC123.txt -> log-ABC123.archived.txt\n\n- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName;\n\n- (void)addExtensionAttributeWithName:(NSString *)attrName;\n- (void)removeExtensionAttributeWithName:(NSString *)attrName;\n\n#else\n\n// Normal use of extended attributes used everywhere else,\n// such as on Macs and on iPhone devices.\n\n- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName;\n\n- (void)addExtendedAttributeWithName:(NSString *)attrName;\n- (void)removeExtendedAttributeWithName:(NSString *)attrName;\n\n#endif\n\n- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another;\n- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/DDLog.h",
    "content": "#import <Foundation/Foundation.h>\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * Otherwise, here is a quick refresher.\n * There are three steps to using the macros:\n * \n * Step 1:\n * Import the header in your implementation file:\n * \n * #import \"DDLog.h\"\n * \n * Step 2:\n * Define your logging level in your implementation file:\n * \n * // Log levels: off, error, warn, info, verbose\n * static const int ddLogLevel = LOG_LEVEL_VERBOSE;\n * \n * Step 2 [3rd party frameworks]:\n *\n * Define your LOG_LEVEL_DEF to a different variable/function than ddLogLevel:\n *\n * // #undef LOG_LEVEL_DEF // Undefine first only if needed\n * #define LOG_LEVEL_DEF myLibLogLevel\n *\n * Define your logging level in your implementation file:\n *\n * // Log levels: off, error, warn, info, verbose\n * static const int myLibLogLevel = LOG_LEVEL_VERBOSE;\n *\n * Step 3:\n * Replace your NSLog statements with DDLog statements according to the severity of the message.\n * \n * NSLog(@\"Fatal error, no dohickey found!\"); -> DDLogError(@\"Fatal error, no dohickey found!\");\n * \n * DDLog works exactly the same as NSLog.\n * This means you can pass it multiple variables just like NSLog.\n**/\n\n#ifndef LOG_LEVEL_DEF\n    #define LOG_LEVEL_DEF ddLogLevel\n#endif\n\n@class DDLogMessage;\n\n@protocol DDLogger;\n@protocol DDLogFormatter;\n\n/**\n * This is the single macro that all other macros below compile into.\n * This big multiline macro makes all the other macros easier to read.\n**/\n\n#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \\\n  [DDLog log:isAsynchronous                                             \\\n       level:lvl                                                        \\\n        flag:flg                                                        \\\n     context:ctx                                                        \\\n        file:__FILE__                                                   \\\n    function:fnct                                                       \\\n        line:__LINE__                                                   \\\n         tag:atag                                                       \\\n      format:(frmt), ##__VA_ARGS__]\n\n/**\n * Define the Objective-C and C versions of the macro.\n * These automatically inject the proper function name for either an objective-c method or c function.\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_OBJC_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MACRO(async, lvl, flg, ctx, nil, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MACRO(async, lvl, flg, ctx, nil, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define version of the macro that only execute if the logLevel is above the threshold.\n * The compiled versions essentially look like this:\n * \n * if (logFlagForThisLogMsg & ddLogLevel) { execute log message }\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels.\n * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques.\n * \n * Note that when compiler optimizations are enabled (as they are for your release builds),\n * the log messages above your logging threshold will automatically be compiled out.\n * \n * (If the compiler sees ddLogLevel declared as a constant, the compiler simply checks to see if the 'if' statement\n *  would execute, and if not it strips it from the binary.)\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define versions of the macros that also accept tags.\n * \n * The DDLogMessage object includes a 'tag' ivar that may be used for a variety of purposes.\n * It may be used to pass custom information to loggers or formatters.\n * Or it may be used by 3rd party extensions to the framework.\n * \n * Thes macros just make it a little easier to extend logging functionality.\n**/\n\n#define LOG_OBJC_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n                 LOG_MACRO(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n              LOG_MACRO(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n             LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n          LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n/**\n * Define the standard options.\n * \n * We default to only 4 levels because it makes it easier for beginners\n * to make the transition to a logging framework.\n * \n * More advanced users may choose to completely customize the levels (and level names) to suite their needs.\n * For more information on this see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n * \n * Advanced users may also notice that we're using a bitmask.\n * This is to allow for custom fine grained logging:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/FineGrainedLogging\n * \n * -- Flags --\n * \n * Typically you will use the LOG_LEVELS (see below), but the flags may be used directly in certain situations.\n * For example, say you have a lot of warning log messages, and you wanted to disable them.\n * However, you still needed to see your error and info log messages.\n * You could accomplish that with the following:\n * \n * static const int ddLogLevel = LOG_FLAG_ERROR | LOG_FLAG_INFO;\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * Flags may also be consulted when writing custom log formatters,\n * as the DDLogMessage class captures the individual flag that caused the log message to fire.\n * \n * -- Levels --\n * \n * Log levels are simply the proper bitmask of the flags.\n * \n * -- Booleans --\n * \n * The booleans may be used when your logging code involves more than one line.\n * For example:\n * \n * if (LOG_VERBOSE) {\n *     for (id sprocket in sprockets)\n *         DDLogVerbose(@\"sprocket: %@\", [sprocket description])\n * }\n * \n * -- Async --\n * \n * Defines the default asynchronous options.\n * The default philosophy for asynchronous logging is very simple:\n * \n * Log messages with errors should be executed synchronously.\n *     After all, an error just occurred. The application could be unstable.\n * \n * All other log messages, such as debug output, are executed asynchronously.\n *     After all, if it wasn't an error, then it was just informational output,\n *     or something the application was easily able to recover from.\n * \n * -- Changes --\n * \n * You are strongly discouraged from modifying this file.\n * If you do, you make it more difficult on yourself to merge future bug fixes and improvements from the project.\n * Instead, create your own MyLogging.h or ApplicationNameLogging.h or CompanyLogging.h\n * \n * For an example of customizing your logging experience, see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n**/\n\n#define LOG_FLAG_ERROR    (1 << 0)  // 0...00001\n#define LOG_FLAG_WARN     (1 << 1)  // 0...00010\n#define LOG_FLAG_INFO     (1 << 2)  // 0...00100\n#define LOG_FLAG_DEBUG    (1 << 3)  // 0...01000\n#define LOG_FLAG_VERBOSE  (1 << 4)  // 0...10000\n\n#define LOG_LEVEL_OFF     0\n#define LOG_LEVEL_ERROR   (LOG_FLAG_ERROR)                                                                          // 0...00001\n#define LOG_LEVEL_WARN    (LOG_FLAG_ERROR | LOG_FLAG_WARN)                                                          // 0...00011\n#define LOG_LEVEL_INFO    (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO)                                          // 0...00111\n#define LOG_LEVEL_DEBUG   (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG)                         // 0...01111\n#define LOG_LEVEL_VERBOSE (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG | LOG_FLAG_VERBOSE)      // 0...11111\n\n#define LOG_ERROR    (LOG_LEVEL_DEF & LOG_FLAG_ERROR)\n#define LOG_WARN     (LOG_LEVEL_DEF & LOG_FLAG_WARN)\n#define LOG_INFO     (LOG_LEVEL_DEF & LOG_FLAG_INFO)\n#define LOG_DEBUG    (LOG_LEVEL_DEF & LOG_FLAG_DEBUG)\n#define LOG_VERBOSE  (LOG_LEVEL_DEF & LOG_FLAG_VERBOSE)\n\n#define LOG_ASYNC_ENABLED YES\n\n#define LOG_ASYNC_ERROR    ( NO && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_WARN     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_INFO     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_DEBUG    (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_VERBOSE  (YES && LOG_ASYNC_ENABLED)\n\n#define DDLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogDebug(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define DDLogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogCDebug(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n/**\n * The THIS_FILE macro gives you an NSString of the file name.\n * For simplicity and clarity, the file name does not include the full path or file extension.\n * \n * For example: DDLogWarn(@\"%@: Unable to find thingy\", THIS_FILE) -> @\"MyViewController: Unable to find thingy\"\n**/\n\nNSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy);\n\n#define THIS_FILE (DDExtractFileNameWithoutExtension(__FILE__, NO))\n\n/**\n * The THIS_METHOD macro gives you the name of the current objective-c method.\n * \n * For example: DDLogWarn(@\"%@ - Requires non-nil strings\", THIS_METHOD) -> @\"setMake:model: requires non-nil strings\"\n * \n * Note: This does NOT work in straight C functions (non objective-c).\n * Instead you should use the predefined __FUNCTION__ macro.\n**/\n\n#define THIS_METHOD NSStringFromSelector(_cmd)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDLog : NSObject\n\n/**\n * Provides access to the underlying logging queue.\n * This may be helpful to Logger classes for things like thread synchronization.\n**/\n\n+ (dispatch_queue_t)loggingQueue;\n\n/**\n * Logging Primitive.\n * \n * This method is used by the macros above.\n * It is suggested you stick with the macros as they're easier to use.\n**/\n\n+ (void)log:(BOOL)synchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format, ... __attribute__ ((format (__NSString__, 9, 10)));\n\n/**\n * Logging Primitive.\n * \n * This method can be used if you have a prepared va_list.\n**/\n\n+ (void)log:(BOOL)asynchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format\n       args:(va_list)argList;\n\n\n/**\n * Since logging can be asynchronous, there may be times when you want to flush the logs.\n * The framework invokes this automatically when the application quits.\n**/\n\n+ (void)flushLog;\n\n/** \n * Loggers\n * \n * If you want your log statements to go somewhere,\n * you should create and add a logger.\n**/\n\n+ (void)addLogger:(id <DDLogger>)logger;    // adds the logger using maximum log level (LOG_LEVEL_VERBOSE)\n\n/**\n * Please use as logLevels the LOG_LEVEL_* macros\n *\n**/\n+ (void)addLogger:(id <DDLogger>)logger withLogLevel:(int)logLevel;\n\n+ (void)removeLogger:(id <DDLogger>)logger;\n+ (void)removeAllLoggers;\n\n/**\n * Registered Dynamic Logging\n * \n * These methods allow you to obtain a list of classes that are using registered dynamic logging,\n * and also provides methods to get and set their log level during run time.\n**/\n\n+ (NSArray *)registeredClasses;\n+ (NSArray *)registeredClassNames;\n\n+ (int)logLevelForClass:(Class)aClass;\n+ (int)logLevelForClassWithName:(NSString *)aClassName;\n\n+ (void)setLogLevel:(int)logLevel forClass:(Class)aClass;\n+ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogger <NSObject>\n@required\n\n- (void)logMessage:(DDLogMessage *)logMessage;\n\n/**\n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n**/\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@optional\n\n/**\n * Since logging is asynchronous, adding and removing loggers is also asynchronous.\n * In other words, the loggers are added and removed at appropriate times with regards to log messages.\n * \n * - Loggers will not receive log messages that were executed prior to when they were added.\n * - Loggers will not receive log messages that were executed after they were removed.\n * \n * These methods are executed in the logging thread/queue.\n * This is the same thread/queue that will execute every logMessage: invocation.\n * Loggers may use these methods for thread synchronization or other setup/teardown tasks.\n**/\n- (void)didAddLogger;\n- (void)willRemoveLogger;\n\n/**\n * Some loggers may buffer IO for optimization purposes.\n * For example, a database logger may only save occasionaly as the disk IO is slow.\n * In such loggers, this method should be implemented to flush any pending IO.\n * \n * This allows invocations of DDLog's flushLog method to be propogated to loggers that need it.\n * \n * Note that DDLog's flushLog method is invoked automatically when the application quits,\n * and it may be also invoked manually by the developer prior to application crashes, or other such reasons.\n**/\n- (void)flush;\n\n/**\n * Each logger is executed concurrently with respect to the other loggers.\n * Thus, a dedicated dispatch queue is used for each logger.\n * Logger implementations may optionally choose to provide their own dispatch queue.\n**/\n- (dispatch_queue_t)loggerQueue;\n\n/**\n * If the logger implementation does not choose to provide its own queue,\n * one will automatically be created for it.\n * The created queue will receive its name from this method.\n * This may be helpful for debugging or profiling reasons.\n**/\n- (NSString *)loggerName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogFormatter <NSObject>\n@required\n\n/**\n * Formatters may optionally be added to any logger.\n * This allows for increased flexibility in the logging environment.\n * For example, log messages for log files may be formatted differently than log messages for the console.\n * \n * For more information about formatters, see the \"Custom Formatters\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The formatter may also optionally filter the log message by returning nil,\n * in which case the logger will not log the message.\n**/\n- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;\n\n@optional\n\n/**\n * A single formatter instance can be added to multiple loggers.\n * These methods provides hooks to notify the formatter of when it's added/removed.\n *\n * This is primarily for thread-safety.\n * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers.\n * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter),\n * it could possibly use these hooks to switch to thread-safe versions of the code.\n**/\n- (void)didAddToLogger:(id <DDLogger>)logger;\n- (void)willRemoveFromLogger:(id <DDLogger>)logger;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDRegisteredDynamicLogging\n\n/**\n * Implement these methods to allow a file's log level to be managed from a central location.\n * \n * This is useful if you'd like to be able to change log levels for various parts\n * of your code from within the running application.\n * \n * Imagine pulling up the settings for your application,\n * and being able to configure the logging level on a per file basis.\n * \n * The implementation can be very straight-forward:\n * \n * + (int)ddLogLevel\n * {\n *     return ddLogLevel;\n * }\n *  \n * + (void)ddSetLogLevel:(int)logLevel\n * {\n *     ddLogLevel = logLevel;\n * }\n**/\n\n+ (int)ddLogLevel;\n+ (void)ddSetLogLevel:(int)logLevel;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogMessage class encapsulates information about the log message.\n * If you write custom loggers or formatters, you will be dealing with objects of this class.\n**/\n\nenum {\n    DDLogMessageCopyFile     = 1 << 0,\n    DDLogMessageCopyFunction = 1 << 1\n};\ntypedef int DDLogMessageOptions;\n\n@interface DDLogMessage : NSObject <NSCopying>\n{\n\n// The public variables below can be accessed directly (for speed).\n// For example: logMessage->logLevel\n    \n@public\n    int logLevel;\n    int logFlag;\n    int logContext;\n    NSString *logMsg;\n    NSDate *timestamp;\n    char *file;\n    char *function;\n    int lineNumber;\n    mach_port_t machThreadID;\n    char *queueLabel;\n    NSString *threadName;\n    \n    // For 3rd party extensions to the framework, where flags and contexts aren't enough.\n    id tag;\n    \n    // For 3rd party extensions that manually create DDLogMessage instances.\n    DDLogMessageOptions options;\n}\n\n/**\n * Standard init method for a log message object.\n * Used by the logging primitives. (And the macros use the logging primitives.)\n * \n * If you find need to manually create logMessage objects, there is one thing you should be aware of:\n * \n * If no flags are passed, the method expects the file and function parameters to be string literals.\n * That is, it expects the given strings to exist for the duration of the object's lifetime,\n * and it expects the given strings to be immutable.\n * In other words, it does not copy these strings, it simply points to them.\n * This is due to the fact that __FILE__ and __FUNCTION__ are usually used to specify these parameters,\n * so it makes sense to optimize and skip the unnecessary allocations.\n * However, if you need them to be copied you may use the options parameter to specify this.\n * Options is a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction.\n**/\n- (instancetype)initWithLogMsg:(NSString *)logMsg\n                         level:(int)logLevel\n                          flag:(int)logFlag\n                       context:(int)logContext\n                          file:(const char *)file\n                      function:(const char *)function\n                          line:(int)line\n                           tag:(id)tag\n                       options:(DDLogMessageOptions)optionsMask;\n\n/**\n * Returns the threadID as it appears in NSLog.\n * That is, it is a hexadecimal value which is calculated from the machThreadID.\n**/\n- (NSString *)threadID;\n\n/**\n * Convenience property to get just the file name, as the file variable is generally the full file path.\n * This method does not include the file extension, which is generally unwanted for logging purposes.\n**/\n- (NSString *)fileName;\n\n/**\n * Returns the function variable in NSString form.\n**/\n- (NSString *)methodName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogger protocol specifies that an optional formatter can be added to a logger.\n * Most (but not all) loggers will want to support formatters.\n * \n * However, writting getters and setters in a thread safe manner,\n * while still maintaining maximum speed for the logging process, is a difficult task.\n * \n * To do it right, the implementation of the getter/setter has strict requiremenets:\n * - Must NOT require the logMessage method to acquire a lock.\n * - Must NOT require the logMessage method to access an atomic property (also a lock of sorts).\n * \n * To simplify things, an abstract logger is provided that implements the getter and setter.\n * \n * Logger implementations may simply extend this class,\n * and they can ACCESS THE FORMATTER VARIABLE DIRECTLY from within their logMessage method!\n**/\n\n@interface DDAbstractLogger : NSObject <DDLogger>\n{\n    id <DDLogFormatter> formatter;\n    \n    dispatch_queue_t loggerQueue;\n}\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n// For thread-safety assertions\n- (BOOL)isOnGlobalLoggingQueue;\n- (BOOL)isOnInternalLoggerQueue;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/DDTTYLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#if TARGET_OS_IPHONE\n#import <UIKit/UIColor.h>   // iOS\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n#import <AppKit/NSColor.h>  // OS X with AppKit\n#else\n#import \"CLIColor.h\"        // OS X without AppKit\n#endif\n\n#import \"DDLog.h\"\n\n#define LOG_CONTEXT_ALL INT_MAX\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for Terminal output or Xcode console output,\n * depending on where you are running your code.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log (so it shows up in Console.app)\n * - StdErr (if stderr is a TTY, so log statements show up in Xcode console)\n * \n * To duplicate NSLog() functionality you can simply add this logger and an asl logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use only a file logger and a tty logger.\n**/\n\n@interface DDTTYLogger : DDAbstractLogger <DDLogger>\n{\n    NSCalendar *calendar;\n    NSUInteger calendarUnitFlags;\n    \n    NSString *appName;\n    char *app;\n    size_t appLen;\n    \n    NSString *processID;\n    char *pid;\n    size_t pidLen;\n    \n    BOOL colorsEnabled;\n    NSMutableArray *colorProfilesArray;\n    NSMutableDictionary *colorProfilesDict;\n}\n\n+ (instancetype)sharedInstance;\n\n/* Inherited from the DDLogger protocol:\n * \n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n * \n * More information about formatters can be found here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The actual implementation of these methods is inherited from DDAbstractLogger.\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n \n*/\n\n/**\n * Want to use different colors for different log levels?\n * Enable this property.\n * \n * If you run the application via the Terminal (not Xcode),\n * the logger will map colors to xterm-256color or xterm-color (if available).\n * \n * Xcode does NOT natively support colors in the Xcode debugging console.\n * You'll need to install the XcodeColors plugin to see colors in the Xcode console.\n * https://github.com/robbiehanson/XcodeColors\n * \n * The default value if NO.\n**/\n@property (readwrite, assign) BOOL colorsEnabled;\n\n/**\n * The default color set (foregroundColor, backgroundColor) is:\n * \n * - LOG_FLAG_ERROR = (red, nil)\n * - LOG_FLAG_WARN  = (orange, nil)\n * \n * You can customize the colors however you see fit.\n * Please note that you are passing a flag, NOT a level.\n * \n * GOOD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_FLAG_INFO];  // <- Good :)\n *  BAD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_LEVEL_INFO]; // <- BAD! :(\n * \n * LOG_FLAG_INFO  = 0...00100\n * LOG_LEVEL_INFO = 0...00111 <- Would match LOG_FLAG_INFO and LOG_FLAG_WARN and LOG_FLAG_ERROR\n * \n * If you run the application within Xcode, then the XcodeColors plugin is required.\n * \n * If you run the application from a shell, then DDTTYLogger will automatically map the given color to\n * the closest available color. (xterm-256color or xterm-color which have 256 and 16 supported colors respectively.)\n * \n * This method invokes setForegroundColor:backgroundColor:forFlag:context: and applies it to `LOG_CONTEXT_ALL`.\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask;\n#endif\n\n/**\n * Just like setForegroundColor:backgroundColor:flag, but allows you to specify a particular logging context.\n * \n * A logging context is often used to identify log messages coming from a 3rd party framework,\n * although logging context's can be used for many different functions.\n * \n * Use LOG_CONTEXT_ALL to set the deafult color for all contexts that have no specific color set defined.\n * \n * Logging context's are explained in further detail here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomContext\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#endif\n\n/**\n * Similar to the methods above, but allows you to map DDLogMessage->tag to a particular color profile.\n * For example, you could do something like this:\n * \n * static NSString *const PurpleTag = @\"PurpleTag\";\n * \n * #define DDLogPurple(frmt, ...) LOG_OBJC_TAG_MACRO(NO, 0, 0, 0, PurpleTag, frmt, ##__VA_ARGS__)\n * \n * And then in your applicationDidFinishLaunching, or wherever you configure Lumberjack:\n * \n * #if TARGET_OS_IPHONE\n *   UIColor *purple = [UIColor colorWithRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n * #else\n *   NSColor *purple = [NSColor colorWithCalibratedRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n *\n * Note: For CLI OS X projects that don't link with AppKit use CLIColor objects instead\n * \n * [[DDTTYLogger sharedInstance] setForegroundColor:purple backgroundColor:nil forTag:PurpleTag];\n * [DDLog addLogger:[DDTTYLogger sharedInstance]];\n * \n * This would essentially give you a straight NSLog replacement that prints in purple:\n * \n * DDLogPurple(@\"I'm a purple log message!\");\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forTag:(id <NSCopying>)tag;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forTag:(id <NSCopying>)tag;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forTag:(id <NSCopying>)tag;\n#endif\n\n/**\n * Clearing color profiles.\n**/\n- (void)clearColorsForFlag:(int)mask;\n- (void)clearColorsForFlag:(int)mask context:(int)context;\n- (void)clearColorsForTag:(id <NSCopying>)tag;\n- (void)clearColorsForAllFlags;\n- (void)clearColorsForAllTags;\n- (void)clearAllColors;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/NSJSONSerialization+ObjectWithNString.h",
    "content": "//\n//  NSJSONSerialization+ObjectWithNString.h\n//  Ejecta\n//\n//  Created by matth on 7/19/13.\n//\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (ObjectWithNString)\n+ (id)JSONObjectWithString:(NSString *)string options:(NSJSONReadingOptions)opt error:(NSError **)error;\n+ (NSString*)stringWithNSDictionary:(NSDictionary*)dictionary;\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/NSJSONSerialization+PBJSONHelpers.h",
    "content": "//\n//  NSJSONSerialization+PBJSONHelpers.h\n//  PebbleVendor\n//\n//  Created by matth on 9/17/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (PBJSONHelpers)\n\n/** @name Reflection helpers */\n\n/**\n * Derived from the Box SDK (MIT license) NSJSONSerialization+BoxAdditions...\n * https://github.com/box/box-ios-sdk-v2/tree/master/BoxSDK/Categories\n \n * Ensure that the object at `key` in `dictionary` is a member of the expected class.\n * `NSNull` may be specified as an allowable value. This method may return nil if `key`\n * is not present in `dictionary`.\n *\n * @param key The key to lookup in `dictionary`.\n * @param dictionary A dictionary resulting from deserializing a JSON object.\n * @param cls The expected class of the value at key.\n * @param nullAllowed If true, `NSNull` will be returned. If not, NSNull will be converted to nil. Property getters that pass `YES` for this parameter should have the return type of `id`.\n *\n * @return The object at `key` in `dictionary` if expectations are satisfied; `nil` otherwise.\n */\n+ (id)ensureObjectForKey:(NSString *)key inDictionary:(NSDictionary *)dictionary hasExpectedType:(Class)cls nullAllowed:(BOOL)nullAllowed;\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/NSString+HexData.h",
    "content": "//\n//  NSString+HexData.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 11/19/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSString (HexData)\n\n- (NSData*)hexData;\n\n@end\n\n\n@interface NSData (HexString)\n\n- (NSString*)hexString;\n\n@end"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/UIDevice-Hardware.h",
    "content": "/*\n Erica Sadun, http://ericasadun.com\n iPhone Developer's Cookbook, 6.x Edition\n BSD License, Use at your own risk\n */\n\n#import <UIKit/UIKit.h>\n\ntypedef enum {\n    UIDeviceFamilyiPhone,\n    UIDeviceFamilyiPod,\n    UIDeviceFamilyiPad,\n    UIDeviceFamilyAppleTV,\n    UIDeviceFamilyUnknown,\n    \n} UIDeviceFamily;\n\n@interface UIDevice (Hardware)\n- (NSString *) platform;\n- (NSString *) hwmodel;\n- (NSString *) platformString;\n\n- (NSUInteger) cpuFrequency;\n- (NSUInteger) busFrequency;\n- (NSUInteger) cpuCount;\n- (NSUInteger) totalMemory;\n- (NSUInteger) userMemory;\n\n- (NSNumber *) totalDiskSpace;\n- (NSNumber *) freeDiskSpace;\n\n- (NSString *) macaddress;\n\n- (BOOL) hasRetinaDisplay;\n- (BOOL) hasBluetoothMAP;\n- (UIDeviceFamily) deviceFamily;\n@end"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/CHMultiDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMultiDictionary.h\n \n Copyright (c) 2008-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n#import \"CHMutableDictionary.h\"\n\n/**\n @file CHMultiDictionary.h\n \n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> in which multiple values may be associated with a given key.\n */\n\n/**\n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> implementation, in which multiple values may be associated with a given key.\n \n A map is the same as a \"dictionary\", \"associative array\", etc. and consists of a unique set of keys and a collection of values. In a standard map, each key is associated with one value; in a multimap, more than one value may be associated with a given key. A multimap is appropriate for any situation in which one item may correspond to (map to) multiple values, such as a term in an book index and occurrences of that term, courses for which a student is registered, etc.\n \n The values for a key may or may not be ordered. This implementation does not maintain an ordering for objects associated with a key, nor does it allow for multiple occurrences of an object associated with the same key. Internally, this class uses an NSMutableDictionary, and the associated values for each key are stored in distinct NSMutableSet instances. (Just as with NSDictionary, each key added to a CHMultiDictionary is copied using \\link NSCopying#copyWithZone: -copyWithZone:\\endlink and all keys must conform to the NSCopying protocol.) Objects are retained on insertion and released on removal or deallocation.\n \n Since NSDictionary and NSSet conform to the NSCoding protocol, any internal data can be serialized. However, NSSet cannot automatically be written to or read from a property list, since it has no specified order. Thus, instances of CHMultiDictionary must be encoded as an NSData object before saving to disk.\n \n Currently, this implementation does not support key-value coding, observing, or binding like NSDictionary does. Consequently, the distinction between \"object\" and \"value\" is blurrier, although hopefully consistent with the Cocoa APIs in general....\n \n Unlike NSDictionary and other Cocoa collections, CHMultiDictionary has not been designed with mutable and immutable variants. A multimap is not that much more useful if it is immutable, so any copies made of this class are mutable by definition.\n */\n@interface CHMultiDictionary : CHMutableDictionary {\n\tNSUInteger objectCount; // Number of objects currently in the dictionary.\n}\n\n#pragma mark Querying Contents\n\n/**\n Returns the number of objects in the receiver, associated with any key.\n \n @return The number of objects in the receiver. This is the sum total of objects associated with each key in the dictonary.\n \n @see allObjects\n */\n- (NSUInteger) countForAllKeys;\n\n/**\n Returns the number of objects associated with a given key.\n \n @param aKey The key for which to return the object count.\n @return The number of objects associated with a given key in the dictionary.\n \n @see objectsForKey:\n */\n- (NSUInteger) countForKey:(id)aKey;\n\n/**\n Returns an array of objects associated with a given key.\n \n @param aKey The key for which to return the corresponding objects.\n @return An NSSet of objects associated with a given key, or nil if the key is not in the receiver.\n \n @see countForKey:\n @see removeObjectsForKey:\n */\n- (NSSet*) objectsForKey:(id)aKey;\n\n#pragma mark Modifying Contents\n\n/**\n Adds a given object to an entry for a given key in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param anObject An object to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#addObject: -[NSMutableSet addObject:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObject:(id)anObject forKey:(id)aKey;\n\n/**\n Adds the given object(s) to a key entry in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param objectSet A set of objects to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#unionSet: -[NSMutableSet unionSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n/**\n Remove @b all occurrences of @a anObject associated with a given key.\n \n @param aKey The key for which to remove an entry.\n @param anObject An object (possibly) associated with @a aKey in the receiver. Objects are considered to be equal if -compare: returns NSOrderedSame.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n If @a aKey does not exist in the receiver, or if @a anObject is not associated with @a aKey, the contents of the receiver are not modified.\n \n @see containsObject\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) removeObject:(id)anObject forKey:(id)aKey;\n\n/**\n Remove a given key and its associated value(s) from the receiver.\n \n @param aKey The key for which to remove an entry.\n \n If @a aKey does not exist in the receiver, there is no effect on the receiver.\n \n @see objectsForKey:\n @see removeObject:forKey:\n */\n- (void) removeObjectsForKey:(id)aKey;\n\n/**\n Sets the object(s) associated with a key entry in the receiver.\n \n @param aKey The key with which to associate the objects in @a objectSet.\n @param objectSet A set of objects to associate with @a key. If @a objectSet is empty, the contents of the receiver are not modified. If an entry for @a key already exists in the receiver, @a objectSet is added using \\link NSMutableSet#setSet: -[NSMutableSet setSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) setObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/CHMutableDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMutableDictionary.h\n \n Copyright (c) 2009-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n__attribute__((visibility(\"hidden\"))) void createCollectableCFMutableDictionary(CFMutableDictionaryRef* dictionary, NSUInteger initialCapacity);\n\n/**\n @file CHMutableDictionary.h\n \n A mutable dictionary class.\n */\n\n/**\n A mutable dictionary class.\n \n A CFMutableDictionaryRef is used internally to store the key-value pairs. Subclasses may choose to add other instance variables to enable a specific ordering of keys, override methods to modify behavior, and add methods to extend existing behaviors. However, all subclasses should behave like a standard Cocoa dictionary as much as possible, and document clearly when they do not.\n \n @note Any method inherited from NSDictionary or NSMutableDictionary is supported by this class and its children. Please see the documentation for those classes for details.\n \n @todo Implement @c -copy and @c -mutableCopy differently (so users can actually obtain an immutable copy) and make mutation methods aware of immutability?\n */\n@interface CHMutableDictionary : NSMutableDictionary {\n  CFMutableDictionaryRef dictionary; // A Core Foundation dictionary.\n}\n\n- (id) initWithCapacity:(NSUInteger)numItems;\n\n- (NSUInteger) count;\n- (NSEnumerator*) keyEnumerator;\n- (id) objectForKey:(id)aKey;\n- (void) removeAllObjects;\n- (void) removeObjectForKey:(id)aKey;\n- (void) setObject:(id)anObject forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/DDASLLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import <asl.h>\n\n#import \"DDLog.h\"\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for the Apple System Log facility.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log\n * - StdErr (if stderr is a TTY) so log statements show up in Xcode console\n * \n * To duplicate NSLog() functionality you can simply add this logger and a tty logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use a file logger and a tty logger.\n**/\n\n@interface DDASLLogger : DDAbstractLogger <DDLogger>\n{\n    aslclient client;\n}\n\n+ (instancetype)sharedInstance;\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/DDFileLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"DDLog.h\"\n\n@class DDLogFileInfo;\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger to write log statements to a file.\n**/\n\n\n// Default configuration and safety/sanity values.\n// \n// maximumFileSize         -> DEFAULT_LOG_MAX_FILE_SIZE\n// rollingFrequency        -> DEFAULT_LOG_ROLLING_FREQUENCY\n// maximumNumberOfLogFiles -> DEFAULT_LOG_MAX_NUM_LOG_FILES\n// \n// You should carefully consider the proper configuration values for your application.\n\n#define DEFAULT_LOG_MAX_FILE_SIZE     (1024 * 1024)   //  1 MB\n#define DEFAULT_LOG_ROLLING_FREQUENCY (60 * 60 * 24)  // 24 Hours\n#define DEFAULT_LOG_MAX_NUM_LOG_FILES (5)             //  5 Files\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// The LogFileManager protocol is designed to allow you to control all aspects of your log files.\n// \n// The primary purpose of this is to allow you to do something with the log files after they have been rolled.\n// Perhaps you want to compress them to save disk space.\n// Perhaps you want to upload them to an FTP server.\n// Perhaps you want to run some analytics on the file.\n// \n// A default LogFileManager is, of course, provided.\n// The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property.\n// \n// This protocol provides various methods to fetch the list of log files.\n// \n// There are two variants: sorted and unsorted.\n// If sorting is not necessary, the unsorted variant is obviously faster.\n// The sorted variant will return an array sorted by when the log files were created,\n// with the most recently created log file at index 0, and the oldest log file at the end of the array.\n// \n// You can fetch only the log file paths (full path including name), log file names (name only),\n// or an array of DDLogFileInfo objects.\n// The DDLogFileInfo class is documented below, and provides a handy wrapper that\n// gives you easy access to various file attributes such as the creation date or the file size.\n\n@protocol DDLogFileManager <NSObject>\n@required\n\n// Public properties\n\n/**\n * The maximum number of archived log files to keep on disk.\n * For example, if this property is set to 3,\n * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk.\n * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted.\n * \n * You may optionally disable deleting old/rolled/archived log files by setting this property to zero.\n**/\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n// Public methods\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n// Private methods (only to be used by DDFileLogger)\n\n- (NSString *)createNewLogFile;\n\n@optional\n\n// Notifications from DDFileLogger\n\n- (void)didArchiveLogFile:(NSString *)logFilePath;\n- (void)didRollAndArchiveLogFile:(NSString *)logFilePath;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Default log file manager.\n * \n * All log files are placed inside the logsDirectory.\n * If a specific logsDirectory isn't specified, the default directory is used.\n * On Mac, this is in ~/Library/Logs/<Application Name>.\n * On iPhone, this is in ~/Library/Caches/Logs.\n * \n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n * \n * Archived log files are automatically deleted according to the maximumNumberOfLogFiles property.\n**/\n@interface DDLogFileManagerDefault : NSObject <DDLogFileManager>\n{\n    NSUInteger maximumNumberOfLogFiles;\n    NSString *_logsDirectory;\n}\n\n- (id)init;\n- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory;\n\n/*\n * Methods to override.\n *\n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n *\n * If you wish to change default filename, you can override following two methods.\n * - newLogFileName method would be called on new logfile creation.\n * - isLogFile: method would be called to filter logfiles from all other files in logsDirectory.\n *   You have to parse given filename and return YES if it is logFile.\n *\n * **NOTE**\n * newLogFileName returns filename. If appropriate file already exists, number would be added\n * to filename before extension. You have to handle this case in isLogFile: method.\n *\n * Example:\n * - newLogFileName returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 2.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03 1.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 3.log\" would be created.\n**/\n- (NSString *)newLogFileName;\n- (BOOL)isLogFile:(NSString *)fileName;\n\n/* Inherited from DDLogFileManager protocol:\n\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n*/\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Most users will want file log messages to be prepended with the date and time.\n * Rather than forcing the majority of users to write their own formatter,\n * we will supply a logical default formatter.\n * Users can easily replace this formatter with their own by invoking the setLogFormatter method.\n * It can also be removed by calling setLogFormatter, and passing a nil parameter.\n * \n * In addition to the convenience of having a logical default formatter,\n * it will also provide a template that makes it easy for developers to copy and change.\n**/\n@interface DDLogFileFormatterDefault : NSObject <DDLogFormatter>\n{\n    NSDateFormatter *dateFormatter;\n}\n\n- (id)init;\n- (instancetype)initWithDateFormatter:(NSDateFormatter *)dateFormatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDFileLogger : DDAbstractLogger <DDLogger>\n{\n    __strong id <DDLogFileManager> logFileManager;\n    \n    DDLogFileInfo *currentLogFileInfo;\n    NSFileHandle *currentLogFileHandle;\n    \n    dispatch_source_t currentLogFileVnode;\n    dispatch_source_t rollingTimer;\n    \n    unsigned long long maximumFileSize;\n    NSTimeInterval rollingFrequency;\n}\n\n- (id)init;\n- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)logFileManager;\n\n/**\n * Log File Rolling:\n * \n * maximumFileSize:\n *   The approximate maximum size to allow log files to grow.\n *   If a log file is larger than this value after a log statement is appended,\n *   then the log file is rolled.\n * \n * rollingFrequency\n *   How often to roll the log file.\n *   The frequency is given as an NSTimeInterval, which is a double that specifies the interval in seconds.\n *   Once the log file gets to be this old, it is rolled.\n * \n * Both the maximumFileSize and the rollingFrequency are used to manage rolling.\n * Whichever occurs first will cause the log file to be rolled.\n * \n * For example:\n * The rollingFrequency is 24 hours,\n * but the log file surpasses the maximumFileSize after only 20 hours.\n * The log file will be rolled at that 20 hour mark.\n * A new log file will be created, and the 24 hour timer will be restarted.\n * \n * You may optionally disable rolling due to filesize by setting maximumFileSize to zero.\n * If you do so, rolling is based solely on rollingFrequency.\n * \n * You may optionally disable rolling due to time by setting rollingFrequency to zero (or any non-positive number).\n * If you do so, rolling is based solely on maximumFileSize.\n * \n * If you disable both maximumFileSize and rollingFrequency, then the log file won't ever be rolled.\n * This is strongly discouraged.\n**/\n@property (readwrite, assign) unsigned long long maximumFileSize;\n@property (readwrite, assign) NSTimeInterval rollingFrequency;\n\n/**\n * The DDLogFileManager instance can be used to retrieve the list of log files,\n * and configure the maximum number of archived log files to keep.\n * \n * @see DDLogFileManager.maximumNumberOfLogFiles\n**/\n@property (strong, nonatomic, readonly) id <DDLogFileManager> logFileManager;\n\n\n// You can optionally force the current log file to be rolled with this method.\n// CompletionBlock will be called on main queue.\n\n- (void)rollLogFileWithCompletionBlock:(void (^)())completionBlock;\n\n// Method is deprecated. Use rollLogFileWithCompletionBlock: method instead.\n\n- (void)rollLogFile __attribute((deprecated));\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * DDLogFileInfo is a simple class that provides access to various file attributes.\n * It provides good performance as it only fetches the information if requested,\n * and it caches the information to prevent duplicate fetches.\n * \n * It was designed to provide quick snapshots of the current state of log files,\n * and to help sort log files in an array.\n * \n * This class does not monitor the files, or update it's cached attribute values if the file changes on disk.\n * This is not what the class was designed for.\n * \n * If you absolutely must get updated values,\n * you can invoke the reset method which will clear the cache.\n**/\n@interface DDLogFileInfo : NSObject\n{\n    __strong NSString *filePath;\n    __strong NSString *fileName;\n    \n    __strong NSDictionary *fileAttributes;\n    \n    __strong NSDate *creationDate;\n    __strong NSDate *modificationDate;\n    \n    unsigned long long fileSize;\n}\n\n@property (strong, nonatomic, readonly) NSString *filePath;\n@property (strong, nonatomic, readonly) NSString *fileName;\n\n@property (strong, nonatomic, readonly) NSDictionary *fileAttributes;\n\n@property (strong, nonatomic, readonly) NSDate *creationDate;\n@property (strong, nonatomic, readonly) NSDate *modificationDate;\n\n@property (nonatomic, readonly) unsigned long long fileSize;\n\n@property (nonatomic, readonly) NSTimeInterval age;\n\n@property (nonatomic, readwrite) BOOL isArchived;\n\n+ (instancetype)logFileWithPath:(NSString *)filePath;\n\n- (instancetype)initWithFilePath:(NSString *)filePath;\n\n- (void)reset;\n- (void)renameFile:(NSString *)newFileName;\n\n#if TARGET_IPHONE_SIMULATOR\n\n// So here's the situation.\n// Extended attributes are perfect for what we're trying to do here (marking files as archived).\n// This is exactly what extended attributes were designed for.\n// \n// But Apple screws us over on the simulator.\n// Everytime you build-and-go, they copy the application into a new folder on the hard drive,\n// and as part of the process they strip extended attributes from our log files.\n// Normally, a copy of a file preserves extended attributes.\n// So obviously Apple has gone to great lengths to piss us off.\n// \n// Thus we use a slightly different tactic for marking log files as archived in the simulator.\n// That way it \"just works\" and there's no confusion when testing.\n// \n// The difference in method names is indicative of the difference in functionality.\n// On the simulator we add an attribute by appending a filename extension.\n// \n// For example:\n// log-ABC123.txt -> log-ABC123.archived.txt\n\n- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName;\n\n- (void)addExtensionAttributeWithName:(NSString *)attrName;\n- (void)removeExtensionAttributeWithName:(NSString *)attrName;\n\n#else\n\n// Normal use of extended attributes used everywhere else,\n// such as on Macs and on iPhone devices.\n\n- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName;\n\n- (void)addExtendedAttributeWithName:(NSString *)attrName;\n- (void)removeExtendedAttributeWithName:(NSString *)attrName;\n\n#endif\n\n- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another;\n- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/DDLog.h",
    "content": "#import <Foundation/Foundation.h>\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * Otherwise, here is a quick refresher.\n * There are three steps to using the macros:\n * \n * Step 1:\n * Import the header in your implementation file:\n * \n * #import \"DDLog.h\"\n * \n * Step 2:\n * Define your logging level in your implementation file:\n * \n * // Log levels: off, error, warn, info, verbose\n * static const int ddLogLevel = LOG_LEVEL_VERBOSE;\n * \n * Step 2 [3rd party frameworks]:\n *\n * Define your LOG_LEVEL_DEF to a different variable/function than ddLogLevel:\n *\n * // #undef LOG_LEVEL_DEF // Undefine first only if needed\n * #define LOG_LEVEL_DEF myLibLogLevel\n *\n * Define your logging level in your implementation file:\n *\n * // Log levels: off, error, warn, info, verbose\n * static const int myLibLogLevel = LOG_LEVEL_VERBOSE;\n *\n * Step 3:\n * Replace your NSLog statements with DDLog statements according to the severity of the message.\n * \n * NSLog(@\"Fatal error, no dohickey found!\"); -> DDLogError(@\"Fatal error, no dohickey found!\");\n * \n * DDLog works exactly the same as NSLog.\n * This means you can pass it multiple variables just like NSLog.\n**/\n\n#ifndef LOG_LEVEL_DEF\n    #define LOG_LEVEL_DEF ddLogLevel\n#endif\n\n@class DDLogMessage;\n\n@protocol DDLogger;\n@protocol DDLogFormatter;\n\n/**\n * This is the single macro that all other macros below compile into.\n * This big multiline macro makes all the other macros easier to read.\n**/\n\n#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \\\n  [DDLog log:isAsynchronous                                             \\\n       level:lvl                                                        \\\n        flag:flg                                                        \\\n     context:ctx                                                        \\\n        file:__FILE__                                                   \\\n    function:fnct                                                       \\\n        line:__LINE__                                                   \\\n         tag:atag                                                       \\\n      format:(frmt), ##__VA_ARGS__]\n\n/**\n * Define the Objective-C and C versions of the macro.\n * These automatically inject the proper function name for either an objective-c method or c function.\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_OBJC_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MACRO(async, lvl, flg, ctx, nil, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MACRO(async, lvl, flg, ctx, nil, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define version of the macro that only execute if the logLevel is above the threshold.\n * The compiled versions essentially look like this:\n * \n * if (logFlagForThisLogMsg & ddLogLevel) { execute log message }\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels.\n * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques.\n * \n * Note that when compiler optimizations are enabled (as they are for your release builds),\n * the log messages above your logging threshold will automatically be compiled out.\n * \n * (If the compiler sees ddLogLevel declared as a constant, the compiler simply checks to see if the 'if' statement\n *  would execute, and if not it strips it from the binary.)\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define versions of the macros that also accept tags.\n * \n * The DDLogMessage object includes a 'tag' ivar that may be used for a variety of purposes.\n * It may be used to pass custom information to loggers or formatters.\n * Or it may be used by 3rd party extensions to the framework.\n * \n * Thes macros just make it a little easier to extend logging functionality.\n**/\n\n#define LOG_OBJC_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n                 LOG_MACRO(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n              LOG_MACRO(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n             LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n          LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n/**\n * Define the standard options.\n * \n * We default to only 4 levels because it makes it easier for beginners\n * to make the transition to a logging framework.\n * \n * More advanced users may choose to completely customize the levels (and level names) to suite their needs.\n * For more information on this see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n * \n * Advanced users may also notice that we're using a bitmask.\n * This is to allow for custom fine grained logging:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/FineGrainedLogging\n * \n * -- Flags --\n * \n * Typically you will use the LOG_LEVELS (see below), but the flags may be used directly in certain situations.\n * For example, say you have a lot of warning log messages, and you wanted to disable them.\n * However, you still needed to see your error and info log messages.\n * You could accomplish that with the following:\n * \n * static const int ddLogLevel = LOG_FLAG_ERROR | LOG_FLAG_INFO;\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * Flags may also be consulted when writing custom log formatters,\n * as the DDLogMessage class captures the individual flag that caused the log message to fire.\n * \n * -- Levels --\n * \n * Log levels are simply the proper bitmask of the flags.\n * \n * -- Booleans --\n * \n * The booleans may be used when your logging code involves more than one line.\n * For example:\n * \n * if (LOG_VERBOSE) {\n *     for (id sprocket in sprockets)\n *         DDLogVerbose(@\"sprocket: %@\", [sprocket description])\n * }\n * \n * -- Async --\n * \n * Defines the default asynchronous options.\n * The default philosophy for asynchronous logging is very simple:\n * \n * Log messages with errors should be executed synchronously.\n *     After all, an error just occurred. The application could be unstable.\n * \n * All other log messages, such as debug output, are executed asynchronously.\n *     After all, if it wasn't an error, then it was just informational output,\n *     or something the application was easily able to recover from.\n * \n * -- Changes --\n * \n * You are strongly discouraged from modifying this file.\n * If you do, you make it more difficult on yourself to merge future bug fixes and improvements from the project.\n * Instead, create your own MyLogging.h or ApplicationNameLogging.h or CompanyLogging.h\n * \n * For an example of customizing your logging experience, see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n**/\n\n#define LOG_FLAG_ERROR    (1 << 0)  // 0...00001\n#define LOG_FLAG_WARN     (1 << 1)  // 0...00010\n#define LOG_FLAG_INFO     (1 << 2)  // 0...00100\n#define LOG_FLAG_DEBUG    (1 << 3)  // 0...01000\n#define LOG_FLAG_VERBOSE  (1 << 4)  // 0...10000\n\n#define LOG_LEVEL_OFF     0\n#define LOG_LEVEL_ERROR   (LOG_FLAG_ERROR)                                                                          // 0...00001\n#define LOG_LEVEL_WARN    (LOG_FLAG_ERROR | LOG_FLAG_WARN)                                                          // 0...00011\n#define LOG_LEVEL_INFO    (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO)                                          // 0...00111\n#define LOG_LEVEL_DEBUG   (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG)                         // 0...01111\n#define LOG_LEVEL_VERBOSE (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG | LOG_FLAG_VERBOSE)      // 0...11111\n\n#define LOG_ERROR    (LOG_LEVEL_DEF & LOG_FLAG_ERROR)\n#define LOG_WARN     (LOG_LEVEL_DEF & LOG_FLAG_WARN)\n#define LOG_INFO     (LOG_LEVEL_DEF & LOG_FLAG_INFO)\n#define LOG_DEBUG    (LOG_LEVEL_DEF & LOG_FLAG_DEBUG)\n#define LOG_VERBOSE  (LOG_LEVEL_DEF & LOG_FLAG_VERBOSE)\n\n#define LOG_ASYNC_ENABLED YES\n\n#define LOG_ASYNC_ERROR    ( NO && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_WARN     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_INFO     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_DEBUG    (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_VERBOSE  (YES && LOG_ASYNC_ENABLED)\n\n#define DDLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogDebug(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define DDLogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogCDebug(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n/**\n * The THIS_FILE macro gives you an NSString of the file name.\n * For simplicity and clarity, the file name does not include the full path or file extension.\n * \n * For example: DDLogWarn(@\"%@: Unable to find thingy\", THIS_FILE) -> @\"MyViewController: Unable to find thingy\"\n**/\n\nNSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy);\n\n#define THIS_FILE (DDExtractFileNameWithoutExtension(__FILE__, NO))\n\n/**\n * The THIS_METHOD macro gives you the name of the current objective-c method.\n * \n * For example: DDLogWarn(@\"%@ - Requires non-nil strings\", THIS_METHOD) -> @\"setMake:model: requires non-nil strings\"\n * \n * Note: This does NOT work in straight C functions (non objective-c).\n * Instead you should use the predefined __FUNCTION__ macro.\n**/\n\n#define THIS_METHOD NSStringFromSelector(_cmd)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDLog : NSObject\n\n/**\n * Provides access to the underlying logging queue.\n * This may be helpful to Logger classes for things like thread synchronization.\n**/\n\n+ (dispatch_queue_t)loggingQueue;\n\n/**\n * Logging Primitive.\n * \n * This method is used by the macros above.\n * It is suggested you stick with the macros as they're easier to use.\n**/\n\n+ (void)log:(BOOL)synchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format, ... __attribute__ ((format (__NSString__, 9, 10)));\n\n/**\n * Logging Primitive.\n * \n * This method can be used if you have a prepared va_list.\n**/\n\n+ (void)log:(BOOL)asynchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format\n       args:(va_list)argList;\n\n\n/**\n * Since logging can be asynchronous, there may be times when you want to flush the logs.\n * The framework invokes this automatically when the application quits.\n**/\n\n+ (void)flushLog;\n\n/** \n * Loggers\n * \n * If you want your log statements to go somewhere,\n * you should create and add a logger.\n**/\n\n+ (void)addLogger:(id <DDLogger>)logger;    // adds the logger using maximum log level (LOG_LEVEL_VERBOSE)\n\n/**\n * Please use as logLevels the LOG_LEVEL_* macros\n *\n**/\n+ (void)addLogger:(id <DDLogger>)logger withLogLevel:(int)logLevel;\n\n+ (void)removeLogger:(id <DDLogger>)logger;\n+ (void)removeAllLoggers;\n\n/**\n * Registered Dynamic Logging\n * \n * These methods allow you to obtain a list of classes that are using registered dynamic logging,\n * and also provides methods to get and set their log level during run time.\n**/\n\n+ (NSArray *)registeredClasses;\n+ (NSArray *)registeredClassNames;\n\n+ (int)logLevelForClass:(Class)aClass;\n+ (int)logLevelForClassWithName:(NSString *)aClassName;\n\n+ (void)setLogLevel:(int)logLevel forClass:(Class)aClass;\n+ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogger <NSObject>\n@required\n\n- (void)logMessage:(DDLogMessage *)logMessage;\n\n/**\n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n**/\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@optional\n\n/**\n * Since logging is asynchronous, adding and removing loggers is also asynchronous.\n * In other words, the loggers are added and removed at appropriate times with regards to log messages.\n * \n * - Loggers will not receive log messages that were executed prior to when they were added.\n * - Loggers will not receive log messages that were executed after they were removed.\n * \n * These methods are executed in the logging thread/queue.\n * This is the same thread/queue that will execute every logMessage: invocation.\n * Loggers may use these methods for thread synchronization or other setup/teardown tasks.\n**/\n- (void)didAddLogger;\n- (void)willRemoveLogger;\n\n/**\n * Some loggers may buffer IO for optimization purposes.\n * For example, a database logger may only save occasionaly as the disk IO is slow.\n * In such loggers, this method should be implemented to flush any pending IO.\n * \n * This allows invocations of DDLog's flushLog method to be propogated to loggers that need it.\n * \n * Note that DDLog's flushLog method is invoked automatically when the application quits,\n * and it may be also invoked manually by the developer prior to application crashes, or other such reasons.\n**/\n- (void)flush;\n\n/**\n * Each logger is executed concurrently with respect to the other loggers.\n * Thus, a dedicated dispatch queue is used for each logger.\n * Logger implementations may optionally choose to provide their own dispatch queue.\n**/\n- (dispatch_queue_t)loggerQueue;\n\n/**\n * If the logger implementation does not choose to provide its own queue,\n * one will automatically be created for it.\n * The created queue will receive its name from this method.\n * This may be helpful for debugging or profiling reasons.\n**/\n- (NSString *)loggerName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogFormatter <NSObject>\n@required\n\n/**\n * Formatters may optionally be added to any logger.\n * This allows for increased flexibility in the logging environment.\n * For example, log messages for log files may be formatted differently than log messages for the console.\n * \n * For more information about formatters, see the \"Custom Formatters\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The formatter may also optionally filter the log message by returning nil,\n * in which case the logger will not log the message.\n**/\n- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;\n\n@optional\n\n/**\n * A single formatter instance can be added to multiple loggers.\n * These methods provides hooks to notify the formatter of when it's added/removed.\n *\n * This is primarily for thread-safety.\n * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers.\n * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter),\n * it could possibly use these hooks to switch to thread-safe versions of the code.\n**/\n- (void)didAddToLogger:(id <DDLogger>)logger;\n- (void)willRemoveFromLogger:(id <DDLogger>)logger;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDRegisteredDynamicLogging\n\n/**\n * Implement these methods to allow a file's log level to be managed from a central location.\n * \n * This is useful if you'd like to be able to change log levels for various parts\n * of your code from within the running application.\n * \n * Imagine pulling up the settings for your application,\n * and being able to configure the logging level on a per file basis.\n * \n * The implementation can be very straight-forward:\n * \n * + (int)ddLogLevel\n * {\n *     return ddLogLevel;\n * }\n *  \n * + (void)ddSetLogLevel:(int)logLevel\n * {\n *     ddLogLevel = logLevel;\n * }\n**/\n\n+ (int)ddLogLevel;\n+ (void)ddSetLogLevel:(int)logLevel;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogMessage class encapsulates information about the log message.\n * If you write custom loggers or formatters, you will be dealing with objects of this class.\n**/\n\nenum {\n    DDLogMessageCopyFile     = 1 << 0,\n    DDLogMessageCopyFunction = 1 << 1\n};\ntypedef int DDLogMessageOptions;\n\n@interface DDLogMessage : NSObject <NSCopying>\n{\n\n// The public variables below can be accessed directly (for speed).\n// For example: logMessage->logLevel\n    \n@public\n    int logLevel;\n    int logFlag;\n    int logContext;\n    NSString *logMsg;\n    NSDate *timestamp;\n    char *file;\n    char *function;\n    int lineNumber;\n    mach_port_t machThreadID;\n    char *queueLabel;\n    NSString *threadName;\n    \n    // For 3rd party extensions to the framework, where flags and contexts aren't enough.\n    id tag;\n    \n    // For 3rd party extensions that manually create DDLogMessage instances.\n    DDLogMessageOptions options;\n}\n\n/**\n * Standard init method for a log message object.\n * Used by the logging primitives. (And the macros use the logging primitives.)\n * \n * If you find need to manually create logMessage objects, there is one thing you should be aware of:\n * \n * If no flags are passed, the method expects the file and function parameters to be string literals.\n * That is, it expects the given strings to exist for the duration of the object's lifetime,\n * and it expects the given strings to be immutable.\n * In other words, it does not copy these strings, it simply points to them.\n * This is due to the fact that __FILE__ and __FUNCTION__ are usually used to specify these parameters,\n * so it makes sense to optimize and skip the unnecessary allocations.\n * However, if you need them to be copied you may use the options parameter to specify this.\n * Options is a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction.\n**/\n- (instancetype)initWithLogMsg:(NSString *)logMsg\n                         level:(int)logLevel\n                          flag:(int)logFlag\n                       context:(int)logContext\n                          file:(const char *)file\n                      function:(const char *)function\n                          line:(int)line\n                           tag:(id)tag\n                       options:(DDLogMessageOptions)optionsMask;\n\n/**\n * Returns the threadID as it appears in NSLog.\n * That is, it is a hexadecimal value which is calculated from the machThreadID.\n**/\n- (NSString *)threadID;\n\n/**\n * Convenience property to get just the file name, as the file variable is generally the full file path.\n * This method does not include the file extension, which is generally unwanted for logging purposes.\n**/\n- (NSString *)fileName;\n\n/**\n * Returns the function variable in NSString form.\n**/\n- (NSString *)methodName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogger protocol specifies that an optional formatter can be added to a logger.\n * Most (but not all) loggers will want to support formatters.\n * \n * However, writting getters and setters in a thread safe manner,\n * while still maintaining maximum speed for the logging process, is a difficult task.\n * \n * To do it right, the implementation of the getter/setter has strict requiremenets:\n * - Must NOT require the logMessage method to acquire a lock.\n * - Must NOT require the logMessage method to access an atomic property (also a lock of sorts).\n * \n * To simplify things, an abstract logger is provided that implements the getter and setter.\n * \n * Logger implementations may simply extend this class,\n * and they can ACCESS THE FORMATTER VARIABLE DIRECTLY from within their logMessage method!\n**/\n\n@interface DDAbstractLogger : NSObject <DDLogger>\n{\n    id <DDLogFormatter> formatter;\n    \n    dispatch_queue_t loggerQueue;\n}\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n// For thread-safety assertions\n- (BOOL)isOnGlobalLoggingQueue;\n- (BOOL)isOnInternalLoggerQueue;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/DDTTYLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#if TARGET_OS_IPHONE\n#import <UIKit/UIColor.h>   // iOS\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n#import <AppKit/NSColor.h>  // OS X with AppKit\n#else\n#import \"CLIColor.h\"        // OS X without AppKit\n#endif\n\n#import \"DDLog.h\"\n\n#define LOG_CONTEXT_ALL INT_MAX\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for Terminal output or Xcode console output,\n * depending on where you are running your code.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log (so it shows up in Console.app)\n * - StdErr (if stderr is a TTY, so log statements show up in Xcode console)\n * \n * To duplicate NSLog() functionality you can simply add this logger and an asl logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use only a file logger and a tty logger.\n**/\n\n@interface DDTTYLogger : DDAbstractLogger <DDLogger>\n{\n    NSCalendar *calendar;\n    NSUInteger calendarUnitFlags;\n    \n    NSString *appName;\n    char *app;\n    size_t appLen;\n    \n    NSString *processID;\n    char *pid;\n    size_t pidLen;\n    \n    BOOL colorsEnabled;\n    NSMutableArray *colorProfilesArray;\n    NSMutableDictionary *colorProfilesDict;\n}\n\n+ (instancetype)sharedInstance;\n\n/* Inherited from the DDLogger protocol:\n * \n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n * \n * More information about formatters can be found here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The actual implementation of these methods is inherited from DDAbstractLogger.\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n \n*/\n\n/**\n * Want to use different colors for different log levels?\n * Enable this property.\n * \n * If you run the application via the Terminal (not Xcode),\n * the logger will map colors to xterm-256color or xterm-color (if available).\n * \n * Xcode does NOT natively support colors in the Xcode debugging console.\n * You'll need to install the XcodeColors plugin to see colors in the Xcode console.\n * https://github.com/robbiehanson/XcodeColors\n * \n * The default value if NO.\n**/\n@property (readwrite, assign) BOOL colorsEnabled;\n\n/**\n * The default color set (foregroundColor, backgroundColor) is:\n * \n * - LOG_FLAG_ERROR = (red, nil)\n * - LOG_FLAG_WARN  = (orange, nil)\n * \n * You can customize the colors however you see fit.\n * Please note that you are passing a flag, NOT a level.\n * \n * GOOD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_FLAG_INFO];  // <- Good :)\n *  BAD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_LEVEL_INFO]; // <- BAD! :(\n * \n * LOG_FLAG_INFO  = 0...00100\n * LOG_LEVEL_INFO = 0...00111 <- Would match LOG_FLAG_INFO and LOG_FLAG_WARN and LOG_FLAG_ERROR\n * \n * If you run the application within Xcode, then the XcodeColors plugin is required.\n * \n * If you run the application from a shell, then DDTTYLogger will automatically map the given color to\n * the closest available color. (xterm-256color or xterm-color which have 256 and 16 supported colors respectively.)\n * \n * This method invokes setForegroundColor:backgroundColor:forFlag:context: and applies it to `LOG_CONTEXT_ALL`.\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask;\n#endif\n\n/**\n * Just like setForegroundColor:backgroundColor:flag, but allows you to specify a particular logging context.\n * \n * A logging context is often used to identify log messages coming from a 3rd party framework,\n * although logging context's can be used for many different functions.\n * \n * Use LOG_CONTEXT_ALL to set the deafult color for all contexts that have no specific color set defined.\n * \n * Logging context's are explained in further detail here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomContext\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#endif\n\n/**\n * Similar to the methods above, but allows you to map DDLogMessage->tag to a particular color profile.\n * For example, you could do something like this:\n * \n * static NSString *const PurpleTag = @\"PurpleTag\";\n * \n * #define DDLogPurple(frmt, ...) LOG_OBJC_TAG_MACRO(NO, 0, 0, 0, PurpleTag, frmt, ##__VA_ARGS__)\n * \n * And then in your applicationDidFinishLaunching, or wherever you configure Lumberjack:\n * \n * #if TARGET_OS_IPHONE\n *   UIColor *purple = [UIColor colorWithRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n * #else\n *   NSColor *purple = [NSColor colorWithCalibratedRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n *\n * Note: For CLI OS X projects that don't link with AppKit use CLIColor objects instead\n * \n * [[DDTTYLogger sharedInstance] setForegroundColor:purple backgroundColor:nil forTag:PurpleTag];\n * [DDLog addLogger:[DDTTYLogger sharedInstance]];\n * \n * This would essentially give you a straight NSLog replacement that prints in purple:\n * \n * DDLogPurple(@\"I'm a purple log message!\");\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forTag:(id <NSCopying>)tag;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forTag:(id <NSCopying>)tag;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forTag:(id <NSCopying>)tag;\n#endif\n\n/**\n * Clearing color profiles.\n**/\n- (void)clearColorsForFlag:(int)mask;\n- (void)clearColorsForFlag:(int)mask context:(int)context;\n- (void)clearColorsForTag:(id <NSCopying>)tag;\n- (void)clearColorsForAllFlags;\n- (void)clearColorsForAllTags;\n- (void)clearAllColors;\n\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/NSJSONSerialization+ObjectWithNString.h",
    "content": "//\n//  NSJSONSerialization+ObjectWithNString.h\n//  Ejecta\n//\n//  Created by matth on 7/19/13.\n//\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (ObjectWithNString)\n+ (id)JSONObjectWithString:(NSString *)string options:(NSJSONReadingOptions)opt error:(NSError **)error;\n+ (NSString*)stringWithNSDictionary:(NSDictionary*)dictionary;\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/NSJSONSerialization+PBJSONHelpers.h",
    "content": "//\n//  NSJSONSerialization+PBJSONHelpers.h\n//  PebbleVendor\n//\n//  Created by matth on 9/17/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (PBJSONHelpers)\n\n/** @name Reflection helpers */\n\n/**\n * Derived from the Box SDK (MIT license) NSJSONSerialization+BoxAdditions...\n * https://github.com/box/box-ios-sdk-v2/tree/master/BoxSDK/Categories\n \n * Ensure that the object at `key` in `dictionary` is a member of the expected class.\n * `NSNull` may be specified as an allowable value. This method may return nil if `key`\n * is not present in `dictionary`.\n *\n * @param key The key to lookup in `dictionary`.\n * @param dictionary A dictionary resulting from deserializing a JSON object.\n * @param cls The expected class of the value at key.\n * @param nullAllowed If true, `NSNull` will be returned. If not, NSNull will be converted to nil. Property getters that pass `YES` for this parameter should have the return type of `id`.\n *\n * @return The object at `key` in `dictionary` if expectations are satisfied; `nil` otherwise.\n */\n+ (id)ensureObjectForKey:(NSString *)key inDictionary:(NSDictionary *)dictionary hasExpectedType:(Class)cls nullAllowed:(BOOL)nullAllowed;\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/NSString+HexData.h",
    "content": "//\n//  NSString+HexData.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 11/19/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSString (HexData)\n\n- (NSData*)hexData;\n\n@end\n\n\n@interface NSData (HexString)\n\n- (NSString*)hexString;\n\n@end"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/UIDevice-Hardware.h",
    "content": "/*\n Erica Sadun, http://ericasadun.com\n iPhone Developer's Cookbook, 6.x Edition\n BSD License, Use at your own risk\n */\n\n#import <UIKit/UIKit.h>\n\ntypedef enum {\n    UIDeviceFamilyiPhone,\n    UIDeviceFamilyiPod,\n    UIDeviceFamilyiPad,\n    UIDeviceFamilyAppleTV,\n    UIDeviceFamilyUnknown,\n    \n} UIDeviceFamily;\n\n@interface UIDevice (Hardware)\n- (NSString *) platform;\n- (NSString *) hwmodel;\n- (NSString *) platformString;\n\n- (NSUInteger) cpuFrequency;\n- (NSUInteger) busFrequency;\n- (NSUInteger) cpuCount;\n- (NSUInteger) totalMemory;\n- (NSUInteger) userMemory;\n\n- (NSNumber *) totalDiskSpace;\n- (NSNumber *) freeDiskSpace;\n\n- (NSString *) macaddress;\n\n- (BOOL) hasRetinaDisplay;\n- (BOOL) hasBluetoothMAP;\n- (UIDeviceFamily) deviceFamily;\n@end"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/PebbleKit/Readme.md",
    "content": "# PebbleKit iOS\n\nWelcome to Pebble's official iOS SDK!\n\n## Compatibility\n\n- iOS 5.0+\n- iPhone 3GS or later\n\n## Examples\n\nAll Pebble SDK examples are now grouped in Pebble SDK, please look into the `examples/` folder of your Pebble SDK for sample code.\n\n## Integrating PebbleKit using Cocoapods\n\n- Install [Cocoapods](http://www.cocoapods.org) or make sure it is up to date\n- Add a Podfile to your project if you don't have one already (Hint: use `pod init`).\n- Add this line to the Podfile: `pod 'PebbleKit', :path => \"/path/to/PebbleKit-iOS\"`\n- Run `pod install`\n\n## Integrating PebbleKit Manually\n\n- Drag PebbleKit.framework into project\n- Drag in PebbleVendor.framework into the project, or, drag the PebbleVendor.xcodeproj into project if you need to control the 3rd party components needed for PebbleKit.\n- Link ExternalAccessory.framework, libz.dylib, CoreBluetooth.framework, CoreMotion.framework and MessageUI.framework\n- Add \"-ObjC\" linker flag to your project's build settings\n- Add the value \"com.getpebble.public\" to the \"Supported external accessory protocols\" (UISupportedExternalAccessoryProtocols) array in your app's Info.plist\n- Optionally, add the value \"App communicates with an accessory\" (external-accessory) to the \"Required background modes\" (UIBackgroundModes) array in your app's Info.plist\n\n\n## Xcode Documentation\n\n- An Xcode docset is included with documentation about all public APIs.\n- Copy `com.getpebble.PebbleKit.docset` content into `~/Library/Developer/Shared/Documentation/DocSets`\n- Restart Xcode. The documentation will now be available from `Help > Documentation and API Reference`\n\n## Submitting iOS apps with PebbleKit to Apple's App Store\n\nIn order for Pebble to work with iPhones, Pebble is part of the Made For iPhone program (a requirement for hardware accessories to interact with iOS apps). Unfortunately this also means that if you build an iOS app with PebbleKit, we (Pebble) will need to whitelist your iOS app before you can upload it to the App Store. If you have completed a Pebble app and would like to learn more about making it available on the App Store, please visit [the whitelisting guide](https://developer.getpebble.com/2/distribute/whitelisting.html)\n\n## Change Log\n\n#### TODO-SetDate - 2.0\n\n- Remove examples from PebbleKit and move them into Pebble SDK\n\n#### 2013-07-03 - 1.12\n- Log errors to the console if there is no delegate set on PBWatch\n- Bugfixes\n-- Fix threading bugs in WeatherDemo\n-- Fix bugs that could cause callbacks to be called on the wrong thread\n-- Fix a bug that could cause a crash when re-connecting to the watch\n-- Fix a bug that caused some types to be unavailable (gtypes.h)\n\n#### 2013-05-06\n- Added WeatherDemo sample project to demonstrate custom use of the AppMessage subsystem\n- Added -[PBWatch closeSession:] to enable 3rd party apps to explicitely close the shared communication session.\n- Added PBBitmap helper class to convert UIImage to the native Pebble bitmap format\n- Exposed category methods on NSData/NSDictionary to (de)serialize from/to Pebble dicts\n- Added documentation for the NSNumber+stdint category\n\n#### 2013-03-25\n- Added generic bi-directional phone app <-> watch app communication layer, called \"App Messages\"\n- Refactored legacy Sports protocol to use App Messages\n- Added APIs to query the watch whether App / Sports Messages are supported (-appMessagesGetIsSupported: and -sportsGetIsSupported:)\n- Added API to set custom icon / title to the Sports watch app\n- Added API to receive Sports activity state changes by pressing the SELECT button on the watch (-sportsAppAddReceiveUpdateHandler:)\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/Pods-PebbleKit-Private.xcconfig",
    "content": "#include \"Pods-PebbleKit.xcconfig\"\nFRAMEWORK_SEARCH_PATHS = ${PODS_PEBBLEKIT_FRAMEWORK_SEARCH_PATHS}\nGCC_PREPROCESSOR_DEFINITIONS = COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/BuildHeaders\" \"${PODS_ROOT}/BuildHeaders/PebbleKit\" \"${PODS_ROOT}/Headers\" \"${PODS_ROOT}/Headers/PebbleKit\"\nOTHER_LDFLAGS = -ObjC ${PODS_PEBBLEKIT_OTHER_LDFLAGS}\nPODS_ROOT = ${SRCROOT}"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/Pods-PebbleKit-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_PebbleKit : NSObject\n@end\n@implementation PodsDummy_Pods_PebbleKit\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/Pods-PebbleKit-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n#import \"Pods-environment.h\"\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/Pods-PebbleKit.xcconfig",
    "content": "PODS_PEBBLEKIT_FRAMEWORK_SEARCH_PATHS = \"$(PODS_ROOT)/PebbleKit\" \"$(PODS_ROOT)/PebbleKit\"\nPODS_PEBBLEKIT_OTHER_LDFLAGS = -lz -framework PebbleKit -framework PebbleVendor -weak_framework CoreBluetooth -weak_framework CoreMotion -weak_framework ExternalAccessory -weak_framework MessageUI"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/Pods-acknowledgements.markdown",
    "content": "# Acknowledgements\nThis application makes use of the following third party libraries:\n\n## PebbleKit\n\n© 2014 Pebble Technology Corp. All rights reserved.\n\nGenerated by CocoaPods - http://cocoapods.org\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/Pods-acknowledgements.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreferenceSpecifiers</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>This application makes use of the following third party libraries:</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Acknowledgements</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>© 2014 Pebble Technology Corp. All rights reserved.\n</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>PebbleKit</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Generated by CocoaPods - http://cocoapods.org</string>\n\t\t\t<key>Title</key>\n\t\t\t<string></string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t</array>\n\t<key>StringsTable</key>\n\t<string>Acknowledgements</string>\n\t<key>Title</key>\n\t<string>Acknowledgements</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/Pods-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods : NSObject\n@end\n@implementation PodsDummy_Pods\n@end\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/Pods-environment.h",
    "content": "\n// To check if a library is compiled with CocoaPods you\n// can use the `COCOAPODS` macro definition which is\n// defined in the xcconfigs so it is available in\n// headers also when they are imported in the client\n// project.\n\n\n// PebbleKit\n#define COCOAPODS_POD_AVAILABLE_PebbleKit\n#define COCOAPODS_VERSION_MAJOR_PebbleKit 2\n#define COCOAPODS_VERSION_MINOR_PebbleKit 2\n#define COCOAPODS_VERSION_PATCH_PebbleKit 0\n\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/Pods-resources.sh",
    "content": "#!/bin/sh\nset -e\n\nRESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt\n> \"$RESOURCES_TO_COPY\"\n\ninstall_resource()\n{\n  case $1 in\n    *.storyboard)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}\"\n      ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .storyboard`.storyboardc\" \"${PODS_ROOT}/$1\" --sdk \"${SDKROOT}\"\n      ;;\n    *.xib)\n        echo \"ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}\"\n      ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .xib`.nib\" \"${PODS_ROOT}/$1\" --sdk \"${SDKROOT}\"\n      ;;\n    *.framework)\n      echo \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      mkdir -p \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      echo \"rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      rsync -av \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      ;;\n    *.xcdatamodel)\n      echo \"xcrun momc \\\"${PODS_ROOT}/$1\\\" \\\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\"`.mom\\\"\"\n      xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcdatamodel`.mom\"\n      ;;\n    *.xcdatamodeld)\n      echo \"xcrun momc \\\"${PODS_ROOT}/$1\\\" \\\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcdatamodeld`.momd\\\"\"\n      xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcdatamodeld`.momd\"\n      ;;\n    *.xcassets)\n      ;;\n    /*)\n      echo \"$1\"\n      echo \"$1\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n    *)\n      echo \"${PODS_ROOT}/$1\"\n      echo \"${PODS_ROOT}/$1\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n  esac\n}\n\nrsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nif [[ \"${ACTION}\" == \"install\" ]]; then\n  rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\nrm -f \"$RESOURCES_TO_COPY\"\n\nif [[ -n \"${WRAPPER_EXTENSION}\" ]] && [ `xcrun --find actool` ] && [ `find . -name '*.xcassets' | wc -l` -ne 0 ]\nthen\n  case \"${TARGETED_DEVICE_FAMILY}\" in \n    1,2)\n      TARGET_DEVICE_ARGS=\"--target-device ipad --target-device iphone\"\n      ;;\n    1)\n      TARGET_DEVICE_ARGS=\"--target-device iphone\"\n      ;;\n    2)\n      TARGET_DEVICE_ARGS=\"--target-device ipad\"\n      ;;\n    *)\n      TARGET_DEVICE_ARGS=\"--target-device mac\"\n      ;;  \n  esac \n  find \"${PWD}\" -name \"*.xcassets\" -print0 | xargs -0 actool --output-format human-readable-text --notices --warnings --platform \"${PLATFORM_NAME}\" --minimum-deployment-target \"${IPHONEOS_DEPLOYMENT_TARGET}\" ${TARGET_DEVICE_ARGS} --compress-pngs --compile \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\n"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/Pods.xcconfig",
    "content": "FRAMEWORK_SEARCH_PATHS = \"$(PODS_ROOT)/PebbleKit\" \"$(PODS_ROOT)/PebbleKit\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers\" \"${PODS_ROOT}/Headers/PebbleKit\"\nOTHER_CFLAGS = $(inherited) -isystem \"${PODS_ROOT}/Headers\" -isystem \"${PODS_ROOT}/Headers/PebbleKit\"\nOTHER_LDFLAGS = -ObjC -lz -framework PebbleKit -framework PebbleVendor -weak_framework CoreBluetooth -weak_framework CoreMotion -weak_framework ExternalAccessory -weak_framework MessageUI\nPODS_ROOT = ${SRCROOT}/Pods"
  },
  {
    "path": "data-logging-demo/OceanSurveyDemo-iOS/Pods/Pods.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t0B31F646F647448CBAECAA9E /* Pods-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AA8A6DE6C27D4B029614B6F8 /* Pods-dummy.m */; };\n\t\t570F259ED2CE4ADAA1EC7CEF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A16AE70251F94ADDA0D559A4 /* Foundation.framework */; };\n\t\tACBBC2A6385F457C840886EE /* libPods-PebbleKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A2920BAE61D42F287904FA1 /* libPods-PebbleKit.a */; };\n\t\tF88FDA5AE4FA4256B4BB27A1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A16AE70251F94ADDA0D559A4 /* Foundation.framework */; };\n\t\tFA160F4BA33A45868738F89E /* Pods-PebbleKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8779A9B7952048FF9296917C /* Pods-PebbleKit-dummy.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t5A845882296942BF8841545E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 8354CC1E67DE463B9EF90AF2 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = C6D6069C790143208CD3471F;\n\t\t\tremoteInfo = \"Pods-PebbleKit\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t192B44BF9B0C4F37B7DCA690 /* PebbleVendor.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = PebbleVendor.framework; sourceTree = \"<group>\"; };\n\t\t24F5C298AB594B4BBDCBCD6D /* PebbleKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = PebbleKit.framework; sourceTree = \"<group>\"; };\n\t\t47375140B9444566B0D17CE4 /* Pods-PebbleKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Pods-PebbleKit-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t4A2920BAE61D42F287904FA1 /* libPods-PebbleKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-PebbleKit.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t5706F12C768446DBBE5B38F4 /* Pods-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-acknowledgements.plist\"; sourceTree = \"<group>\"; };\n\t\t678DCDC6B5C046ECBF2CC587 /* Pods-PebbleKit-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-PebbleKit-Private.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t70471E3E072E4FAEBCB40EA6 /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };\n\t\t73AF57C101734D92AFC6D130 /* Pods-PebbleKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-PebbleKit.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t8779A9B7952048FF9296917C /* Pods-PebbleKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-PebbleKit-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t9641564B78A9425496929685 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tA16AE70251F94ADDA0D559A4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };\n\t\tA79745D561AE42F68998BE03 /* Pods-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = \"Pods-acknowledgements.markdown\"; sourceTree = \"<group>\"; };\n\t\tA7E763E7D7514AAFA38414B9 /* Pods-environment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Pods-environment.h\"; sourceTree = \"<group>\"; };\n\t\tAA8A6DE6C27D4B029614B6F8 /* Pods-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tE44E36CDB06249B0A75F23BE /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.xcconfig; sourceTree = \"<group>\"; };\n\t\tE8888DE8ABCB42DC8076DD48 /* Pods-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-resources.sh\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t88BAE9C61E7F429D8CD87A73 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF88FDA5AE4FA4256B4BB27A1 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD88D476D00E54213BBA7ACD1 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t570F259ED2CE4ADAA1EC7CEF /* Foundation.framework in Frameworks */,\n\t\t\t\tACBBC2A6385F457C840886EE /* libPods-PebbleKit.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t15603A9A8BBA430E8CB420D2 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE44E36CDB06249B0A75F23BE /* Pods.xcconfig */,\n\t\t\t\tA79745D561AE42F68998BE03 /* Pods-acknowledgements.markdown */,\n\t\t\t\t5706F12C768446DBBE5B38F4 /* Pods-acknowledgements.plist */,\n\t\t\t\tAA8A6DE6C27D4B029614B6F8 /* Pods-dummy.m */,\n\t\t\t\tA7E763E7D7514AAFA38414B9 /* Pods-environment.h */,\n\t\t\t\tE8888DE8ABCB42DC8076DD48 /* Pods-resources.sh */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t536EB66C0EC84A21A6BF0A46 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t70471E3E072E4FAEBCB40EA6 /* Podfile */,\n\t\t\t\tBCDCF241ACD14AA9846DCE3B /* Frameworks */,\n\t\t\t\t9B11EB2A742E4DCEA50F51F3 /* Pods */,\n\t\t\t\tF7576C22EFA7450BA5CF2B51 /* Products */,\n\t\t\t\tAC30CD1C4A3E4C6291802475 /* Targets Support Files */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8F00805164D64186BDFE1A32 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t24F5C298AB594B4BBDCBCD6D /* PebbleKit.framework */,\n\t\t\t\t192B44BF9B0C4F37B7DCA690 /* PebbleVendor.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B11EB2A742E4DCEA50F51F3 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE9E7708DF42E45BBB804CB92 /* PebbleKit */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAC30CD1C4A3E4C6291802475 /* Targets Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t15603A9A8BBA430E8CB420D2 /* Pods */,\n\t\t\t);\n\t\t\tname = \"Targets Support Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBCDCF241ACD14AA9846DCE3B /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE54819CC1E21499DB5E8B6BC /* iOS */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE090383D1DD84F26A716E055 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t73AF57C101734D92AFC6D130 /* Pods-PebbleKit.xcconfig */,\n\t\t\t\t678DCDC6B5C046ECBF2CC587 /* Pods-PebbleKit-Private.xcconfig */,\n\t\t\t\t8779A9B7952048FF9296917C /* Pods-PebbleKit-dummy.m */,\n\t\t\t\t47375140B9444566B0D17CE4 /* Pods-PebbleKit-prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\tE54819CC1E21499DB5E8B6BC /* iOS */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA16AE70251F94ADDA0D559A4 /* Foundation.framework */,\n\t\t\t);\n\t\t\tname = iOS;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE9E7708DF42E45BBB804CB92 /* PebbleKit */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8F00805164D64186BDFE1A32 /* Frameworks */,\n\t\t\t\tE090383D1DD84F26A716E055 /* Support Files */,\n\t\t\t);\n\t\t\tname = PebbleKit;\n\t\t\tpath = PebbleKit;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF7576C22EFA7450BA5CF2B51 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9641564B78A9425496929685 /* libPods.a */,\n\t\t\t\t4A2920BAE61D42F287904FA1 /* libPods-PebbleKit.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tC6D6069C790143208CD3471F /* Pods-PebbleKit */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 00A093F48B854C1AA5684C85 /* Build configuration list for PBXNativeTarget \"Pods-PebbleKit\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD60D51DFC05B4B488A418AD4 /* Sources */,\n\t\t\t\t88BAE9C61E7F429D8CD87A73 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Pods-PebbleKit\";\n\t\t\tproductName = \"Pods-PebbleKit\";\n\t\t\tproductReference = 4A2920BAE61D42F287904FA1 /* libPods-PebbleKit.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\tE636AD26042F40D28D26C69E /* Pods */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 333C7CEA5AC54D079C085FB8 /* Build configuration list for PBXNativeTarget \"Pods\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t231E85B434724BBF962C6CD3 /* Sources */,\n\t\t\t\tD88D476D00E54213BBA7ACD1 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t7B048C76E7DD4DA292B4E0D0 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tproductName = Pods;\n\t\t\tproductReference = 9641564B78A9425496929685 /* libPods.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t8354CC1E67DE463B9EF90AF2 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0510;\n\t\t\t};\n\t\t\tbuildConfigurationList = 769B6160FC7C4C1E8278FB59 /* Build configuration list for PBXProject \"Pods\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 536EB66C0EC84A21A6BF0A46;\n\t\t\tproductRefGroup = F7576C22EFA7450BA5CF2B51 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectReferences = (\n\t\t\t);\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tE636AD26042F40D28D26C69E /* Pods */,\n\t\t\t\tC6D6069C790143208CD3471F /* Pods-PebbleKit */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t231E85B434724BBF962C6CD3 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t0B31F646F647448CBAECAA9E /* Pods-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD60D51DFC05B4B488A418AD4 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tFA160F4BA33A45868738F89E /* Pods-PebbleKit-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t7B048C76E7DD4DA292B4E0D0 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = C6D6069C790143208CD3471F /* Pods-PebbleKit */;\n\t\t\ttargetProxy = 5A845882296942BF8841545E /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t017F670E370B4AB3B555FDFF /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 678DCDC6B5C046ECBF2CC587 /* Pods-PebbleKit-Private.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDSTROOT = /tmp/xcodeproj.dst;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Pods-PebbleKit-prefix.pch\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINSTALL_PATH = \"$(BUILT_PRODUCTS_DIR)\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t11AB253405BB4EC9974C8662 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = NO;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t12C56EEFEA0E4E6680374BF1 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = E44E36CDB06249B0A75F23BE /* Pods.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDSTROOT = /tmp/xcodeproj.dst;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINSTALL_PATH = \"$(BUILT_PRODUCTS_DIR)\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1B1BB796CC574276875C6204 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 678DCDC6B5C046ECBF2CC587 /* Pods-PebbleKit-Private.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDSTROOT = /tmp/xcodeproj.dst;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Pods-PebbleKit-prefix.pch\";\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINSTALL_PATH = \"$(BUILT_PRODUCTS_DIR)\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"-DNS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tOTHER_CPLUSPLUSFLAGS = (\n\t\t\t\t\t\"-DNS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t871CE9746F6948D2910A9383 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = E44E36CDB06249B0A75F23BE /* Pods.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDSTROOT = /tmp/xcodeproj.dst;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINSTALL_PATH = \"$(BUILT_PRODUCTS_DIR)\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"-DNS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tOTHER_CPLUSPLUSFLAGS = (\n\t\t\t\t\t\"-DNS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tDEABB199ECDB4346B86DB89E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = NO;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t00A093F48B854C1AA5684C85 /* Build configuration list for PBXNativeTarget \"Pods-PebbleKit\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t017F670E370B4AB3B555FDFF /* Debug */,\n\t\t\t\t1B1BB796CC574276875C6204 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t333C7CEA5AC54D079C085FB8 /* Build configuration list for PBXNativeTarget \"Pods\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t12C56EEFEA0E4E6680374BF1 /* Debug */,\n\t\t\t\t871CE9746F6948D2910A9383 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t769B6160FC7C4C1E8278FB59 /* Build configuration list for PBXProject \"Pods\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t11AB253405BB4EC9974C8662 /* Debug */,\n\t\t\t\tDEABB199ECDB4346B86DB89E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 8354CC1E67DE463B9EF90AF2 /* Project object */;\n}\n"
  },
  {
    "path": "data-logging-demo/README.md",
    "content": "# data-logging-demo\n\n![screenshot](data-logging-demo-screenshot.png)\n\nThis example app consists of a three app projects for Pebble, Android and iOS, \nand uses the \n[Data Logging API](/https://developer.getpebble.com/docs/c/group___data_logging.html) \nto count the number of times each of a number of sea creaters has been\n'spotted'. This action is triggered by pressing buttons in the Pebble app and\nthen transmitted to the appropriate companion app.\n"
  },
  {
    "path": "data-logging-demo/ocean-survey-demo/appinfo.json",
    "content": "{\n  \"uuid\": \"0a5399d9-5693-4f3e-b768-9c99b5f5dcea\",\n  \"shortName\": \"Ocean Survey\",\n  \"longName\": \"Ocean Survey\",\n  \"companyName\": \"Pebble Environment Services\",\n  \"versionCode\": 1,\n  \"versionLabel\": \"1.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_ACTION_ICON_DOLPHIN\",\n        \"file\": \"images/dolphin.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_ACTION_ICON_SEALION\",\n        \"file\": \"images/sealion.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_ACTION_ICON_PELICAN\",\n        \"file\": \"images/pelican.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "data-logging-demo/ocean-survey-demo/src/ocean-survey-demo.c",
    "content": "#include <pebble.h>\n\nstatic const uint32_t ANIMAL_LOG_TAGS[3] = { 0x5, 0xb, 0xd }; // sealion, pelican, dolphin\n\nstatic const int RESOURCE_IDS[3] = {\n  RESOURCE_ID_IMAGE_ACTION_ICON_SEALION,\n  RESOURCE_ID_IMAGE_ACTION_ICON_PELICAN,\n  RESOURCE_ID_IMAGE_ACTION_ICON_DOLPHIN\n};\n\nstatic const GRect NUMBER_POSITIONS[3] =  {\n  {{/* x: */ 100, /* y: */ 12 }, {/* width: */ 28, /* height: */ 28}},\n  {{/* x: */ 100, /* y: */ 60 }, {/* width: */ 28, /* height: */ 28}},\n  {{/* x: */ 100, /* y: */ 107 }, {/* width: */ 28, /* height: */ 28}}\n};\n\ntypedef struct {\n  uint32_t tag;\n  TextLayer *text_layer;\n  char text[20];\n  DataLoggingSessionRef logging_session;\n  int count;\n  GBitmap *bitmap;\n} AnimalData;\n\nstatic Window *s_main_window;\nstatic ActionBarLayer *s_action_bar_layer;\nstatic AnimalData s_animal_data[3]; // 0 = sealion, 1 = dolphin, 2 = pelican\nstatic TextLayer *s_intro_layer;\n\nstatic void count_animal(AnimalData *animal_data) {\n  animal_data->count++;\n  time_t now = time(NULL);\n  \n  // Output log data to phone\n  data_logging_log(animal_data->logging_session, (uint8_t *)&now, 1);\n  \n  snprintf(animal_data->text, 20, \"%d\", animal_data->count);\n  text_layer_set_text(animal_data->text_layer, animal_data->text);\n}\n\nstatic void up_click_handler(ClickRecognizerRef recognizer, void *context) {\n  // Ma, it's a dolphin!\n  AnimalData *animal_data = &s_animal_data[0];\n  count_animal(animal_data);\n}\n\nstatic void select_click_handler(ClickRecognizerRef recognizer, void *context) {\n  // A wonderful bird is the pelican\n  // His bill will hold more than his belican\n  // He can take in his beak\n  // Food enough for a week,\n  // But I'm damned if I see how the helican\n  AnimalData *animal_data = &s_animal_data[1];\n  count_animal(animal_data);\n}\n\nstatic void down_click_handler(ClickRecognizerRef recognizer, void *context) {\n  // Oh, look daddy! A sea lion!\n  AnimalData *animal_data = &s_animal_data[2];\n  count_animal(animal_data);\n}\n\nstatic void select_long_click_handler(ClickRecognizerRef recognizer, void *context) {\n  for (int i = 0; i < 3; i++) {\n    AnimalData *animal_data = &s_animal_data[i];\n    data_logging_finish(animal_data->logging_session);\n    animal_data->count = 0;\n    snprintf(animal_data->text, 20, \"%d\", animal_data->count);\n    text_layer_set_text(animal_data->text_layer, animal_data->text);\n    animal_data->logging_session = data_logging_create(ANIMAL_LOG_TAGS[i], DATA_LOGGING_UINT, 4, false);\n  }\n}\n\nstatic void config_provider(void *ctx) {\n  window_single_click_subscribe(BUTTON_ID_SELECT, select_click_handler);\n  window_single_click_subscribe(BUTTON_ID_UP, up_click_handler);\n  window_single_click_subscribe(BUTTON_ID_DOWN, down_click_handler);\n  window_long_click_subscribe(BUTTON_ID_SELECT, 0, select_long_click_handler, NULL);\n}\n\nstatic void main_window_load(Window *window) {\n  // Create ActionBar\n  s_action_bar_layer = action_bar_layer_create();\n  action_bar_layer_add_to_window(s_action_bar_layer, window);\n  action_bar_layer_set_click_config_provider(s_action_bar_layer, config_provider);\n  action_bar_layer_set_icon(s_action_bar_layer, BUTTON_ID_UP, s_animal_data[0].bitmap);\n  action_bar_layer_set_icon(s_action_bar_layer, BUTTON_ID_SELECT, s_animal_data[1].bitmap);\n  action_bar_layer_set_icon(s_action_bar_layer, BUTTON_ID_DOWN, s_animal_data[2].bitmap);\n\n  // Create TextLayer\n  s_intro_layer = text_layer_create(GRect(7, 50, 90, 93));\n  layer_add_child(window_get_root_layer(window), text_layer_get_layer(s_intro_layer));\n  text_layer_set_text(s_intro_layer, \"track animals\\n???\\nprofit\");\n  text_layer_set_text_alignment(s_intro_layer, GTextAlignmentCenter);\n}\n\nstatic void main_window_unload(Window *window) {\n  action_bar_layer_destroy(s_action_bar_layer);\n  text_layer_destroy(s_intro_layer);\n}\n\nstatic void init() {\n  // Create Window\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n\n  // Init animal data\n  for (int i = 0; i < 3; i++) {\n    AnimalData *animal_data = &s_animal_data[i];\n    animal_data->text_layer = text_layer_create(NUMBER_POSITIONS[i]);\n    text_layer_set_background_color(animal_data->text_layer, GColorClear);\n    layer_add_child(window_get_root_layer(s_main_window), text_layer_get_layer(animal_data->text_layer));\n    animal_data->logging_session = data_logging_create(ANIMAL_LOG_TAGS[i], DATA_LOGGING_UINT, 4, false);\n    animal_data->bitmap = gbitmap_create_with_resource(RESOURCE_IDS[i]);\n    snprintf(animal_data->text, 20, \"%d\", animal_data->count);\n    text_layer_set_text(animal_data->text_layer, animal_data->text);\n    text_layer_set_font(animal_data->text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));\n  }\n}\n\nstatic void deinit() {\n  // Deinit animal data\n  for (int i = 0; i < 3; i++) {\n    AnimalData *animal_data = &s_animal_data[i];\n    data_logging_finish(animal_data->logging_session);\n    text_layer_destroy(animal_data->text_layer);\n    gbitmap_destroy(animal_data->bitmap);\n  }\n\n  // Destroy Window\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "data-logging-demo/ocean-survey-demo/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/.classpath",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<classpath>\n\t<classpathentry kind=\"src\" path=\"src\"/>\n\t<classpathentry kind=\"src\" path=\"gen\"/>\n\t<classpathentry kind=\"con\" path=\"com.android.ide.eclipse.adt.ANDROID_FRAMEWORK\"/>\n\t<classpathentry kind=\"con\" path=\"com.android.ide.eclipse.adt.LIBRARIES\"/>\n\t<classpathentry kind=\"output\" path=\"bin/classes\"/>\n</classpath>\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/.idea/.name",
    "content": "GolfDemo-Android"
  },
  {
    "path": "golf-demo/GolfDemo-Android/.idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <option name=\"DEFAULT_COMPILER\" value=\"Javac\" />\n    <resourceExtensions />\n    <wildcardResourcePatterns>\n      <entry name=\"!?*.java\" />\n      <entry name=\"!?*.form\" />\n      <entry name=\"!?*.class\" />\n      <entry name=\"!?*.groovy\" />\n      <entry name=\"!?*.scala\" />\n      <entry name=\"!?*.flex\" />\n      <entry name=\"!?*.kt\" />\n      <entry name=\"!?*.clj\" />\n    </wildcardResourcePatterns>\n    <annotationProcessing>\n      <profile default=\"true\" name=\"Default\" enabled=\"false\">\n        <processorPath useClasspath=\"true\" />\n      </profile>\n    </annotationProcessing>\n  </component>\n</project>\n\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/.idea/copyright/profiles_settings.xml",
    "content": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": "golf-demo/GolfDemo-Android/.idea/encodings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\" useUTFGuessing=\"true\" native2AsciiForPropertiesFiles=\"false\" />\n</project>\n\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/.idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"gradleHome\" value=\"/usr/local/bin/gradle\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n          </set>\n        </option>\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>\n\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/.idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points version=\"2.0\" />\n  </component>\n  <component name=\"ProjectInspectionProfilesVisibleTreeState\">\n    <entry key=\"Project Default\">\n      <profile-state>\n        <expanded-state>\n          <State>\n            <id />\n          </State>\n        </expanded-state>\n        <selected-state>\n          <State>\n            <id>Spelling</id>\n          </State>\n        </selected-state>\n      </profile-state>\n    </entry>\n  </component>\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_1_6\" assert-keyword=\"true\" jdk-15=\"true\" project-jdk-name=\"1.7\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"masterDetails\">\n    <states>\n      <state key=\"ProjectJDKs.UI\">\n        <settings>\n          <last-edited>Android API 10 Platform</last-edited>\n          <splitter-proportions>\n            <option name=\"proportions\">\n              <list>\n                <option value=\"0.2\" />\n              </list>\n            </option>\n          </splitter-proportions>\n        </settings>\n      </state>\n    </states>\n  </component>\n</project>\n\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/.idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/GolfDemo-Android.iml\" filepath=\"$PROJECT_DIR$/GolfDemo-Android.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/app/app.iml\" filepath=\"$PROJECT_DIR$/app/app.iml\" />\n    </modules>\n  </component>\n</project>\n\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/.idea/scopes/scope_settings.xml",
    "content": "<component name=\"DependencyValidationManager\">\n  <state>\n    <option name=\"SKIP_IMPORT_STATEMENTS\" value=\"false\" />\n  </state>\n</component>"
  },
  {
    "path": "golf-demo/GolfDemo-Android/.idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"\" vcs=\"\" />\n    <mapping directory=\"$PROJECT_DIR$/../..\" vcs=\"Git\" />\n  </component>\n</project>\n\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/.project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>PebbleKitExamples(git)</name>\n\t<comment></comment>\n\t<projects>\n\t</projects>\n\t<buildSpec>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.jdt.core.javabuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.ApkBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t</buildSpec>\n\t<natures>\n\t\t<nature>com.android.ide.eclipse.adt.AndroidNature</nature>\n\t\t<nature>org.eclipse.jdt.core.javanature</nature>\n\t</natures>\n</projectDescription>\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/.settings/org.eclipse.jdt.core.prefs",
    "content": "eclipse.preferences.version=1\norg.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6\norg.eclipse.jdt.core.compiler.compliance=1.6\norg.eclipse.jdt.core.compiler.source=1.6\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.example.PebbleKitExample\"\n  android:versionCode=\"1\"\n  android:versionName=\"1.0\">\n\n  <permission android:name=\"com.example.PebbleKitExample.permission.C2D_MESSAGE\" android:protectionLevel=\"signature\" />\n  <uses-permission android:name=\"com.example.PebbleKitExample.permission.C2D_MESSAGE\" />\n  <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />\n  <uses-permission android:name=\"android.permission.INTERNET\" />\n  <uses-permission android:name=\"android.permission.SEND_SMS\"/>\n  <uses-permission android:name=\"android.permission.READ_CONTACTS\"/>\n  <uses-permission android:name=\"android.permission.NFC\" />\n  <uses-feature android:name=\"android.hardware.nfc\" />\n\n    <!-- App receives GCM messages. -->\n    <uses-permission android:name=\"com.google.android.c2dm.permission.RECEIVE\" />\n    <!-- GCM connects to Google Services. -->\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <!-- GCM requires a Google account. -->\n    <uses-permission android:name=\"android.permission.GET_ACCOUNTS\" />\n    <!-- Keeps the processor from sleeping when a message is received. -->\n    <uses-permission android:name=\"android.permission.WAKE_LOCK\" />\n\n  <application android:label=\"@string/app_name\">\n\n    <activity\n      android:name=\".MainActivity\"\n      android:label=\"@string/app_name\">\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n\n    <activity\n      android:name=\".ExampleSportsActivity\"\n      android:label=\"@string/activity_sports\">\n\n    </activity>\n\n    <activity\n      android:name=\".ExampleGolfActivity\"\n      android:label=\"@string/activity_golf\">\n\n    </activity>\n\n    <activity\n      android:name=\".ExampleWeatherActivity\"\n      android:label=\"@string/activity_weather\">\n\n    </activity>\n\n    <activity\n      android:name=\".TodoList.ExampleTodoListActivity\"\n      android:label=\"@string/activity_todo_list\">\n\n    </activity>\n\n      <activity\n          android:name=\".ExampleSmsActivity\"\n          android:label=\"@string/activity_sms\">\n\n      </activity>\n\n    <activity\n       android:name=\".ExampleGCMActivity\"\n       android:label=\"@string/activity_gcm\"\n       android:screenOrientation=\"portrait\"\n       android:launchMode=\"singleInstance\">\n       <intent-filter>\n            <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n            <category android:name=\"android.intent.category.DEFAULT\" />\n            <data android:mimeType=\"application/com.example.android.beam\" />\n        </intent-filter>\n    </activity>\n\n    <receiver android:name=\"com.google.android.gcm.GCMBroadcastReceiver\" android:permission=\"com.google.android.c2dm.permission.SEND\" >\n        <intent-filter>\n            <action android:name=\"com.google.android.c2dm.intent.RECEIVE\" />\n            <action android:name=\"com.google.android.c2dm.intent.REGISTRATION\" />\n            <category android:name=\"com.example.PebbleKitExample\" />\n        </intent-filter>\n    </receiver>\n\n    <service android:name=\".GCMIntentService\" />\n  </application>\n</manifest> \n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/GolfDemo-Android.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.path=\"$MODULE_DIR$\" external.root.project.path=\"$MODULE_DIR$\" external.system.id=\"GRADLE\" external.system.module.group=\"\" external.system.module.version=\"unspecified\" type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"FacetManager\">\n    <facet type=\"java-gradle\" name=\"Java-Gradle\">\n      <configuration>\n        <option name=\"BUILD_FOLDER_PATH\" value=\"$MODULE_DIR$/build\" />\n      </configuration>\n    </facet>\n  </component>\n  <component name=\"NewModuleRootManager\" inherit-compiler-output=\"true\">\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$\">\n      <excludeFolder url=\"file://$MODULE_DIR$/.gradle\" />\n    </content>\n    <orderEntry type=\"inheritedJdk\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n  </component>\n</module>\n\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/README.md",
    "content": "PebbleKitExample\n================\n\nA class containing sample code that demonstrates how Android applications can\nsend to and receive data from Pebble Smartwatch applications that support\nAppMessages.\n\nEmergency SMS: ExampleSmsActivity\n---------------------------------\nThis app looks like an ordinary clock, but pressing a button on your Pebble will discreetly alert a friend to your current location so they can rescue you. \n\n1. From the watch SDK, build and install demos/feature_app_messages_send to your Pebble.\n2. Launch the ExamplePebbleKitActivity on your phone.\n3. Tap \"GPS/SMS App Example\"\n4. Enter a phone number, or tap \"Select Contact\" to choose one.\n5. If the app hasn't already launched on your watch, pick GPS/SMS Time from the watch menu\n6. On your watch, press the up button\n\nYou'll see GPS start up on your phone.  After it gets a fix, the number you entered will receive two texts: one with GPS coordinates, and another with the address corresponding to those coordinates (if the Geocoding API can find one.)\n\nNote: this app will only function if it's in the foreground, and the screen is on.\n\n---\n\nPebble-to-pebble communication via Google Cloud Messaging and NFC: ExampleGCMActivity\n-------------------------------------------------------------------------------------\nThis app lets you pair a friend's Pebble with yours so you can send a vibrating notification from your watch to theirs.   It's called Happy Hour because it could be a good way to tell a friend about free beer or food.  You'll need two Pebbles and two NFC-enabled Android devices for this app.\n\n1. From the watch SDK, build and install demos/app_vibrate_paired_pebble to your Pebble.\n2. Launch the ExamplePebbleKitActivity on your phones.  \n3. Tap \"GCM Activity\" on both phones.\n4. Tap the two phones together.  When the Android Beam UI comes up, tap \"Touch to Beam\" on one of the phones.  Tap the two phones again, and tap the send button on the other phone.\n5. If the app hasn't already launched on your watch, pick Happy Hour from the watch menu\n6. The phones are now paired.  Pressing the up button on the watch will make the other watch vibrate.\n\nHow it works: the NFC tap sends one phone's GCM id to the other phone.  We ping the GCM server directly from the phone, rather than needing to have a backend.  When a GCM notification arrives, it sends an app message to the watch, causing it to vibrate.\n\nNote: this app will only function if it's in the foreground, and the screen is on.\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/ant.properties",
    "content": "# This file is used to override default values used by the Ant build system.\n#\n# This file must be checked into Version Control Systems, as it is\n# integral to the build system of your project.\n\n# This file is only used by the Ant script.\n\n# You can use this to override default values such as\n#  'source.dir' for the location of your java source folder and\n#  'out.dir' for the location of your output folder.\n\n# You can also use it define how the release builds are signed by declaring\n# the following properties:\n#  'key.store' for the location of your keystore and\n#  'key.alias' for the name of the key to use.\n# The password will be asked during the build when you use the 'release' target.\n\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/app/app.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.path=\"$MODULE_DIR$\" external.root.project.path=\"$MODULE_DIR$/..\" external.system.id=\"GRADLE\" external.system.module.group=\"GolfDemo-Android\" external.system.module.version=\"unspecified\" type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"FacetManager\">\n    <facet type=\"android-gradle\" name=\"Android-Gradle\">\n      <configuration>\n        <option name=\"GRADLE_PROJECT_PATH\" value=\":app\" />\n      </configuration>\n    </facet>\n    <facet type=\"android\" name=\"Android\">\n      <configuration>\n        <option name=\"SELECTED_BUILD_VARIANT\" value=\"debug\" />\n        <option name=\"SELECTED_TEST_ARTIFACT\" value=\"_android_test_\" />\n        <option name=\"ASSEMBLE_TASK_NAME\" value=\"assembleDebug\" />\n        <option name=\"COMPILE_JAVA_TASK_NAME\" value=\"compileDebugSources\" />\n        <option name=\"ASSEMBLE_TEST_TASK_NAME\" value=\"assembleDebugTest\" />\n        <option name=\"SOURCE_GEN_TASK_NAME\" value=\"generateDebugSources\" />\n        <option name=\"TEST_SOURCE_GEN_TASK_NAME\" value=\"generateDebugTestSources\" />\n        <option name=\"ALLOW_USER_CONFIGURATION\" value=\"false\" />\n        <option name=\"MANIFEST_FILE_RELATIVE_PATH\" value=\"/src/main/AndroidManifest.xml\" />\n        <option name=\"RES_FOLDER_RELATIVE_PATH\" value=\"/src/main/res\" />\n        <option name=\"RES_FOLDERS_RELATIVE_PATH\" value=\"file://$MODULE_DIR$/src/main/res\" />\n        <option name=\"ASSETS_FOLDER_RELATIVE_PATH\" value=\"/src/main/assets\" />\n      </configuration>\n    </facet>\n  </component>\n  <component name=\"NewModuleRootManager\" inherit-compiler-output=\"false\">\n    <output url=\"file://$MODULE_DIR$/build/intermediates/classes/debug\" />\n    <output-test url=\"file://$MODULE_DIR$/build/intermediates/classes/test/debug\" />\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$\">\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/r/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/aidl/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/buildConfig/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/rs/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/res/rs/debug\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/res/generated/debug\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/r/test/debug\" isTestSource=\"true\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/aidl/test/debug\" isTestSource=\"true\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/buildConfig/test/debug\" isTestSource=\"true\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/rs/test/debug\" isTestSource=\"true\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/res/rs/test/debug\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/res/generated/test/debug\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/res\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/resources\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/assets\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/aidl\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/java\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/jni\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/rs\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/res\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/resources\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/assets\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/aidl\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/java\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/jni\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/rs\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/res\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/resources\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/assets\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/aidl\" isTestSource=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/java\" isTestSource=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/jni\" isTestSource=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/rs\" isTestSource=\"true\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/assets\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/bundles\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/classes\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/dependency-cache\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/dex\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/dex-cache\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/incremental\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/jacoco\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/javaResources\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/libs\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/lint\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/manifests\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/ndk\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/pre-dexed\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/proguard\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/res\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/rs\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/symbols\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/outputs\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/tmp\" />\n    </content>\n    <orderEntry type=\"jdk\" jdkName=\"Android API 17 Platform\" jdkType=\"Android SDK\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n    <orderEntry type=\"library\" exported=\"\" name=\"pebblekit-2.6.0\" level=\"project\" />\n  </component>\n</module>\n\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nrepositories {\n    mavenCentral()\n    maven { url \"https://oss.sonatype.org/content/groups/public/\" }\n}\n\nandroid {\n    compileSdkVersion 17\n    buildToolsVersion '20.0.0'\n\n    defaultConfig {\n        applicationId \"com.example.pebblekit.golf\"\n        minSdkVersion 14\n        targetSdkVersion 17\n    }\n\n    lintOptions {\n        abortOnError false\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'\n        }\n    }\n}\n\ndependencies {\n    compile 'com.getpebble:pebblekit:2.6.0'\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.example.PebbleKitExample\"\n  android:versionCode=\"1\"\n  android:versionName=\"1.0\">\n\n  <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />\n  <uses-permission android:name=\"android.permission.INTERNET\" />\n  <uses-permission android:name=\"android.permission.SEND_SMS\"/>\n  <uses-permission android:name=\"android.permission.READ_CONTACTS\"/>\n  <uses-permission android:name=\"android.permission.NFC\" />\n  <uses-feature android:name=\"android.hardware.nfc\" />\n  \n  <!-- Keeps the processor from sleeping when a message is received. -->\n  <uses-permission android:name=\"android.permission.WAKE_LOCK\" />\n\n  <application android:label=\"@string/app_name\">\n\n      <activity\n      android:name=\".ExampleGolfActivity\"\n      android:label=\"@string/activity_golf\">\n          <intent-filter>\n              <action android:name=\"android.intent.action.MAIN\" />\n              <category android:name=\"android.intent.category.LAUNCHER\" />\n          </intent-filter>\n      </activity>\n\n  </application>\n</manifest> \n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/app/src/main/java/com/example/PebbleKitExample/ExampleGolfActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.view.View;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.getpebble.android.kit.Constants;\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\n\nimport java.util.Random;\n\n/**\n * Sample code demonstrating how Android applications can send+receive data using the 'Golf' app,\n * one of Pebble's built-in sports watch-apps.\n */\npublic class ExampleGolfActivity extends Activity {\n\n    private final Random rand = new Random();\n    private PebbleKit.PebbleDataReceiver dataReceiver;\n    private int appData[][] = new int[18][4];\n    private int selection = 0;\n\n    // Generate random (but somewhat believable) values to be displayed on the watch.\n    private void generateGolfData() {\n        for (int i = 0; i < appData.length; ++i) {\n            int backDistance = rand.nextInt(800) + 50;\n            appData[i][0] = 1 + rand.nextInt(5); // par\n            appData[i][1] = backDistance; // back of the green\n            appData[i][2] = backDistance - 15; // middle of the green\n            appData[i][3] = backDistance - 30; // front of the green\n        }\n    }\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_golf);\n        generateGolfData();\n        selection = 0;\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (dataReceiver != null) {\n            unregisterReceiver(dataReceiver);\n            dataReceiver = null;\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n\n        updateUi();\n\n        // In order to interact with the UI thread from a broadcast receiver, we need to perform any updates through\n        // an Android handler. For more information, see: http://developer.android.com/reference/android/os/Handler.html\n        final Handler handler = new Handler();\n\n        // To receive data back from the sports watch-app, android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        //\n        // In this example, we're registering a receiver to listen for\n        // button presses sent from the watch, allowing us to page\n        // through the holes displayed on the phone and watch.\n        dataReceiver = new PebbleKit.PebbleDataReceiver(Constants.GOLF_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                final int cmd = data.getInteger(Constants.GOLF_CMD_KEY).intValue();\n\n                handler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        // All data received from the Pebble must be ACK'd, otherwise you'll hit time-outs in the\n                        // watch-app which will cause the watch to feel \"laggy\" during periods of frequent\n                        // communication.\n                        PebbleKit.sendAckToPebble(context, transactionId);\n\n                        switch (cmd) {\n                            case Constants.GOLF_CMD_NEXT:\n                                next();\n                                break;\n                            case Constants.GOLF_CMD_PREV:\n                                previous();\n                                break;\n//                            case Constants.GOLF_CMD_SELECT:\n//                                Toast.makeText(context,  \"Golf app's select button was pressed\", Toast.LENGTH_LONG).show();\n//                                break;\n                        }\n                    }\n                });\n            }\n        };\n        PebbleKit.registerReceivedDataHandler(this, dataReceiver);\n    }\n\n    // Send a broadcast to launch the specified application on the connected Pebble\n    public void startWatchApp(View view) {\n        PebbleKit.startAppOnPebble(getApplicationContext(), Constants.GOLF_UUID);\n    }\n\n    // Send a broadcast to close the specified application on the connected Pebble\n    public void stopWatchApp(View view) {\n        PebbleKit.closeAppOnPebble(getApplicationContext(), Constants.GOLF_UUID);\n    }\n\n    // A custom icon and name can be applied to the golf-app to\n    // provide some support for \"branding\" your Pebble-enabled sports\n    // application on the watch.\n    //\n    // It is recommended that applications customize the sports\n    // application before launching it. Only one application may\n    // customize the sports application at a time on a first-come,\n    // first-serve basis.\n    public void customizeWatchApp(View view) {\n        final String customAppName = \"My Golf App\";\n        final Bitmap customIcon = BitmapFactory.decodeResource(getResources(), R.drawable.watch);\n\n        PebbleKit.customizeWatchApp(\n                getApplicationContext(), Constants.PebbleAppType.GOLF, customAppName, customIcon);\n    }\n\n    // Update the Activity with the data for a given hole\n    public void updateUi() {\n        int holeInfo[] = appData[selection];\n\n        String holePar = String.format(\"Hole: %d Par: %d\", selection + 1, holeInfo[0]);\n        String back = String.format(\"%d\", holeInfo[1]);\n        String mid = String.format(\"%d\", holeInfo[2]);\n        String front = String.format(\"%d\", holeInfo[3]);\n\n        TextView parText = (TextView) findViewById(R.id.textHole);\n        parText.setText(holePar);\n\n        TextView backText = (TextView) findViewById(R.id.textBack);\n        backText.setText(back);\n\n        TextView midText = (TextView) findViewById(R.id.textMiddle);\n        midText.setText(mid);\n\n        TextView frontText = (TextView) findViewById(R.id.textFront);\n        frontText.setText(front);\n    }\n\n    // Push {range, hole, par} data to be displayed on Pebble's Golf app.\n    // To simplify formatting, values are transmitted to Pebble as null-terminated strings.\n    public void updateWatch() {\n        int holeInfo[] = appData[selection];\n\n        String hole = String.format(\"%d\", selection + 1);\n        String par = String.format(\"%d\", holeInfo[0]);\n        String back = String.format(\"%d\", holeInfo[1]);\n        String mid = String.format(\"%d\", holeInfo[2]);\n        String front = String.format(\"%d\", holeInfo[3]);\n\n        // All data sent handled by PebbleKit is wrapped in a PebbleDictionary. The interface is somewhat similar to\n        // Map<Integer, Object>, as PebbleDictionaries may contain heterogeneous types.\n        //\n        // Here we are building up a Dictionary that maps integer keys to String values that will be interpreted &\n        // displayed by the watch.\n        PebbleDictionary data = new PebbleDictionary();\n        data.addString(Constants.GOLF_HOLE_KEY, hole);\n        data.addString(Constants.GOLF_PAR_KEY, par);\n        data.addString(Constants.GOLF_BACK_KEY, back);\n        data.addString(Constants.GOLF_MID_KEY, mid);\n        data.addString(Constants.GOLF_FRONT_KEY, front);\n\n        // Once the dictionary has been populated, it is scheduled to be sent to the watch. The sender/recipient of\n        // all PebbleKit messages is determined by the UUID. In this case, since we're sending the data to the golf app,\n        // we specify the Golf UUID.\n        PebbleKit.sendDataToPebble(getApplicationContext(), Constants.GOLF_UUID, data);\n    }\n\n    private void previous() {\n        if (selection > 0) {\n            selection -= 1;\n        }\n\n        updateUi();\n        updateWatch();\n    }\n\n    public void goPrevious(View view) {\n        previous();\n    }\n\n    public void next() {\n        if (selection < 17) {\n            selection += 1;\n        }\n\n        updateUi();\n        updateWatch();\n    }\n\n    public void goNext(View view) {\n        next();\n    }\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/app/src/main/res/layout/activity_golf.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:orientation=\"vertical\"\n  android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"New Text\"\n    android:id=\"@+id/textBack\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"24sp\" />\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"New Text\"\n    android:id=\"@+id/textMiddle\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"32sp\"\n    android:textStyle=\"bold\" />\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"New Text\"\n    android:id=\"@+id/textFront\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"24sp\" />\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"New Text\"\n    android:id=\"@+id/textHole\"\n    android:layout_gravity=\"center\"\n    android:layout_marginTop=\"15dp\"\n    android:textSize=\"24sp\" />\n\n  <LinearLayout\n    android:orientation=\"horizontal\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\"\n    android:layout_margin=\"5dp\">\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Start App\"\n      android:id=\"@+id/button\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"startWatchApp\"/>\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Stop App\"\n      android:id=\"@+id/button1\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"stopWatchApp\"/>\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Customize App\"\n      android:id=\"@+id/button2\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"customizeWatchApp\"/>\n\n  </LinearLayout>\n\n  <Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Prev Hole\"\n    android:id=\"@+id/button4\"\n    android:layout_gravity=\"center\"\n    android:onClick=\"goPrevious\"/>\n\n  <Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Next Hole\"\n    android:id=\"@+id/button3\"\n    android:layout_gravity=\"center\"\n    android:onClick=\"goNext\"/>\n\n</LinearLayout>"
  },
  {
    "path": "golf-demo/GolfDemo-Android/app/src/main/res/menu/options_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n  <!-- FIXME is there a way to avoid using the condensed titles here, perhaps by stacking the items? -->\n    <item android:id=\"@+id/add_mi\" android:title=\"Add\" android:visible=\"true\" android:enabled=\"true\" android:titleCondensed=\"+\"></item>\n    <item android:id=\"@+id/remove_all_checked_mi\" android:enabled=\"true\" android:titleCondensed=\"X\" android:title=\"Remove Checked\" android:visible=\"true\"></item>\n</menu>"
  },
  {
    "path": "golf-demo/GolfDemo-Android/app/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"item_height\">67dp</dimen>\n    <dimen name=\"section_div_height\">20dp</dimen>\n</resources>\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/app/src/main/res/values/dslv_attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<resources>\n  <declare-styleable name=\"DragSortListView\">\n    <attr name=\"collapsed_height\" format=\"dimension\" />\n    <attr name=\"drag_scroll_start\" format=\"float\" />\n    <attr name=\"max_drag_scroll_speed\" format=\"float\" />\n    <attr name=\"float_background_color\" format=\"color\" />\n    <attr name=\"remove_mode\">\n      <enum name=\"clickRemove\" value=\"0\" />\n      <enum name=\"flingRemove\" value=\"1\" />\n    </attr>\n    <attr name=\"track_drag_sort\" format=\"boolean\"/>\n    <attr name=\"float_alpha\" format=\"float\"/>\n    <attr name=\"slide_shuffle_speed\" format=\"float\"/>\n    <attr name=\"remove_animation_duration\" format=\"integer\"/>\n    <attr name=\"drop_animation_duration\" format=\"integer\"/>\n    <attr name=\"drag_enabled\" format=\"boolean\" />\n    <attr name=\"sort_enabled\" format=\"boolean\" />\n    <attr name=\"remove_enabled\" format=\"boolean\" />\n    <attr name=\"drag_start_mode\">\n      <enum name=\"onDown\" value=\"0\" />\n      <enum name=\"onMove\" value=\"1\" />\n      <enum name=\"onLongPress\" value=\"2\"/>\n    </attr>\n    <attr name=\"drag_handle_id\" format=\"integer\" />\n    <attr name=\"fling_handle_id\" format=\"integer\" />\n    <attr name=\"click_remove_id\" format=\"integer\" />\n    <attr name=\"use_default_controller\" format=\"boolean\" />\n  </declare-styleable>\n</resources>\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/app/src/main/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item type=\"id\" name=\"drag_handle\" />\n    <item type=\"id\" name=\"click_remove\" />\n</resources>\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"app_name\">Golf Demo</string>\n  <string name=\"activity_golf\">Golf App Example</string>\n</resources>\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n    repositories {\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:1.0.1'\n    }\n}\n\nallprojects {\n    repositories {\n        jcenter()\n    }\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/build.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project name=\"PebbleKitExample\" default=\"help\">\n\n    <!-- The local.properties file is created and updated by the 'android' tool.\n         It contains the path to the SDK. It should *NOT* be checked into\n         Version Control Systems. -->\n    <property file=\"local.properties\" />\n\n    <!-- The ant.properties file can be created by you. It is only edited by the\n         'android' tool to add properties to it.\n         This is the place to change some Ant specific build properties.\n         Here are some properties you may want to change/update:\n\n         source.dir\n             The name of the source directory. Default is 'src'.\n         out.dir\n             The name of the output directory. Default is 'bin'.\n\n         For other overridable properties, look at the beginning of the rules\n         files in the SDK, at tools/ant/build.xml\n\n         Properties related to the SDK location or the project target should\n         be updated using the 'android' tool with the 'update' action.\n\n         This file is an integral part of the build system for your\n         application and should be checked into Version Control Systems.\n\n         -->\n    <property file=\"ant.properties\" />\n\n    <!-- if sdk.dir was not set from one of the property file, then\n         get it from the ANDROID_HOME env var.\n         This must be done before we load project.properties since\n         the proguard config can use sdk.dir -->\n    <property environment=\"env\" />\n    <condition property=\"sdk.dir\" value=\"${env.ANDROID_HOME}\">\n        <isset property=\"env.ANDROID_HOME\" />\n    </condition>\n\n    <!-- The project.properties file is created and updated by the 'android'\n         tool, as well as ADT.\n\n         This contains project specific properties such as project target, and library\n         dependencies. Lower level build properties are stored in ant.properties\n         (or in .classpath for Eclipse projects).\n\n         This file is an integral part of the build system for your\n         application and should be checked into Version Control Systems. -->\n    <loadproperties srcFile=\"project.properties\" />\n\n    <!-- quick check on sdk.dir -->\n    <fail\n            message=\"sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable.\"\n            unless=\"sdk.dir\"\n    />\n\n    <!--\n        Import per project custom build rules if present at the root of the project.\n        This is the place to put custom intermediary targets such as:\n            -pre-build\n            -pre-compile\n            -post-compile (This is typically used for code obfuscation.\n                           Compiled code location: ${out.classes.absolute.dir}\n                           If this is not done in place, override ${out.dex.input.absolute.dir})\n            -post-package\n            -post-build\n            -pre-clean\n    -->\n    <import file=\"custom_rules.xml\" optional=\"true\" />\n\n    <!-- Import the actual build file.\n\n         To customize existing targets, there are two options:\n         - Customize only one target:\n             - copy/paste the target into this file, *before* the\n               <import> task.\n             - customize it to your needs.\n         - Customize the whole content of build.xml\n             - copy/paste the content of the rules files (minus the top node)\n               into this file, replacing the <import> task.\n             - customize to your needs.\n\n         ***********************\n         ****** IMPORTANT ******\n         ***********************\n         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,\n         in order to avoid having your file be overridden by tools such as \"android update project\"\n    -->\n    <!-- version-tag: 1 -->\n    <import file=\"${sdk.dir}/tools/ant/build.xml\" />\n\n</project>\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Mon Feb 09 11:55:39 PST 2015\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-2.2.1-all.zip\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# For Cygwin, ensure paths are in UNIX format before anything is touched.\nif $cygwin ; then\n    [ -n \"$JAVA_HOME\" ] && JAVA_HOME=`cygpath --unix \"$JAVA_HOME\"`\nfi\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >&-\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >&-\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\r\nset CMD_LINE_ARGS=%$\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/proguard-project.txt",
    "content": "# To enable ProGuard in your project, edit project.properties\n# to define the proguard.config property as described in that file.\n#\n# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in ${sdk.dir}/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the ProGuard\n# include property in project.properties.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/project.properties",
    "content": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# This file must be checked in Version Control Systems.\n#\n# To customize properties used by the Ant build system edit\n# \"ant.properties\", and override values to adapt the script to your\n# project structure.\n#\n# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):\n#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt\n\n# Project target.\ntarget=android-14\nandroid.library.reference.1=../../../PebbleKit-Android/PebbleKit\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/res/layout/activity_gcm.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:orientation=\"vertical\"\n  android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Run this Activity on the other phone you want to pair with, then tap.\"\n    android:id=\"@+id/textGcmStatus\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"24sp\" />\n\n</LinearLayout>"
  },
  {
    "path": "golf-demo/GolfDemo-Android/res/layout/activity_golf.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:orientation=\"vertical\"\n  android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"New Text\"\n    android:id=\"@+id/textBack\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"24sp\" />\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"New Text\"\n    android:id=\"@+id/textMiddle\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"32sp\"\n    android:textStyle=\"bold\" />\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"New Text\"\n    android:id=\"@+id/textFront\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"24sp\" />\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"New Text\"\n    android:id=\"@+id/textHole\"\n    android:layout_gravity=\"center\"\n    android:layout_marginTop=\"15dp\"\n    android:textSize=\"24sp\" />\n\n  <LinearLayout\n    android:orientation=\"horizontal\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\"\n    android:layout_margin=\"5dp\">\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Start App\"\n      android:id=\"@+id/button\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"startWatchApp\"/>\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Stop App\"\n      android:id=\"@+id/button1\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"stopWatchApp\"/>\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Customize App\"\n      android:id=\"@+id/button2\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"customizeWatchApp\"/>\n\n  </LinearLayout>\n\n  <Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Prev Hole\"\n    android:id=\"@+id/button4\"\n    android:layout_gravity=\"center\"\n    android:onClick=\"goPrevious\"/>\n\n  <Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Next Hole\"\n    android:id=\"@+id/button3\"\n    android:layout_gravity=\"center\"\n    android:onClick=\"goNext\"/>\n\n</LinearLayout>"
  },
  {
    "path": "golf-demo/GolfDemo-Android/res/layout/activity_sms.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:orientation=\"vertical\"\n  android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Number to send text to\"\n    android:id=\"@+id/textBack\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"24sp\" />\n\n  <EditText\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"\"\n    android:id=\"@+id/destinationNumber\"\n    android:layout_gravity=\"center\"/>\n\n    <LinearLayout\n            android:orientation=\"horizontal\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_margin=\"5dp\">\n\n        <Button\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"Select Contact\"\n                android:id=\"@+id/pickContactButton\"\n                android:layout_gravity=\"center\"\n                android:onClick=\"pickContact\"/>\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "golf-demo/GolfDemo-Android/res/layout/activity_sports.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:orientation=\"vertical\"\n  android:layout_width=\"fill_parent\"\n  android:layout_height=\"fill_parent\"\n  android:padding=\"10dp\">\n\n  <ImageView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:id=\"@+id/imageView\"\n    android:layout_gravity=\"center\"\n    android:src=\"@drawable/running\" />\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Paused\"\n    android:id=\"@+id/status\"\n    android:layout_gravity=\"center\"\n    android:typeface=\"sans\"\n    android:textStyle=\"bold\"\n    android:textSize=\"32sp\"\n    android:layout_marginTop=\"5dp\" />\n\n  <LinearLayout\n    android:orientation=\"horizontal\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\"\n    android:layout_marginTop=\"20dp\">\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"fill_parent\"\n      android:text=\"Start App\"\n      android:id=\"@+id/button\"\n      android:onClick=\"startWatchApp\" />\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Stop App\"\n      android:id=\"@+id/button2\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"stopWatchApp\" />\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Customize App\"\n      android:id=\"@+id/button1\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"customizeWatchApp\" />\n  </LinearLayout>\n\n  <Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Update Data\"\n    android:id=\"@+id/button3\"\n    android:layout_gravity=\"center\"\n    android:onClick=\"updateWatchApp\" />\n\n  <Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Change Units\"\n    android:id=\"@+id/button4\"\n    android:layout_gravity=\"center\"\n    android:onClick=\"changeUnitsOnWatch\" />\n\n</LinearLayout>\n\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/res/layout/activity_todo_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<com.mobeta.android.dslv.DragSortListView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:dslv=\"http://schemas.android.com/apk/res/com.example.PebbleKitExample\"\n  android:id=\"@android:id/list\"\n  android:layout_width=\"fill_parent\"\n  android:layout_height=\"fill_parent\"\n  android:layout_margin=\"3dp\"\n  android:choiceMode=\"multipleChoice\"\n  android:dividerHeight=\"1px\"\n  android:padding=\"3dp\"\n  dslv:click_remove_id=\"@id/click_remove\"\n  dslv:collapsed_height=\"1px\"\n  dslv:drag_enabled=\"true\"\n  dslv:drag_handle_id=\"@id/drag_handle\"\n  dslv:drag_scroll_start=\"0.33\"\n  dslv:drag_start_mode=\"onDown\"\n  dslv:float_alpha=\"0.6\"\n  dslv:remove_enabled=\"true\"\n  dslv:remove_mode=\"clickRemove\"\n  dslv:slide_shuffle_speed=\"0.3\" />"
  },
  {
    "path": "golf-demo/GolfDemo-Android/res/layout/activity_weather.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:orientation=\"vertical\"\n  android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n\n  <Button\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Update Weather\"\n    android:id=\"@+id/button\"\n    android:onClick=\"updateWeather\"/>\n\n</LinearLayout>"
  },
  {
    "path": "golf-demo/GolfDemo-Android/res/layout/checkable_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mobeta.android.dslv.DragSortListView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:dslv=\"http://schemas.android.com/apk/res/com.example.PebbleKitExample\"\n    android:id=\"@android:id/list\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"fill_parent\"\n    android:layout_margin=\"3dp\"\n    android:choiceMode=\"multipleChoice\"\n    android:dividerHeight=\"1px\"\n    android:padding=\"3dp\"\n    dslv:click_remove_id=\"@id/click_remove\"\n    dslv:collapsed_height=\"1px\"\n    dslv:drag_enabled=\"true\"\n    dslv:drag_handle_id=\"@id/drag_handle\"\n    dslv:drag_scroll_start=\"0.33\"\n    dslv:drag_start_mode=\"onDown\"\n    dslv:float_alpha=\"0.6\"\n    dslv:remove_enabled=\"true\"\n    dslv:remove_mode=\"clickRemove\"\n    dslv:slide_shuffle_speed=\"0.3\" />\n\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/res/layout/dialog_add_todo_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\" >\n    \n    <EditText\n        android:id=\"@+id/todo_list_add_item_dialog_description\"\n        android:inputType=\"text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"16dp\"\n        android:layout_marginLeft=\"4dp\"\n        android:layout_marginRight=\"4dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:hint=\"@string/todo_list_add_item_dialog_description_hint\" />\n\n</LinearLayout>"
  },
  {
    "path": "golf-demo/GolfDemo-Android/res/layout/list_item_checkable.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.example.PebbleKitExample.TodoList.CheckableLinearLayout\n  xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"fill_parent\"\n  android:layout_height=\"@dimen/item_height\"\n  android:orientation=\"horizontal\">\n  <ImageView\n    android:id=\"@id/drag_handle\"\n    android:background=\"@drawable/drag\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"@dimen/item_height\"\n    android:layout_weight=\"0\" />\n  <CheckedTextView\n    android:checkMark=\"?android:attr/listChoiceIndicatorMultiple\"\n    android:id=\"@+id/text\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"@dimen/item_height\"\n    android:layout_weight=\"1\"\n    android:textAppearance=\"?android:attr/textAppearanceMedium\"\n    android:gravity=\"center_vertical\"\n    android:paddingLeft=\"8dp\" />\n  <ImageView\n    android:id=\"@id/click_remove\"\n    android:background=\"@drawable/delete_x\"\n    android:layout_width=\"@dimen/item_height\"\n    android:layout_height=\"@dimen/item_height\"\n    android:layout_weight=\"0\" />\n</com.example.PebbleKitExample.TodoList.CheckableLinearLayout>\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/res/menu/options_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n  <!-- FIXME is there a way to avoid using the condensed titles here, perhaps by stacking the items? -->\n    <item android:id=\"@+id/add_mi\" android:title=\"Add\" android:visible=\"true\" android:enabled=\"true\" android:titleCondensed=\"+\"></item>\n    <item android:id=\"@+id/remove_all_checked_mi\" android:enabled=\"true\" android:titleCondensed=\"X\" android:title=\"Remove Checked\" android:visible=\"true\"></item>\n</menu>"
  },
  {
    "path": "golf-demo/GolfDemo-Android/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"item_height\">67dp</dimen>\n    <dimen name=\"section_div_height\">20dp</dimen>\n</resources>\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/res/values/dslv_attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<resources>\n  <declare-styleable name=\"DragSortListView\">\n    <attr name=\"collapsed_height\" format=\"dimension\" />\n    <attr name=\"drag_scroll_start\" format=\"float\" />\n    <attr name=\"max_drag_scroll_speed\" format=\"float\" />\n    <attr name=\"float_background_color\" format=\"color\" />\n    <attr name=\"remove_mode\">\n      <enum name=\"clickRemove\" value=\"0\" />\n      <enum name=\"flingRemove\" value=\"1\" />\n    </attr>\n    <attr name=\"track_drag_sort\" format=\"boolean\"/>\n    <attr name=\"float_alpha\" format=\"float\"/>\n    <attr name=\"slide_shuffle_speed\" format=\"float\"/>\n    <attr name=\"remove_animation_duration\" format=\"integer\"/>\n    <attr name=\"drop_animation_duration\" format=\"integer\"/>\n    <attr name=\"drag_enabled\" format=\"boolean\" />\n    <attr name=\"sort_enabled\" format=\"boolean\" />\n    <attr name=\"remove_enabled\" format=\"boolean\" />\n    <attr name=\"drag_start_mode\">\n      <enum name=\"onDown\" value=\"0\" />\n      <enum name=\"onMove\" value=\"1\" />\n      <enum name=\"onLongPress\" value=\"2\"/>\n    </attr>\n    <attr name=\"drag_handle_id\" format=\"integer\" />\n    <attr name=\"fling_handle_id\" format=\"integer\" />\n    <attr name=\"click_remove_id\" format=\"integer\" />\n    <attr name=\"use_default_controller\" format=\"boolean\" />\n  </declare-styleable>\n</resources>\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item type=\"id\" name=\"drag_handle\" />\n    <item type=\"id\" name=\"click_remove\" />\n</resources>\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"app_name\">ExamplePebbleKitActivity</string>\n  <string name=\"activity_golf\">Golf App Example</string>\n  <string name=\"activity_sports\">Sports App Example</string>\n  <string name=\"activity_weather\">Weather App Example</string>\n  <string name=\"activity_todo_list\">To-Do List Example</string>\n  <string-array name=\"jazz_artist_names\">\n      <item>Brad Mehldau</item>\n      <item>Joshua Redman</item>\n      <item>Chick Corea</item>\n      <item>Kurt Rosenwinkel</item>\n      <item>Miles Davis</item>\n      <item>Wayne Shorter</item>\n      <item>Michael Brecker</item>\n      <item>Herbie Hancock</item>\n      <item>Joe Zawinul</item>\n      <item>Brian Blade</item>\n      <item>Jeff Ballard</item>\n      <item>Larry Grenadier</item>\n      <item>Keith Jarrett</item>\n      <item>McCoy Tyner</item>\n      <item>Stephon Harris</item>\n      <item>Mark Turner</item>\n  </string-array>\n  <string name=\"todo_list_add_item_dialog_description_hint\">Short description</string>\n  <string name=\"todo_list_add_dialog_ok_button\">Append</string>\n  <string name=\"todo_list_add_dialog_cancel_button\">Cancel</string>\n  <string name=\"activity_sms\">Sms App Example</string>\n  <string name=\"activity_gcm\">GCM App Example</string>\n</resources>\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/settings.gradle",
    "content": "include ':app'\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/example/PebbleKitExample/ExampleGCMActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.content.SharedPreferences;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.nfc.NdefMessage;\nimport android.nfc.NdefRecord;\nimport android.nfc.NfcAdapter;\nimport android.nfc.NfcAdapter.*;\nimport android.nfc.NfcEvent;\nimport android.os.AsyncTask;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Message;\nimport android.os.Parcelable;\nimport android.text.format.Time;\n\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.google.android.gcm.GCMRegistrar;\n\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\n\nimport java.util.Random;\nimport java.util.UUID;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.IOException;\nimport java.nio.charset.Charset;\n\nimport org.apache.http.client.ClientProtocolException;\nimport org.apache.http.client.HttpClient;\nimport org.apache.http.client.methods.HttpPost;\nimport org.apache.http.entity.BasicHttpEntity;\nimport org.apache.http.HttpResponse;\nimport org.apache.http.impl.client.DefaultHttpClient;\n\n\n/**\n * Allows for sending messages between two Android-paired Pebbles via Google Cloud Messaging.\n * Uses NFC to exchange GCM registration IDs.\n *\n * Pressing a button on the Pebble running the companion app (app_vibrate_paired_pebble in watch examples) will\n * cause this to send a message via GCM to a phone paired via NFC.  That phone will use app_messages to\n * vibrate the Pebble it's paired with.\n *\n * @author matt.hornyak@getpebble.com\n *\n */\npublic class ExampleGCMActivity extends Activity implements CreateNdefMessageCallback,\n        OnNdefPushCompleteCallback {\n\n    AsyncTask<Void, Void, Void> mRegisterTask;\n\n    NfcAdapter mNfcAdapter;\n    private static final int MESSAGE_SENT = 1;\n\n    private final String TAG = \"ExampleGCMActivity\";\n    private final String PREF_GCM_ACTIVITY = \"pref_gcm\";\n    private final String PREF_PAIRED_ID = \"paired_gcm_id\";\n\n    static final String SENDER_ID = \"501014417325\";\n    static final String API_KEY = \"AIzaSyAg9KiFRSkQtvaOCA6ESesVawkmm7OnVUk\";\n\n    private final Random rand = new Random();\n    private final static UUID PEBBLE_APP_UUID = UUID.fromString(\"7BD103D3-0F87-4D31-AEF8-F5237A79C72E\");\n    private final static int MSG_CMD_OUT_KEY = 0x00;\n    private final static int MSG_CMD_IN_KEY = 0x01;\n\n    private final static int MSG_CMD_VIBRATE = 0x00;\n    private final static int MSG_CMD_UP = 0x01;\n\n    private PebbleKit.PebbleDataReceiver dataReceiver;\n\n    public static String myGcmId = \"\";\n    private String mPairedGcmId;\n    private TextView mInfoText;\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_gcm);\n\n        mInfoText = (TextView) findViewById(R.id.textGcmStatus);\n        loadPairedId();\n\n        if (mPairedGcmId != null && !mPairedGcmId.equals(\"\")) {\n            mInfoText.setText(\"Paired to another phone. Ready to use.\");\n        }  else {\n            mInfoText.setText(\"Run this Activity on the other phone you want to pair with, then tap them together.\");\n        }\n\n        // Check for available NFC Adapter\n        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);\n        if (mNfcAdapter == null) {\n            mInfoText.setText(\"NFC is not available on this device.\");\n        } else {\n            // Register callback to set NDEF message\n            mNfcAdapter.setNdefPushMessageCallback(this, this);\n            // Register callback to listen for message-sent success\n            mNfcAdapter.setOnNdefPushCompleteCallback(this, this);\n        }\n\n        // GCM\n\n        // Make sure the device has the proper dependencies.\n        GCMRegistrar.checkDevice(this);\n//        GCMRegistrar.checkManifest(this);\n\n        final String regId = GCMRegistrar.getRegistrationId(this);\n        if (regId.equals(\"\")) {\n            // Automatically registers application on startup.\n            GCMRegistrar.register(this, SENDER_ID);\n        } else {\n            myGcmId = regId;\n            // Device is already registered on GCM, check server.\n            if (!GCMRegistrar.isRegisteredOnServer(this)) {\n                GCMRegistrar.setRegisteredOnServer(this, true);\n            }\n        }\n\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (dataReceiver != null) {\n            unregisterReceiver(dataReceiver);\n            dataReceiver = null;\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        // In order to interact with the UI thread from a broadcast receiver, we need to perform any updates through\n        // an Android handler. For more information, see: http://developer.android.com/reference/android/os/Handler.html\n\n        // To receive data back from the app, android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        //\n        // In this example, we're registering a receiver to listen for\n        // button presses sent from the watch\n\n        dataReceiver = new PebbleKit.PebbleDataReceiver(PEBBLE_APP_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                final int cmd = data.getUnsignedInteger(MSG_CMD_IN_KEY).intValue();\n\n                mHandler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        // All data received from the Pebble must be ACK'd, otherwise you'll hit time-outs in the\n                        // watch-app which will cause the watch to feel \"laggy\" during periods of frequent\n                        // communication.\n                        PebbleKit.sendAckToPebble(context, transactionId);\n\n                        switch (cmd) {\n                            // send GCM message when the up button is pressed\n                            case MSG_CMD_UP:\n                                sendGCMMessageToPairedDevice();\n                                break;\n                            default:\n                                break;\n                        }\n                    }\n                });\n            }\n        };\n        PebbleKit.registerReceivedDataHandler(this, dataReceiver);\n        startWatchApp(getApplicationContext());\n\n        // Check to see that the Activity started due to an Android Beam\n        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {\n            processIntent(getIntent());\n        }\n    }\n\n    protected void onDestroy() {\n        GCMRegistrar.onDestroy(this);\n        super.onDestroy();\n    }\n\n    @Override\n    public void onNewIntent(Intent intent) {\n        // onResume gets called after this to handle the intent\n        setIntent(intent);\n    }\n\n    /**\n     * On an NFC tap, retrieve the GCM ID of the other device & save it\n     */\n    void processIntent(Intent intent) {\n        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(\n                NfcAdapter.EXTRA_NDEF_MESSAGES);\n\n        NdefMessage msg = (NdefMessage) rawMsgs[0];\n        // record 0 contains the MIME type, record 1 is the AAR, if present\n        String otherDeviceId = new String(msg.getRecords()[0].getPayload());\n        mInfoText.setText(\"Paired successfully. Pressing the up button on your Pebble while running the app will now vibrate the Pebble paired to that phone.\");\n\n        setPairedId(otherDeviceId);\n        sendGCMMessageToPairedDevice();\n    }\n\n    public NdefMessage createNdefMessage(NfcEvent event) {\n        Time time = new Time();\n        time.setToNow();\n        String text;\n        if (ExampleGCMActivity.myGcmId.equals(\"\")) {\n            text = \"NO-GCM-ID\";\n        } else {\n            text = ExampleGCMActivity.myGcmId;\n        }\n        NdefMessage msg = new NdefMessage(\n                new NdefRecord[] { createMimeRecord(\n                        \"application/com.example.android.beam\", text.getBytes())\n                });\n        return msg;\n    }\n\n    /**\n     * Creates a custom MIME type encapsulated in an NDEF record\n     *\n     * @param mimeType\n     */\n    public NdefRecord createMimeRecord(String mimeType, byte[] payload) {\n        byte[] mimeBytes = mimeType.getBytes(Charset.forName(\"US-ASCII\"));\n        NdefRecord mimeRecord = new NdefRecord(\n                NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload);\n        return mimeRecord;\n    }\n\n    /**\n     * Implementation for the OnNdefPushCompleteCallback interface\n     */\n    @Override\n    public void onNdefPushComplete(NfcEvent arg0) {\n        // A handler is needed to send messages to the activity when this\n        // callback occurs, because it happens from a binder thread\n        mHandler.obtainMessage(MESSAGE_SENT).sendToTarget();\n    }\n\n    /** This handler receives a message from onNdefPushComplete */\n    private final Handler mHandler = new Handler() {\n        @Override\n        public void handleMessage(Message msg) {\n            switch (msg.what) {\n                case MESSAGE_SENT:\n                    Toast.makeText(getApplicationContext(), \"GCM id sent\", Toast.LENGTH_LONG).show();\n                    break;\n            }\n        }\n    };\n\n    protected void loadPairedId() {\n        SharedPreferences settings = getSharedPreferences(PREF_GCM_ACTIVITY, 0);\n        mPairedGcmId = settings.getString(PREF_PAIRED_ID, null);\n    }\n\n    protected void setPairedId(String id) {\n        mPairedGcmId = id;\n        SharedPreferences settings = getSharedPreferences(PREF_GCM_ACTIVITY, 0);\n        SharedPreferences.Editor editor = settings.edit();\n        editor.putString(PREF_PAIRED_ID, mPairedGcmId);\n\n        editor.commit();\n    }\n\n    private void sendGCMMessageToPairedDevice() {\n        HttpClient httpclient = new DefaultHttpClient();\n\n        HttpPost httppost = new HttpPost(\"https://android.googleapis.com/gcm/send\");\n        httppost.setHeader(\"Authorization\", \"key=\" + API_KEY);\n        httppost.setHeader(\"Content-Type\", \"application/json\");\n\n        try {\n            String reqBody = String.format(\"{\\\"registration_ids\\\" : [\\\"%s\\\"],\\\"data\\\" : { \\\"hi\\\":\\\"pebble\\\"}}\", mPairedGcmId);\n            BasicHttpEntity e = new BasicHttpEntity();\n\n            ByteArrayInputStream is = new ByteArrayInputStream(reqBody.getBytes());\n            e.setContent(is);\n            httppost.setEntity(e);\n//            Log.e(TAG, \"Data being sent via push : \" + reqBody);\n\n            HttpResponse response = httpclient.execute(httppost);\n\n            Log.e(TAG, response.toString());\n        } catch (ClientProtocolException e) {\n            Log.e(TAG, e.getMessage());\n        } catch (IOException e) {\n            Log.e(TAG, e.getMessage());\n        }\n    }\n\n    public static void vibrateWatch(Context c) {\n        ExampleGCMActivity.startWatchApp(c);\n        PebbleDictionary data = new PebbleDictionary();\n        data.addUint8(MSG_CMD_OUT_KEY, (byte) MSG_CMD_VIBRATE);\n        PebbleKit.sendDataToPebble(c, PEBBLE_APP_UUID, data);\n    }\n\n    // Send a broadcast to launch the specified application on the connected Pebble\n    public static void startWatchApp(Context c) {\n        PebbleKit.startAppOnPebble(c, PEBBLE_APP_UUID);\n    }\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/example/PebbleKitExample/ExampleGolfActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.view.View;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.getpebble.android.kit.Constants;\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\n\nimport java.util.Random;\n\n/**\n * Sample code demonstrating how Android applications can send+receive data using the 'Golf' app,\n * one of Pebble's built-in sports watch-apps.\n */\npublic class ExampleGolfActivity extends Activity {\n\n    private final Random rand = new Random();\n    private PebbleKit.PebbleDataReceiver dataReceiver;\n    private int appData[][] = new int[18][4];\n    private int selection = 0;\n\n    // Generate random (but somewhat believable) values to be displayed on the watch.\n    private void generateGolfData() {\n        for (int i = 0; i < appData.length; ++i) {\n            int backDistance = rand.nextInt(800) + 50;\n            appData[i][0] = 1 + rand.nextInt(5); // par\n            appData[i][1] = backDistance; // back of the green\n            appData[i][2] = backDistance - 15; // middle of the green\n            appData[i][3] = backDistance - 30; // front of the green\n        }\n    }\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_golf);\n        generateGolfData();\n        selection = 0;\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (dataReceiver != null) {\n            unregisterReceiver(dataReceiver);\n            dataReceiver = null;\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n\n        updateUi();\n\n        // In order to interact with the UI thread from a broadcast receiver, we need to perform any updates through\n        // an Android handler. For more information, see: http://developer.android.com/reference/android/os/Handler.html\n        final Handler handler = new Handler();\n\n        // To receive data back from the sports watch-app, android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        //\n        // In this example, we're registering a receiver to listen for\n        // button presses sent from the watch, allowing us to page\n        // through the holes displayed on the phone and watch.\n        dataReceiver = new PebbleKit.PebbleDataReceiver(Constants.GOLF_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                final int cmd = data.getUnsignedInteger(Constants.GOLF_CMD_KEY).intValue();\n\n                handler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        // All data received from the Pebble must be ACK'd, otherwise you'll hit time-outs in the\n                        // watch-app which will cause the watch to feel \"laggy\" during periods of frequent\n                        // communication.\n                        PebbleKit.sendAckToPebble(context, transactionId);\n\n                        switch (cmd) {\n                            case Constants.GOLF_CMD_NEXT:\n                                next();\n                                break;\n                            case Constants.GOLF_CMD_PREV:\n                                previous();\n                                break;\n                            case Constants.GOLF_CMD_SELECT:\n                                Toast.makeText(context,  \"Golf app's select button was pressed\", Toast.LENGTH_LONG).show();\n                                break;\n                        }\n                    }\n                });\n            }\n        };\n        PebbleKit.registerReceivedDataHandler(this, dataReceiver);\n    }\n\n    // Send a broadcast to launch the specified application on the connected Pebble\n    public void startWatchApp(View view) {\n        PebbleKit.startAppOnPebble(getApplicationContext(), Constants.GOLF_UUID);\n    }\n\n    // Send a broadcast to close the specified application on the connected Pebble\n    public void stopWatchApp(View view) {\n        PebbleKit.closeAppOnPebble(getApplicationContext(), Constants.GOLF_UUID);\n    }\n\n    // A custom icon and name can be applied to the golf-app to\n    // provide some support for \"branding\" your Pebble-enabled sports\n    // application on the watch.\n    //\n    // It is recommended that applications customize the sports\n    // application before launching it. Only one application may\n    // customize the sports application at a time on a first-come,\n    // first-serve basis.\n    public void customizeWatchApp(View view) {\n        final String customAppName = \"My Golf App\";\n        final Bitmap customIcon = BitmapFactory.decodeResource(getResources(), R.drawable.watch);\n\n        PebbleKit.customizeWatchApp(\n                getApplicationContext(), Constants.PebbleAppType.GOLF, customAppName, customIcon);\n    }\n\n    // Update the Activity with the data for a given hole\n    public void updateUi() {\n        int holeInfo[] = appData[selection];\n\n        String holePar = String.format(\"Hole: %d Par: %d\", selection + 1, holeInfo[0]);\n        String back = String.format(\"%d\", holeInfo[1]);\n        String mid = String.format(\"%d\", holeInfo[2]);\n        String front = String.format(\"%d\", holeInfo[3]);\n\n        TextView parText = (TextView) findViewById(R.id.textHole);\n        parText.setText(holePar);\n\n        TextView backText = (TextView) findViewById(R.id.textBack);\n        backText.setText(back);\n\n        TextView midText = (TextView) findViewById(R.id.textMiddle);\n        midText.setText(mid);\n\n        TextView frontText = (TextView) findViewById(R.id.textFront);\n        frontText.setText(front);\n    }\n\n    // Push {range, hole, par} data to be displayed on Pebble's Golf app.\n    // To simplify formatting, values are transmitted to Pebble as null-terminated strings.\n    public void updateWatch() {\n        int holeInfo[] = appData[selection];\n\n        String hole = String.format(\"%d\", selection + 1);\n        String par = String.format(\"%d\", holeInfo[0]);\n        String back = String.format(\"%d\", holeInfo[1]);\n        String mid = String.format(\"%d\", holeInfo[2]);\n        String front = String.format(\"%d\", holeInfo[3]);\n\n        // All data sent handled by PebbleKit is wrapped in a PebbleDictionary. The interface is somewhat similar to\n        // Map<Integer, Object>, as PebbleDictionaries may contain heterogeneous types.\n        //\n        // Here we are building up a Dictionary that maps integer keys to String values that will be interpreted &\n        // displayed by the watch.\n        PebbleDictionary data = new PebbleDictionary();\n        data.addString(Constants.GOLF_HOLE_KEY, hole);\n        data.addString(Constants.GOLF_PAR_KEY, par);\n        data.addString(Constants.GOLF_BACK_KEY, back);\n        data.addString(Constants.GOLF_MID_KEY, mid);\n        data.addString(Constants.GOLF_FRONT_KEY, front);\n\n        // Once the dictionary has been populated, it is scheduled to be sent to the watch. The sender/recipient of\n        // all PebbleKit messages is determined by the UUID. In this case, since we're sending the data to the golf app,\n        // we specify the Golf UUID.\n        PebbleKit.sendDataToPebble(getApplicationContext(), Constants.GOLF_UUID, data);\n    }\n\n    private void previous() {\n        if (selection > 0) {\n            selection -= 1;\n        }\n\n        updateUi();\n        updateWatch();\n    }\n\n    public void goPrevious(View view) {\n        previous();\n    }\n\n    public void next() {\n        if (selection < 17) {\n            selection += 1;\n        }\n\n        updateUi();\n        updateWatch();\n    }\n\n    public void goNext(View view) {\n        next();\n    }\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/example/PebbleKitExample/ExampleSmsActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.database.Cursor;\nimport android.location.*;\nimport android.telephony.PhoneNumberUtils;\nimport android.text.format.DateUtils;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.provider.ContactsContract;\nimport android.provider.ContactsContract.Contacts;\nimport android.provider.ContactsContract.CommonDataKinds.Phone;\nimport android.telephony.SmsManager;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.EditText;\n\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\n\nimport java.util.Random;\nimport java.util.UUID;\nimport java.util.List;\n\n/**\n * Sample activity that sends an SMS containing the user's location when the user presses a button on the watch *\n */\npublic class ExampleSmsActivity extends Activity {\n\n    private final String TAG = \"ExampleSmsActivity\";\n    private final String PREF_SMS_ACTIVITY = \"pref_sms\";\n    private final String PREF_NUMBER = \"phone_number\";\n\n    private final Random rand = new Random();\n    private final static UUID PEBBLE_APP_UUID = UUID.fromString(\"EC7EE5C6-8DDF-4089-AA84-C3396A11CC95\");\n    private final static int CMD_KEY = 0x00;\n    private final static int CMD_UP = 0x01;\n\n    private final static int REQUEST_CONTACT = 0x01;\n\n    private PebbleKit.PebbleDataReceiver dataReceiver;\n\n    private LocationManager mLocationManager;\n    private String mProviderName;\n    private Handler mHandler;\n\n    private boolean mLocationPending;\n\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_sms);\n\n        // allocate instance of the LocationManager\n        mLocationManager =\n                (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);\n\n        Criteria criteria = new Criteria();\n        criteria.setAccuracy(Criteria.ACCURACY_FINE);\n        criteria.setCostAllowed(false);\n\n        mProviderName = mLocationManager.getBestProvider(criteria, true);\n\n        mHandler = new Handler();\n\n        loadLastNumber();\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (dataReceiver != null) {\n            unregisterReceiver(dataReceiver);\n            dataReceiver = null;\n        }\n\n        mLocationManager.removeUpdates(mLocationListener);\n        saveLastNumber();\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        // In order to interact with the UI thread from a broadcast receiver, we need to perform any updates through\n        // an Android handler. For more information, see: http://developer.android.com/reference/android/os/Handler.html\n\n        // To receive data back from the app, android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        //\n        // In this example, we're registering a receiver to listen for\n        // button presses sent from the watch\n\n        dataReceiver = new PebbleKit.PebbleDataReceiver(PEBBLE_APP_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                final int cmd = data.getUnsignedInteger(CMD_KEY).intValue();\n\n                mHandler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        // All data received from the Pebble must be ACK'd, otherwise you'll hit time-outs in the\n                        // watch-app which will cause the watch to feel \"laggy\" during periods of frequent\n                        // communication.\n                        PebbleKit.sendAckToPebble(context, transactionId);\n\n                        switch (cmd) {\n                            // send SMS when the up button is pressed\n                            case CMD_UP:\n                                requestLocationForSms();\n                                break;\n                            default:\n                                break;\n                        }\n                    }\n                });\n            }\n        };\n        PebbleKit.registerReceivedDataHandler(this, dataReceiver);\n        startWatchApp(null);\n    }\n\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        if (resultCode == RESULT_OK) {\n            if(data != null && requestCode == REQUEST_CONTACT) {\n                Uri uriOfPhoneNumberRecord = data.getData();\n                String idOfPhoneRecord = uriOfPhoneNumberRecord.getLastPathSegment();\n                Cursor cursor = getContentResolver().query(Phone.CONTENT_URI, new String[]{Phone.NUMBER}, Phone._ID + \"=?\", new String[]{idOfPhoneRecord}, null);\n                if(cursor != null) {\n                    if(cursor.getCount() > 0) {\n                        cursor.moveToFirst();\n                        String formattedPhoneNumber = cursor.getString( cursor.getColumnIndex(Phone.NUMBER) );\n                        if (formattedPhoneNumber != null) {\n                            EditText destinationEditText = (EditText)findViewById(R.id.destinationNumber);\n                            destinationEditText.setText(PhoneNumberUtils.stripSeparators(formattedPhoneNumber));\n                        }\n                    }\n                    cursor.close();\n                }\n            }\n        }\n    }\n\n    public void pickContact(View view) {\n        Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);\n        intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);\n        startActivityForResult(intent, 1);\n    }\n\n    protected void loadLastNumber() {\n        SharedPreferences settings = getSharedPreferences(PREF_SMS_ACTIVITY, 0);\n        String number = settings.getString(PREF_NUMBER, \"\");\n\n        EditText destinationEditText = (EditText)findViewById(R.id.destinationNumber);\n        destinationEditText.setText(number);\n    }\n\n    protected void saveLastNumber() {\n        EditText destinationEditText = (EditText)findViewById(R.id.destinationNumber);\n        String destinationNumber = destinationEditText.getText().toString();\n        if (destinationNumber == null || destinationNumber.equals(\"\")) {\n            return;\n        }\n\n        SharedPreferences settings = getSharedPreferences(PREF_SMS_ACTIVITY, 0);\n        SharedPreferences.Editor editor = settings.edit();\n        editor.putString(PREF_NUMBER, destinationNumber);\n\n        editor.commit();\n    }\n\n    // Send a broadcast to launch the specified application on the connected Pebble\n    public void startWatchApp(View view) {\n        PebbleKit.startAppOnPebble(getApplicationContext(), PEBBLE_APP_UUID);\n    }\n\n    // Send a broadcast to close the specified application on the connected Pebble\n    public void stopWatchApp(View view) {\n        PebbleKit.closeAppOnPebble(getApplicationContext(), PEBBLE_APP_UUID);\n    }\n\n    private final LocationListener mLocationListener = new LocationListener() {\n        @Override\n        public void onLocationChanged(Location location) {\n            sendLocationSms(location);\n            mLocationManager.removeUpdates(this);\n        }\n\n        @Override\n        public void onStatusChanged(String provider, int status, Bundle bundle) {\n            Log.e(TAG, \"onStatusChanged\");\n        }\n\n        @Override\n        public void onProviderEnabled(String provider) {\n            Log.e(TAG, \"onProviderEnabled\");\n        }\n\n        @Override\n        public void onProviderDisabled(String provider) {\n            Log.e(TAG, \"onProviderDisabled\");\n        }\n    };\n\n    public void requestLocationForSms() {\n        if (mProviderName != null && mLocationPending == false) {\n            mLocationPending = true;\n\n            Location lastLocation = mLocationManager.getLastKnownLocation(mProviderName);\n             // if we have a location that's newer than 10 minutes, use it; otherwise get a new location\n            if (lastLocation != null && (System.currentTimeMillis() - lastLocation.getTime() > DateUtils.MINUTE_IN_MILLIS * 10)) {\n                mLocationManager.requestLocationUpdates(mProviderName,\n                    10000,\n                    10,\n                    mLocationListener);\n            } else {\n                 sendLocationSms(lastLocation);\n            }\n        }\n    }\n\n    public void sendLocationSms(Location l) {\n        if (mLocationPending) {\n            mLocationPending = false;\n\n            EditText destinationEditText = (EditText)findViewById(R.id.destinationNumber);\n            String destinationNumber = destinationEditText.getText().toString();\n            if (destinationNumber == null || destinationNumber.equals(\"\")) {\n                return;\n            }\n\n            // send SMS with GPS coordinates\n            SmsManager smsManager = SmsManager.getDefault();\n            String locationString = \"Get me: \" + l.getLatitude() + \", \" + l.getLongitude();\n            smsManager.sendTextMessage(destinationNumber, null, locationString, null, null);\n\n            // get address text if we can\n            Geocoder geocoder = new Geocoder(ExampleSmsActivity.this);\n\n            try {\n                List<Address> addresses = geocoder.getFromLocation(l.getLatitude(), l.getLongitude(), 1);\n\n                if (addresses.size() > 0) {\n                    Address a = addresses.get(0);\n                    String addressText = \"\";\n                    for (int i = 0; i <= a.getMaxAddressLineIndex(); i++) {\n                        addressText += a.getAddressLine(i) + \" \";\n                    }\n                    vibrateWatch(getApplicationContext());\n                    smsManager.sendTextMessage(destinationNumber, null, addressText, null, null);\n                }\n            } catch (Exception e) {\n                // unable to geocode\n            }\n        }\n    }\n\n    public static void vibrateWatch(Context c) {\n        PebbleDictionary data = new PebbleDictionary();\n        data.addUint8(CMD_KEY, (byte) CMD_UP);\n        PebbleKit.sendDataToPebble(c, PEBBLE_APP_UUID, data);\n    }\n\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/example/PebbleKitExample/ExampleSportsActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.view.View;\nimport android.widget.TextView;\nimport com.getpebble.android.kit.Constants;\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\n\nimport java.util.Random;\n\n/**\n * Sample code demonstrating how Android applications can send+receive data using the 'Sports' app, one of Pebble's\n * built-in watch-apps that supports app messaging.\n */\npublic class ExampleSportsActivity extends Activity {\n\n    private static final String TAG = \"ExampleSportsActivity\";\n\n    private final Random rand = new Random();\n    private PebbleKit.PebbleDataReceiver sportsDataHandler = null;\n    private int sportsState = Constants.SPORTS_STATE_INIT;\n    private boolean useMetric = false;\n    private boolean isPaceLabel = true;\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_sports);\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (sportsDataHandler != null) {\n            unregisterReceiver(sportsDataHandler);\n            sportsDataHandler = null;\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        final Handler handler = new Handler();\n\n        // To receive data back from the sports watch-app, Android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        //\n        // In this example, we're registering a receiver to listen for\n        // changes in the activity state sent from the watch, allowing\n        // us the pause/resume the activity when the user presses a\n        // button in the watch-app.\n        sportsDataHandler = new PebbleKit.PebbleDataReceiver(Constants.SPORTS_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                int newState = data.getUnsignedInteger(Constants.SPORTS_STATE_KEY).intValue();\n                sportsState = newState;\n\n                PebbleKit.sendAckToPebble(context, transactionId);\n\n                handler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        updateUi();\n                    }\n                });\n            }\n        };\n        PebbleKit.registerReceivedDataHandler(this, sportsDataHandler);\n    }\n\n    public void updateUi() {\n        TextView statusText = (TextView) findViewById(R.id.status);\n        if (sportsState == Constants.SPORTS_STATE_RUNNING) {\n            statusText.setText(\"Running\");\n        } else {\n            statusText.setText(\"Paused\");\n        }\n    }\n\n    // Send a broadcast to launch the specified application on the connected Pebble\n    public void startWatchApp(View view) {\n        PebbleKit.startAppOnPebble(getApplicationContext(), Constants.SPORTS_UUID);\n    }\n\n    // Send a broadcast to close the specified application on the connected Pebble\n    public void stopWatchApp(View view) {\n        PebbleKit.closeAppOnPebble(getApplicationContext(), Constants.SPORTS_UUID);\n    }\n\n    // A custom icon and name can be applied to the sports-app to\n    // provide some support for \"branding\" your Pebble-enabled sports\n    // application on the watch.\n    //\n    // It is recommended that applications customize the sports\n    // application before launching it. Only one application may\n    // customize the sports application at a time on a first-come,\n    // first-serve basis.\n    public void customizeWatchApp(View view) {\n        final String customAppName = \"My Sports App\";\n        final Bitmap customIcon = BitmapFactory.decodeResource(getResources(), R.drawable.watch);\n\n        PebbleKit.customizeWatchApp(\n                getApplicationContext(), Constants.PebbleAppType.SPORTS, customAppName, customIcon);\n    }\n\n    // Push (distance, time, pace) data to be displayed on Pebble's Sports app.\n    //\n    // To simplify formatting, values are transmitted to the watch as strings.\n    public void updateWatchApp(View view) {\n        String time = String.format(\"%02d:%02d\", rand.nextInt(60), rand.nextInt(60));\n        String distance = String.format(\"%02.02f\", 32 * rand.nextDouble());\n\tString addl_data = String.format(\"%02d:%02d\", rand.nextInt(10), rand.nextInt(60));\n\n        PebbleDictionary data = new PebbleDictionary();\n        data.addString(Constants.SPORTS_TIME_KEY, time);\n        data.addString(Constants.SPORTS_DISTANCE_KEY, distance);\n\tdata.addString(Constants.SPORTS_DATA_KEY, addl_data);\n\tdata.addUint8(Constants.SPORTS_LABEL_KEY, (byte) (isPaceLabel ? Constants.SPORTS_DATA_SPEED : Constants.SPORTS_DATA_PACE));\n\n        PebbleKit.sendDataToPebble(getApplicationContext(), Constants.SPORTS_UUID, data);\n\tisPaceLabel = !isPaceLabel;\n    }\n\n    // The units in the sports app can be toggled between Metric (1) and Imperial (0)\n    // by sending the following message to Pebble once the sports app is running.\n    public void changeUnitsOnWatch(View view) {\n        PebbleDictionary data = new PebbleDictionary();\n        data.addUint8(Constants.SPORTS_UNITS_KEY,\n                (byte) (useMetric ? Constants.SPORTS_UNITS_METRIC : Constants.SPORTS_UNITS_IMPERIAL));\n\n        PebbleKit.sendDataToPebble(getApplicationContext(), Constants.SPORTS_UUID, data);\n        useMetric = !useMetric;\n    }\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/example/PebbleKitExample/ExampleWeatherActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.location.Location;\nimport android.location.LocationListener;\nimport android.location.LocationManager;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.View;\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\nimport org.json.JSONObject;\n\nimport java.io.BufferedReader;\nimport java.io.InputStreamReader;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.util.UUID;\n\n/**\n * Sample activity demonstrating how to send data to a \"weather\" watch-app.\n *\n * The watch-app in question is available here:\n * https://github.com/pebble/pebble-apps/tree/master/demos/feature_app_messages\n *\n * @author zulak@getpebble.com\n */\npublic class ExampleWeatherActivity extends Activity {\n    // the tuple key corresponding to the weather icon displayed on the watch\n    private static final int ICON_KEY = 0;\n    // the tuple key corresponding to the temperature displayed on the watch\n    private static final int TEMP_KEY = 1;\n    // This UUID identifies the weather app\n    private static final UUID WEATHER_UUID = UUID.fromString(\"42c86ea4-1c3e-4a07-b889-2cccca914198\");\n\n    private LocationManager mLocationManager;\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_weather);\n        mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);\n    }\n\n    public void updateWeather(View view) {\n        // when this button is clicked, get the handset's approximate location and request weather data from a\n        // third-party web service\n        LocationListener locationListener = new LocationListener() {\n            public void onLocationChanged(Location location) {\n                mLocationManager.removeUpdates(this);\n                doWeatherUpdate(location);\n            }\n\n            public void onStatusChanged(String provider, int status, Bundle extras) {\n            }\n\n            public void onProviderEnabled(String provider) {\n            }\n\n            public void onProviderDisabled(String provider) {\n            }\n        };\n\n        mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);\n    }\n\n    public void sendWeatherDataToWatch(int weatherIconId, int temperatureCelsius) {\n        // Build up a Pebble dictionary containing the weather icon and the current temperature in degrees celsius\n        PebbleDictionary data = new PebbleDictionary();\n        data.addUint8(ICON_KEY, (byte) weatherIconId);\n        data.addString(TEMP_KEY, String.format(\"%d\\u00B0C\", temperatureCelsius));\n\n        // Send the assembled dictionary to the weather watch-app; this is a no-op if the app isn't running or is not\n        // installed\n        PebbleKit.sendDataToPebble(getApplicationContext(), WEATHER_UUID, data);\n    }\n\n    public void doWeatherUpdate(Location location) {\n        // A very sketchy, rough way of getting the local weather forecast from the phone's approximate location\n        // using the OpenWeatherMap webservice: http://openweathermap.org/wiki/API/JSON_API\n        double latitude = location.getLatitude();\n        double longitude = location.getLongitude();\n\n        try {\n            URL u = new URL(String.format(\"http://api.openweathermap.org/data/2.1/find/city?lat=%f&lon=%f&cnt=1\",\n                    latitude,\n                    longitude));\n\n            HttpURLConnection urlConnection = (HttpURLConnection) u.openConnection();\n            try {\n                BufferedReader reader =\n                        new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), \"UTF-8\"));\n                String json = reader.readLine();\n\n                JSONObject jsonObject = new JSONObject(json);\n                JSONObject l = jsonObject.getJSONArray(\"list\").getJSONObject(0);\n                JSONObject m = l.getJSONObject(\"main\");\n                double temperature = m.getDouble(\"temp\");\n                int wtype = l.getJSONArray(\"weather\").getJSONObject(0).getInt(\"id\");\n\n                int weatherIcon = getIconFromWeatherId(wtype);\n                int temp = (int) (temperature - 273.15);\n\n                sendWeatherDataToWatch(weatherIcon, temp);\n            } finally {\n                urlConnection.disconnect();\n            }\n\n            Log.d(\"WeatherActivity\", String.format(\"%f, %f\", latitude, longitude));\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    private int getIconFromWeatherId(int weatherId) {\n        if (weatherId < 600) {\n            return 2;\n        } else if (weatherId < 700) {\n            return 3;\n        } else if (weatherId > 800) {\n            return 1;\n        } else {\n            return 0;\n        }\n    }\n\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/example/PebbleKitExample/GCMIntentService.java",
    "content": "\npackage com.example.PebbleKitExample;\n\nimport android.app.Notification;\nimport android.app.NotificationManager;\nimport android.app.PendingIntent;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.util.Log;\n\nimport com.google.android.gcm.GCMBaseIntentService;\nimport com.google.android.gcm.GCMRegistrar;\n\n/**\n * IntentService responsible for handling GCM messages.\n */\npublic class GCMIntentService extends GCMBaseIntentService {\n\n    @SuppressWarnings(\"hiding\")\n    private static final String TAG = \"GCMIntentService\";\n\n    public GCMIntentService() {\n        super(ExampleGCMActivity.SENDER_ID);\n    }\n\n    @Override\n    protected void onRegistered(Context context, String registrationId) {\n        Log.i(TAG, \"Device registered: regId = \" + registrationId);\n        ExampleGCMActivity.myGcmId = registrationId;\n        GCMRegistrar.setRegisteredOnServer(context, true);\n    }\n\n    @Override\n    protected void onUnregistered(Context context, String registrationId) {\n         Log.i(TAG, \"Ignoring unregister callback\");\n    }\n\n    @Override\n    protected void onMessage(Context context, Intent intent) {\n        Log.i(TAG, \"Received message\");\n//        generateNotification(context, \"GCM message received!\");\n        vibrateWatch(context);\n    }\n\n    @Override\n    protected void onDeletedMessages(Context context, int total) {\n        Log.i(TAG, \"Received deleted messages notification\");\n    }\n\n    @Override\n    public void onError(Context context, String errorId) {\n        Log.i(TAG, \"Received error: \" + errorId);\n    }\n\n    @Override\n    protected boolean onRecoverableError(Context context, String errorId) {\n        // log message\n        Log.i(TAG, \"Received recoverable error: \" + errorId);\n        return super.onRecoverableError(context, errorId);\n    }\n\n    /**\n     * Issues a notification to inform the user that server has sent a message.\n     */\n    private static void generateNotification(Context context, String message) {\n        int icon = R.drawable.watch;\n        long when = System.currentTimeMillis();\n        NotificationManager notificationManager = (NotificationManager)\n                context.getSystemService(Context.NOTIFICATION_SERVICE);\n        Notification notification = new Notification(icon, message, when);\n        String title = context.getString(R.string.app_name);\n        Intent notificationIntent = new Intent(context, ExampleGCMActivity.class);\n        // set intent so it does not start a new activity\n        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |\n                Intent.FLAG_ACTIVITY_SINGLE_TOP);\n        PendingIntent intent =\n                PendingIntent.getActivity(context, 0, notificationIntent, 0);\n        notification.setLatestEventInfo(context, title, message, intent);\n        notification.flags |= Notification.FLAG_AUTO_CANCEL;\n        notificationManager.notify(0, notification);\n    }\n\n    private void vibrateWatch(Context c) {\n        ExampleGCMActivity.vibrateWatch(c);\n    }\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/example/PebbleKitExample/MainActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.R;\nimport android.app.ListActivity;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.view.View;\nimport android.widget.ArrayAdapter;\nimport android.widget.ListView;\nimport com.example.PebbleKitExample.TodoList.ExampleTodoListActivity;\n\npublic class MainActivity extends ListActivity {\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        String[] menu = {\n                \"Sports App Example\",\n                \"Golf App Example\",\n                \"Weather App Example\",\n                \"To-Do List Example\",\n                \"GPS/SMS App Example\",\n                \"GCM Activity\"\n        };\n\n        setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_1, menu));\n    }\n\n    @Override\n    protected void onListItemClick(final ListView l, final View v, final int position, final long id) {\n        Intent intent = null;\n        switch (position) {\n            case 0:\n                intent = new Intent(this, ExampleSportsActivity.class);\n                break;\n            case 1:\n                intent = new Intent(this, ExampleGolfActivity.class);\n                break;\n            case 2:\n                intent = new Intent(this, ExampleWeatherActivity.class);\n                break;\n            case 3:\n                intent = new Intent(this, ExampleTodoListActivity.class);\n                break;\n            case 4:\n                intent = new Intent(this, ExampleSmsActivity.class);\n                break;\n            case 5:\n                intent = new Intent(this, ExampleGCMActivity.class);\n                break;\n        }\n\n        if (intent != null) {\n            startActivity(intent);\n        }\n    }\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/example/PebbleKitExample/TodoList/CheckableLinearLayout.java",
    "content": "package com.example.PebbleKitExample.TodoList;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.widget.Checkable;\nimport android.widget.LinearLayout;\n\npublic class CheckableLinearLayout extends LinearLayout implements Checkable {\n\n    private static final int CHECKABLE_CHILD_INDEX = 1;\n    private Checkable child;\n\n    public CheckableLinearLayout(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    @Override\n    protected void onFinishInflate() {\n        super.onFinishInflate();\n        child = (Checkable) getChildAt(CHECKABLE_CHILD_INDEX);\n    }\n\n    @Override\n    public boolean isChecked() {\n        return child.isChecked();\n    }\n\n    @Override\n    public void setChecked(boolean checked) {\n        child.setChecked(checked);\n    }\n\n    @Override\n    public void toggle() {\n        child.toggle();\n    }\n\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/example/PebbleKitExample/TodoList/ExampleTodoListActivity.java",
    "content": "package com.example.PebbleKitExample.TodoList;\n\nimport android.app.AlertDialog;\nimport android.app.Dialog;\nimport android.app.ListActivity;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.os.*;\nimport android.util.Log;\nimport android.view.*;\nimport android.widget.AdapterView;\nimport android.widget.EditText;\nimport com.example.PebbleKitExample.R;\nimport com.getpebble.android.kit.PebbleKit;\n import com.getpebble.android.kit.util.PebbleDictionary;\nimport com.mobeta.android.dslv.DragSortListView;\n\nimport java.util.HashSet;\nimport java.util.UUID;\nimport java.util.concurrent.BlockingQueue;\nimport java.util.concurrent.LinkedBlockingQueue;\n\n/**\n * Sample activity demonstrating how to synchronize data with a \"To-Do List\" watch-app.\n */\npublic class ExampleTodoListActivity extends ListActivity {\n    private PebbleKit.PebbleDataReceiver dataReceiver;\n    private PebbleKit.PebbleAckReceiver ackReceiver;\n    private PebbleKit.PebbleNackReceiver nackReceiver;\n\n    private static final int APPEND_KEY = 0;\n    private static final int DELETE_KEY = 1;\n    private static final int MOVE_KEY = 2;\n    private static final int TOGGLE_KEY = 3;\n    private static final int FETCH_KEY = 4;\n\n    private static final UUID TODO_LIST_UUID = UUID.fromString(\"e0ca665a-cf96-4c09-bbea-aa113e8cc18f\");\n\n    private TodoListAdapter todoListAdapter;\n    private DialogManager dialogManager = new DialogManager();\n    private final MessageManager messageManager = new MessageManager();\n\n    /**\n     * Manages a thread-safe message queue using a Looper worker thread to complete blocking tasks.\n     */\n    public class MessageManager implements Runnable {\n        public Handler messageHandler;\n        private final BlockingQueue<PebbleDictionary> messageQueue = new LinkedBlockingQueue<PebbleDictionary>();\n        private Boolean isMessagePending = Boolean.valueOf(false);\n\n        @Override\n        public void run() {\n            Looper.prepare();\n            messageHandler = new Handler() {\n                @Override\n                public void handleMessage(Message msg) {\n                    Log.w(this.getClass().getSimpleName(), \"Please post() your blocking runnables to Mr Manager, \" +\n                            \"don't use sendMessage()\");\n                }\n\n            };\n            Looper.loop();\n        }\n\n        private void consumeAsync() {\n            messageHandler.post(new Runnable() {\n                @Override\n                public void run() {\n                    synchronized (isMessagePending) {\n                        if (isMessagePending.booleanValue()) {\n                            return;\n                        }\n\n                        synchronized (messageQueue) {\n                            if (messageQueue.size() == 0) {\n                                return;\n                            }\n                            PebbleKit.sendDataToPebble(getApplicationContext(), TODO_LIST_UUID, messageQueue.peek());\n                        }\n\n                        isMessagePending = Boolean.valueOf(true);\n                    }\n                }\n            });\n        }\n\n        public void notifyAckReceivedAsync() {\n            messageHandler.post(new Runnable() {\n                @Override\n                public void run() {\n                    synchronized (isMessagePending) {\n                        isMessagePending = Boolean.valueOf(false);\n                    }\n                    messageQueue.remove();\n                }\n            });\n            consumeAsync();\n        }\n\n        public void notifyNackReceivedAsync() {\n            messageHandler.post(new Runnable() {\n                @Override\n                public void run() {\n                    synchronized (isMessagePending) {\n                        isMessagePending = Boolean.valueOf(false);\n                    }\n                }\n            });\n            consumeAsync();\n        }\n\n        public boolean offer(final PebbleDictionary data) {\n            final boolean success = messageQueue.offer(data);\n\n            if (success) {\n                consumeAsync();\n            }\n\n            return success;\n        }\n    }\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_todo_list);\n\n        todoListAdapter = TodoListAdapter.createTodoListAdapter(getApplicationContext());\n\n        // Populate list before starting app on the Pebble\n        String[] dummyItems = getResources().getStringArray(R.array.jazz_artist_names);\n        todoListAdapter.addItems(dummyItems);\n\n        setListAdapter(todoListAdapter);\n        final DragSortListView dslv = getListViewAsDSLV();\n\n        dslv.setDropListener(new DragSortListView.DropListener() {\n            @Override\n            public void drop(final int from, final int to) {\n                if (from == to) {\n                    return;\n                }\n                todoListAdapter.moveItemFromIndexToIndex(from, to);\n                dslv.moveCheckState(from, to);\n\n                PebbleDictionary data = new PebbleDictionary();\n                data.addBytes(MOVE_KEY, new byte[]{(byte) from, (byte) to});\n                messageManager.offer(data);\n            }\n        });\n\n        dslv.setRemoveListener(new DragSortListView.RemoveListener() {\n            @Override\n            public void remove(final int which) {\n                final TodoListItem item = todoListAdapter.removeItemAtIndex(which);\n                if (item == null) {\n                    return;\n                }\n\n                dslv.removeCheckState(which);\n\n                // Notify the watch\n                PebbleDictionary data = new PebbleDictionary();\n                data.addUint8(DELETE_KEY, (byte) which);\n                messageManager.offer(data);\n            }\n        });\n\n        dslv.setOnItemClickListener(new AdapterView.OnItemClickListener() {\n            @Override\n            public void onItemClick(final AdapterView<?> parentAdapterView, final View view, final int position,\n                                    final long rowId) {\n                todoListAdapter.toggleItemCompletenessAtIndex(position);\n                PebbleDictionary data = new PebbleDictionary();\n                data.addUint8(TOGGLE_KEY, (byte) position);\n                messageManager.offer(data);\n            }\n        });\n\n        PebbleKit.startAppOnPebble(getApplicationContext(), TODO_LIST_UUID);\n    }\n\n    @Override\n    public void onStart() {\n        // FIXME do I need to do any cleanup in onStop()?\n        super.onStart();\n        new Thread(messageManager).start();\n\n    }\n\n    private DragSortListView getListViewAsDSLV() {\n        return (DragSortListView) super.getListView();\n    }\n\n    @Override\n    public DragSortListView getListView() {\n        return getListViewAsDSLV();\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (dataReceiver != null) {\n            unregisterReceiver(dataReceiver);\n            dataReceiver = null;\n        }\n\n        if (ackReceiver != null) {\n            unregisterReceiver(ackReceiver);\n            ackReceiver = null;\n        }\n\n        if (nackReceiver != null) {\n            unregisterReceiver(nackReceiver);\n            nackReceiver = null;\n        }\n\n        dialogManager.dismissAll();\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        // In order to interact with the UI thread from a broadcast receiver, we need to perform any updates through\n        // an Android handler. For more information, see: http://developer.android.com/reference/android/os/Handler\n        // .html\n        final Handler handler = new Handler();\n\n        // To receive data back from a watch-app, android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        dataReceiver = new PebbleKit.PebbleDataReceiver(TODO_LIST_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                handler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        // All data received from the Pebble must be ACK'd, otherwise you'll hit time-outs in the\n                        // watch-app which will cause the watch to feel \"laggy\" during periods of frequent\n                        // communication.\n                        PebbleKit.sendAckToPebble(context, transactionId);\n\n                        if (!data.iterator().hasNext()) {\n                            return;\n                        }\n\n                        final DragSortListView dslv = getListViewAsDSLV();\n\n                        final Long deleteValue = data.getUnsignedInteger(DELETE_KEY);\n                        if (deleteValue != null) {\n                            final int value = deleteValue.intValue();\n                            final TodoListItem item = todoListAdapter.removeItemAtIndex(value);\n                            if (item == null) {\n                                return;\n                            }\n\n                            dslv.removeCheckState(value);\n                        }\n\n                        final Long toggleValue = data.getUnsignedInteger(TOGGLE_KEY);\n                        if (toggleValue != null) {\n                            final int value = toggleValue.intValue();\n                            todoListAdapter.toggleItemCompletenessAtIndex(value);\n                            dslv.setItemChecked(value, todoListAdapter.getItem(value).isComplete());\n                        }\n\n                        final Long fetchValue = data.getUnsignedInteger(FETCH_KEY);\n                        if (fetchValue != null) {\n                            // Add entire list to messageQueue\n                            for (int i = 0; i < todoListAdapter.getCount(); i++) {\n                                PebbleDictionary data = new PebbleDictionary();\n                                TodoListItem item = todoListAdapter.getItem(i);\n                                data.addString(APPEND_KEY, item.getDescription());\n\n                                if (item.isComplete()) {\n                                    data.addUint8(TOGGLE_KEY, (byte) i);\n                                }\n                                if (!messageManager.offer(data)) {\n                                    return;\n                                }\n                            }\n                        }\n                    }\n                });\n            }\n        };\n\n        PebbleKit.registerReceivedDataHandler(this, dataReceiver);\n\n        ackReceiver = new PebbleKit.PebbleAckReceiver(TODO_LIST_UUID) {\n            @Override\n            public void receiveAck(final Context context, final int transactionId) {\n                messageManager.notifyAckReceivedAsync();\n            }\n        };\n\n        PebbleKit.registerReceivedAckHandler(this, ackReceiver);\n\n\n        nackReceiver = new PebbleKit.PebbleNackReceiver(TODO_LIST_UUID) {\n            @Override\n            public void receiveNack(final Context context, final int transactionId) {\n                messageManager.notifyNackReceivedAsync();\n            }\n        };\n\n        PebbleKit.registerReceivedNackHandler(this, nackReceiver);\n    }\n\n    private static class DialogManager {\n        public void showDialog(Dialog d) {\n            if (mDialogs.contains(d) == false) {\n                mDialogs.add(d);\n            }\n            d.show();\n        }\n\n        public void dismissAll() {\n            for (Dialog d : mDialogs) {\n                if (d != null) {\n                    if (d.isShowing()) {\n                        d.dismiss();\n                    }\n                }\n            }\n            mDialogs.clear();\n        }\n\n        public HashSet<Dialog> mDialogs = new HashSet<Dialog>();\n    }\n\n    private void removeAllCompletedItems() {\n        for (int i = todoListAdapter.getCount() - 1; i >= 0; i--) {\n            final TodoListItem item = todoListAdapter.getItem(i);\n            if (!item.isComplete()) {\n                continue;\n            }\n\n            getListViewAsDSLV().removeCheckState(i);\n            todoListAdapter.remove(item);\n\n            PebbleDictionary data = new PebbleDictionary();\n            data.addUint8(DELETE_KEY, (byte) i);\n            if (!messageManager.offer(data)) {\n                return;\n            }\n        }\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        // Handle item selection\n        switch (item.getItemId()) {\n            case (R.id.add_mi):\n                dialogManager.showDialog(createDialog());\n                return true;\n            case (R.id.remove_all_checked_mi):\n                removeAllCompletedItems();\n                return true;\n            default:\n                return super.onOptionsItemSelected(item);\n        }\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        MenuInflater inflater = getMenuInflater();\n        inflater.inflate(R.menu.options_menu, menu);\n        return true;\n    }\n\n    public Dialog createDialog() {\n        AlertDialog.Builder builder = new AlertDialog.Builder(this);\n        final LayoutInflater inflater = getLayoutInflater();\n\n        // Inflate and set the layout for the dialog\n        // Pass null as the parent view because its going in the dialog layout\n        final View rootView = inflater.inflate(R.layout.dialog_add_todo_item, null);\n        builder.setView(rootView)\n                // Add action buttons\n                .setPositiveButton(R.string.todo_list_add_dialog_ok_button, new DialogInterface.OnClickListener() {\n                    @Override\n                    public void onClick(DialogInterface dialog, int id) {\n                        final EditText editTextWidget = ((EditText) rootView.findViewById(R.id.todo_list_add_item_dialog_description));\n                        final String description = editTextWidget.getText().toString();\n                        final TodoListItem item = todoListAdapter.addItem(description);\n\n                        if (item == null) {\n                            dialog.dismiss();\n                            return;\n                        }\n\n                        final PebbleDictionary data = new PebbleDictionary();\n                        data.addString(APPEND_KEY, item.getDescription());\n                        messageManager.offer(data);\n                        dialog.dismiss();\n                    }\n                })\n                .setNegativeButton(R.string.todo_list_add_dialog_cancel_button, new DialogInterface.OnClickListener() {\n                    public void onClick(DialogInterface dialog, int id) {\n                        dialog.cancel();\n                    }\n                });\n        return builder.create();\n    }\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/example/PebbleKitExample/TodoList/TodoListAdapter.java",
    "content": "package com.example.PebbleKitExample.TodoList;\n\nimport android.content.Context;\nimport android.util.Log;\nimport android.widget.ArrayAdapter;\nimport com.example.PebbleKitExample.R;\n\nimport java.util.LinkedList;\nimport java.util.List;\n\npublic class TodoListAdapter extends ArrayAdapter<TodoListItem> {\n    private final Context mContext;\n    private static final int MAX_TODO_LIST_LENGTH = 10;\n    private static final int MAX_DESCRIPTION_LENGTH = 15;\n\n    private TodoListAdapter(final Context context, final int resource, final int textViewResourceId,\n                            final List<TodoListItem> items) {\n        super(context, resource, textViewResourceId, items);\n        mContext = context;\n    }\n\n    public static TodoListAdapter createTodoListAdapter(final Context context) {\n        final List<TodoListItem> items = new LinkedList<TodoListItem>();\n        // FIXME can getContext() be used here?\n        return new TodoListAdapter(context, R.layout.list_item_checkable, R.id.text, items);\n    }\n\n    public TodoListItem addItem(String description) {\n        if (getCount() >= MAX_TODO_LIST_LENGTH) {\n            return null;\n        }\n\n        if (description == null || description.length() == 0) {\n            return null;\n        }\n\n        // FIXME Can you make this UTF-8 safe? :)\n        if (description.length() >= MAX_DESCRIPTION_LENGTH) {\n            description = description.substring(0, MAX_DESCRIPTION_LENGTH);\n        }\n\n        final TodoListItem item = TodoListItem.getItemWithDescription(description);\n        this.add(item);\n\n        return item;\n    }\n\n    public LinkedList<TodoListItem> addItems(String[] descriptions) {\n        LinkedList<TodoListItem> itemsAdded = new LinkedList<TodoListItem>();\n\n        if (descriptions == null) {\n            Log.w(\"TodoList\", \"Null descriptions...\");\n            return null;\n        }\n\n        for (String description : descriptions) {\n            if (description == null) {\n                continue;\n            }\n\n            final TodoListItem item = addItem(description);\n            if (item != null) {\n                itemsAdded.add(item);\n            }\n        }\n\n        return itemsAdded;\n    }\n\n    public TodoListItem removeItemAtIndex(final int index) {\n        if (index >= getCount()) {\n            return null;\n        }\n        final TodoListItem item = getItem(index);\n        remove(item);\n        return item;\n    }\n\n    public void moveItemFromIndexToIndex(final int sourceIndex, final int destIndex) {\n        if (sourceIndex >= getCount() || destIndex >= getCount()) {\n            return;\n        }\n\n        if (sourceIndex == destIndex) {\n            return;\n        }\n\n        TodoListItem toAdd = getItem(sourceIndex);\n        remove(toAdd);\n\n        if (sourceIndex < destIndex) {\n            insert(toAdd, destIndex + 1);\n            return;\n        }\n\n        insert(toAdd, destIndex);\n    }\n\n    public void toggleItemCompletenessAtIndex(final int index) {\n        if (index >= getCount()) {\n            return;\n        }\n\n        TodoListItem item = getItem(index);\n        item.setComplete(!item.isComplete());\n    }\n\n    public List<String> getDescriptions() {\n        LinkedList<String> descriptions = new LinkedList<String>();\n        for (int i = 0; i < getCount(); i++) {\n            descriptions.add(getItem(i).getDescription());\n        }\n        return descriptions;\n    }\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/example/PebbleKitExample/TodoList/TodoListItem.java",
    "content": "package com.example.PebbleKitExample.TodoList;\n\npublic class TodoListItem {\n    private boolean mIsComplete;\n    private String mDescription;\n\n\n    private TodoListItem(final boolean isComplete, final String description) {\n        mIsComplete = isComplete;\n        mDescription = description;\n    }\n\n    public static TodoListItem getItemWithDescription(final String description) {\n        return new TodoListItem(false, description);\n    }\n\n\n    public boolean isComplete() {\n        return mIsComplete;\n    }\n\n    public void setComplete(final boolean isComplete) {\n        mIsComplete = isComplete;\n    }\n\n    public String getDescription() {\n        return mDescription;\n    }\n\n    public void setDescription(final String description) {\n        mDescription = description;\n    }\n\n    @Override\n    public String toString() {\n        return mDescription;\n    }\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/mobeta/android/dslv/DragSortController.java",
    "content": "package com.mobeta.android.dslv;\n\nimport android.graphics.Point;\nimport android.view.GestureDetector;\nimport android.view.HapticFeedbackConstants;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewConfiguration;\nimport android.widget.AdapterView;\n\n/**\n * Class that starts and stops item drags on a {@link DragSortListView}\n * based on touch gestures. This class also inherits from\n * {@link SimpleFloatViewManager}, which provides basic float View\n * creation.\n *\n * An instance of this class is meant to be passed to the methods\n * {@link DragSortListView#setTouchListener()} and\n * {@link DragSortListView#setFloatViewManager()} of your\n * {@link DragSortListView} instance.\n */\npublic class DragSortController extends SimpleFloatViewManager implements View.OnTouchListener, GestureDetector.OnGestureListener {\n\n    /**\n     * Drag init mode enum.\n     */\n    public static final int ON_DOWN = 0;\n    public static final int ON_DRAG = 1;\n    public static final int ON_LONG_PRESS = 2;\n\n    private int mDragInitMode = ON_DOWN;\n\n    private boolean mSortEnabled = true;\n\n    /**\n     * Remove mode enum.\n     */\n    public static final int CLICK_REMOVE = 0;\n    public static final int FLING_REMOVE = 1;\n\n    /**\n     * The current remove mode.\n     */\n    private int mRemoveMode;\n\n    private boolean mRemoveEnabled = false;\n    private boolean mIsRemoving = false;\n\n    private GestureDetector mDetector;\n\n    private GestureDetector mFlingRemoveDetector;\n\n    private int mTouchSlop;\n\n    public static final int MISS = -1;\n\n    private int mHitPos = MISS;\n    private int mFlingHitPos = MISS;\n\n    private int mClickRemoveHitPos = MISS;\n\n    private int[] mTempLoc = new int[2];\n\n    private int mItemX;\n    private int mItemY;\n\n    private int mCurrX;\n    private int mCurrY;\n\n    private boolean mDragging = false;\n\n    private float mFlingSpeed = 500f;\n\n    private int mDragHandleId;\n\n    private int mClickRemoveId;\n\n    private int mFlingHandleId;\n    private boolean mCanDrag;\n\n    private DragSortListView mDslv;\n    private int mPositionX;\n\n    /**\n     * Calls {@link #DragSortController(DragSortListView, int)} with a\n     * 0 drag handle id, FLING_RIGHT_REMOVE remove mode,\n     * and ON_DOWN drag init. By default, sorting is enabled, and\n     * removal is disabled.\n     *\n     * @param dslv The DSLV instance\n     */\n    public DragSortController(DragSortListView dslv) {\n        this(dslv, 0, ON_DOWN, FLING_REMOVE);\n    }\n\n    public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitMode, int removeMode) {\n        this(dslv, dragHandleId, dragInitMode, removeMode, 0);\n    }\n\n    public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitMode, int removeMode, int clickRemoveId) {\n        this(dslv, dragHandleId, dragInitMode, removeMode, clickRemoveId, 0);\n    }\n\n    /**\n     * By default, sorting is enabled, and removal is disabled.\n     *\n     * @param dslv The DSLV instance\n     * @param dragHandleId The resource id of the View that represents\n     * the drag handle in a list item.\n     */\n    public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitMode,\n            int removeMode, int clickRemoveId, int flingHandleId) {\n        super(dslv);\n        mDslv = dslv;\n        mDetector = new GestureDetector(dslv.getContext(), this);\n        mFlingRemoveDetector = new GestureDetector(dslv.getContext(), mFlingRemoveListener);\n        mFlingRemoveDetector.setIsLongpressEnabled(false);\n        mTouchSlop = ViewConfiguration.get(dslv.getContext()).getScaledTouchSlop();\n        mDragHandleId = dragHandleId;\n        mClickRemoveId = clickRemoveId;\n        mFlingHandleId = flingHandleId;\n        setRemoveMode(removeMode);\n        setDragInitMode(dragInitMode);\n    }\n\n\n    public int getDragInitMode() {\n        return mDragInitMode;\n    }\n\n    /**\n     * Set how a drag is initiated. Needs to be one of\n     * {@link ON_DOWN}, {@link ON_DRAG}, or {@link ON_LONG_PRESS}.\n     *\n     * @param mode The drag init mode.\n     */\n    public void setDragInitMode(int mode) {\n        mDragInitMode = mode;\n    }\n\n    /**\n     * Enable/Disable list item sorting. Disabling is useful if only item\n     * removal is desired. Prevents drags in the vertical direction.\n     *\n     * @param enabled Set <code>true</code> to enable list\n     * item sorting.\n     */\n    public void setSortEnabled(boolean enabled) {\n        mSortEnabled = enabled;\n    }\n\n    public boolean isSortEnabled() {\n        return mSortEnabled;\n    }\n\n    /**\n     * One of {@link CLICK_REMOVE}, {@link FLING_RIGHT_REMOVE},\n     * {@link FLING_LEFT_REMOVE},\n     * {@link SLIDE_RIGHT_REMOVE}, or {@link SLIDE_LEFT_REMOVE}.\n     */\n    public void setRemoveMode(int mode) {\n        mRemoveMode = mode;\n    }\n\n    public int getRemoveMode() {\n        return mRemoveMode;\n    }\n\n    /**\n     * Enable/Disable item removal without affecting remove mode.\n     */\n    public void setRemoveEnabled(boolean enabled) {\n        mRemoveEnabled = enabled;\n    }\n\n    public boolean isRemoveEnabled() {\n        return mRemoveEnabled;\n    }\n\n    /**\n     * Set the resource id for the View that represents the drag\n     * handle in a list item.\n     *\n     * @param id An android resource id.\n     */\n    public void setDragHandleId(int id) {\n        mDragHandleId = id;\n    }\n\n    /**\n     * Set the resource id for the View that represents the fling\n     * handle in a list item.\n     *\n     * @param id An android resource id.\n     */\n    public void setFlingHandleId(int id) {\n        mFlingHandleId = id;\n    }\n\n    /**\n     * Set the resource id for the View that represents click\n     * removal button.\n     *\n     * @param id An android resource id.\n     */\n    public void setClickRemoveId(int id) {\n        mClickRemoveId = id;\n    }\n\n    /**\n     * Sets flags to restrict certain motions of the floating View\n     * based on DragSortController settings (such as remove mode).\n     * Starts the drag on the DragSortListView.\n     *\n     * @param position The list item position (includes headers).\n     * @param deltaX Touch x-coord minus left edge of floating View.\n     * @param deltaY Touch y-coord minus top edge of floating View.\n     *\n     * @return True if drag started, false otherwise.\n     */\n    public boolean startDrag(int position, int deltaX, int deltaY) {\n\n        int dragFlags = 0;\n        if (mSortEnabled && !mIsRemoving) {\n            dragFlags |= DragSortListView.DRAG_POS_Y | DragSortListView.DRAG_NEG_Y;\n        }\n        if (mRemoveEnabled && mIsRemoving) {\n            dragFlags |= DragSortListView.DRAG_POS_X;\n            dragFlags |= DragSortListView.DRAG_NEG_X;\n        }\n\n        mDragging = mDslv.startDrag(position - mDslv.getHeaderViewsCount(), dragFlags, deltaX,\n                deltaY);\n        return mDragging;\n    }\n\n    @Override\n    public boolean onTouch(View v, MotionEvent ev) {\n        if (!mDslv.isDragEnabled() || mDslv.listViewIntercepted()) {\n            return false;\n        }\n\n        mDetector.onTouchEvent(ev);\n        if (mRemoveEnabled && mDragging && mRemoveMode == FLING_REMOVE) {\n            mFlingRemoveDetector.onTouchEvent(ev);\n        }\n\n        int action = ev.getAction() & MotionEvent.ACTION_MASK;\n        switch (action) {\n            case MotionEvent.ACTION_DOWN:\n                mCurrX = (int) ev.getX();\n                mCurrY = (int) ev.getY();\n                break;\n            case MotionEvent.ACTION_UP:\n                if (mRemoveEnabled && mIsRemoving) {\n                    int x = mPositionX >= 0 ? mPositionX : -mPositionX;\n                    int removePoint = mDslv.getWidth() / 2;\n                    if (x > removePoint) {\n                        mDslv.stopDragWithVelocity(true, 0);\n                    }\n                }\n            case MotionEvent.ACTION_CANCEL:\n                mIsRemoving = false;\n                mDragging = false;\n                break;\n        }\n\n        return false;\n    }\n\n    /**\n     * Overrides to provide fading when slide removal is enabled.\n     */\n    @Override\n    public void onDragFloatView(View floatView, Point position, Point touch) {\n\n        if (mRemoveEnabled && mIsRemoving) {\n            mPositionX = position.x;\n        }\n    }\n\n    /**\n     * Get the position to start dragging based on the ACTION_DOWN\n     * MotionEvent. This function simply calls\n     * {@link #dragHandleHitPosition(MotionEvent)}. Override\n     * to change drag handle behavior;\n     * this function is called internally when an ACTION_DOWN\n     * event is detected.\n     *\n     * @param ev The ACTION_DOWN MotionEvent.\n     *\n     * @return The list position to drag if a drag-init gesture is\n     * detected; MISS if unsuccessful.\n     */\n    public int startDragPosition(MotionEvent ev) {\n        return dragHandleHitPosition(ev);\n    }\n\n    public int startFlingPosition(MotionEvent ev) {\n        return mRemoveMode == FLING_REMOVE ? flingHandleHitPosition(ev) : MISS;\n    }\n\n    /**\n     * Checks for the touch of an item's drag handle (specified by\n     * {@link #setDragHandleId(int)}), and returns that item's position\n     * if a drag handle touch was detected.\n     *\n     * @param ev The ACTION_DOWN MotionEvent.\n\n     * @return The list position of the item whose drag handle was\n     * touched; MISS if unsuccessful.\n     */\n    public int dragHandleHitPosition(MotionEvent ev) {\n        return viewIdHitPosition(ev, mDragHandleId);\n    }\n\n    public int flingHandleHitPosition(MotionEvent ev) {\n        return viewIdHitPosition(ev, mFlingHandleId);\n    }\n\n    public int viewIdHitPosition(MotionEvent ev, int id) {\n        final int x = (int) ev.getX();\n        final int y = (int) ev.getY();\n\n        int touchPos = mDslv.pointToPosition(x, y); // includes headers/footers\n\n        final int numHeaders = mDslv.getHeaderViewsCount();\n        final int numFooters = mDslv.getFooterViewsCount();\n        final int count = mDslv.getCount();\n\n        // Log.d(\"mobeta\", \"touch down on position \" + itemnum);\n        // We're only interested if the touch was on an\n        // item that's not a header or footer.\n        if (touchPos != AdapterView.INVALID_POSITION && touchPos >= numHeaders\n                && touchPos < (count - numFooters)) {\n            final View item = mDslv.getChildAt(touchPos - mDslv.getFirstVisiblePosition());\n            final int rawX = (int) ev.getRawX();\n            final int rawY = (int) ev.getRawY();\n\n            View dragBox = id == 0 ? item : (View) item.findViewById(id);\n            if (dragBox != null) {\n                dragBox.getLocationOnScreen(mTempLoc);\n\n                if (rawX > mTempLoc[0] && rawY > mTempLoc[1] &&\n                        rawX < mTempLoc[0] + dragBox.getWidth() &&\n                        rawY < mTempLoc[1] + dragBox.getHeight()) {\n\n                    mItemX = item.getLeft();\n                    mItemY = item.getTop();\n\n                    return touchPos;\n                }\n            }\n        }\n\n        return MISS;\n    }\n\n    @Override\n    public boolean onDown(MotionEvent ev) {\n        if (mRemoveEnabled && mRemoveMode == CLICK_REMOVE) {\n            mClickRemoveHitPos = viewIdHitPosition(ev, mClickRemoveId);\n        }\n\n        mHitPos = startDragPosition(ev);\n        if (mHitPos != MISS && mDragInitMode == ON_DOWN) {\n            startDrag(mHitPos, (int) ev.getX() - mItemX, (int) ev.getY() - mItemY);\n        }\n\n        mIsRemoving = false;\n        mCanDrag = true;\n        mPositionX = 0;\n        mFlingHitPos = startFlingPosition(ev);\n\n        return true;\n    }\n\n    @Override\n    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {\n\n        final int x1 = (int) e1.getX();\n        final int y1 = (int) e1.getY();\n        final int x2 = (int) e2.getX();\n        final int y2 = (int) e2.getY();\n        final int deltaX = x2 - mItemX;\n        final int deltaY = y2 - mItemY;\n\n        if (mCanDrag && !mDragging && (mHitPos != MISS || mFlingHitPos != MISS)) {\n            if (mHitPos != MISS) {\n                if (mDragInitMode == ON_DRAG && Math.abs(y2 - y1) > mTouchSlop && mSortEnabled) {\n                    startDrag(mHitPos, deltaX, deltaY);\n                }\n                else if (mDragInitMode != ON_DOWN && Math.abs(x2 - x1) > mTouchSlop && mRemoveEnabled)\n                {\n                    mIsRemoving = true;\n                    startDrag(mFlingHitPos, deltaX, deltaY);\n                }\n            } else if (mFlingHitPos != MISS) {\n                if (Math.abs(x2 - x1) > mTouchSlop && mRemoveEnabled) {\n                    mIsRemoving = true;\n                    startDrag(mFlingHitPos, deltaX, deltaY);\n                } else if (Math.abs(y2 - y1) > mTouchSlop) {\n                    mCanDrag = false; // if started to scroll the list then\n                                      // don't allow sorting nor fling-removing\n                }\n            }\n        }\n        // return whatever\n        return false;\n    }\n\n    @Override\n    public void onLongPress(MotionEvent e) {\n        // Log.d(\"mobeta\", \"lift listener long pressed\");\n        if (mHitPos != MISS && mDragInitMode == ON_LONG_PRESS) {\n            mDslv.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);\n            startDrag(mHitPos, mCurrX - mItemX, mCurrY - mItemY);\n        }\n    }\n\n    // complete the OnGestureListener interface\n    @Override\n    public final boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {\n        return false;\n    }\n\n    // complete the OnGestureListener interface\n    @Override\n    public boolean onSingleTapUp(MotionEvent ev) {\n        if (mRemoveEnabled && mRemoveMode == CLICK_REMOVE) {\n            if (mClickRemoveHitPos != MISS) {\n                mDslv.removeItem(mClickRemoveHitPos - mDslv.getHeaderViewsCount());\n            }\n        }\n        return true;\n    }\n\n    // complete the OnGestureListener interface\n    @Override\n    public void onShowPress(MotionEvent ev) {\n        // do nothing\n    }\n\n    private GestureDetector.OnGestureListener mFlingRemoveListener =\n            new GestureDetector.SimpleOnGestureListener() {\n                @Override\n                public final boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,\n                        float velocityY) {\n                    // Log.d(\"mobeta\", \"on fling remove called\");\n                    if (mRemoveEnabled && mIsRemoving) {\n                        int w = mDslv.getWidth();\n                        int minPos = w / 5;\n                        if (velocityX > mFlingSpeed) {\n                            if (mPositionX > -minPos) {\n                                mDslv.stopDragWithVelocity(true, velocityX);\n                            }\n                        } else if (velocityX < -mFlingSpeed) {\n                            if (mPositionX < minPos) {\n                                mDslv.stopDragWithVelocity(true, velocityX);\n                            }\n                        }\n                        mIsRemoving = false;\n                    }\n                    return false;\n                }\n            };\n\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/mobeta/android/dslv/DragSortCursorAdapter.java",
    "content": "package com.mobeta.android.dslv;\n\nimport java.util.ArrayList;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.util.SparseIntArray;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.support.v4.widget.CursorAdapter;\n\n\n/**\n * A subclass of {@link android.widget.CursorAdapter} that provides\n * reordering of the elements in the Cursor based on completed\n * drag-sort operations. The reordering is a simple mapping of\n * list positions into Cursor positions (the Cursor is unchanged).\n * To persist changes made by drag-sorts, one can retrieve the\n * mapping with the {@link #getCursorPositions()} method, which\n * returns the reordered list of Cursor positions.\n *\n * An instance of this class is passed\n * to {@link DragSortListView#setAdapter(ListAdapter)} and, since\n * this class implements the {@link DragSortListView.DragSortListener}\n * interface, it is automatically set as the DragSortListener for\n * the DragSortListView instance.\n */\npublic abstract class DragSortCursorAdapter extends CursorAdapter implements DragSortListView.DragSortListener {\n\n    public static final int REMOVED = -1;\n\n    /**\n     * Key is ListView position, value is Cursor position\n     */\n    private SparseIntArray mListMapping = new SparseIntArray();\n\n    private ArrayList<Integer> mRemovedCursorPositions = new ArrayList<Integer>();\n    \n    public DragSortCursorAdapter(Context context, Cursor c) {\n        super(context, c);\n    }\n\n    public DragSortCursorAdapter(Context context, Cursor c, boolean autoRequery) {\n        super(context, c, autoRequery);\n    }\n\n    public DragSortCursorAdapter(Context context, Cursor c, int flags) {\n        super(context, c, flags);\n    }\n\n    /**\n     * Swaps Cursor and clears list-Cursor mapping.\n     *\n     * @see android.widget.CursorAdapter#swapCursor(android.database.Cursor)\n     */\n    @Override\n    public Cursor swapCursor(Cursor newCursor) {\n        Cursor old = super.swapCursor(newCursor);\n        resetMappings();\n        return old;\n    }\n\n    /**\n     * Changes Cursor and clears list-Cursor mapping.\n     *\n     * @see android.widget.CursorAdapter#changeCursor(android.database.Cursor)\n     */\n    @Override\n    public void changeCursor(Cursor cursor) {\n        super.changeCursor(cursor);\n        resetMappings();\n    }\n\n    /**\n     * Resets list-cursor mapping.\n     */\n    public void reset() {\n        resetMappings();\n        notifyDataSetChanged();\n    }\n\n    private void resetMappings() {\n        mListMapping.clear();\n        mRemovedCursorPositions.clear();\n    }\n\n    @Override\n    public Object getItem(int position) {\n        return super.getItem(mListMapping.get(position, position));\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return super.getItemId(mListMapping.get(position, position));\n    }\n\n    @Override\n    public View getDropDownView(int position, View convertView, ViewGroup parent) {\n        return super.getDropDownView(mListMapping.get(position, position), convertView, parent);\n    }\n\n    @Override\n    public View getView(int position, View convertView, ViewGroup parent) {\n        return super.getView(mListMapping.get(position, position), convertView, parent);\n    }\n\n    /**\n     * On drop, this updates the mapping between Cursor positions\n     * and ListView positions. The Cursor is unchanged. Retrieve\n     * the current mapping with {@link getCursorPositions()}.\n     *\n     * @see DragSortListView.DropListener#drop(int, int)\n     */\n    @Override\n    public void drop(int from, int to) {\n        if (from != to) {\n            int cursorFrom = mListMapping.get(from, from);\n\n            if (from > to) {\n                for (int i = from; i > to; --i) {\n                    mListMapping.put(i, mListMapping.get(i - 1, i - 1));\n                }\n            } else {\n                for (int i = from; i < to; ++i) {\n                    mListMapping.put(i, mListMapping.get(i + 1, i + 1));\n                }\n            }\n            mListMapping.put(to, cursorFrom);\n\n            cleanMapping();        \n            notifyDataSetChanged();\n        }\n    }\n\n    /**\n     * On remove, this updates the mapping between Cursor positions\n     * and ListView positions. The Cursor is unchanged. Retrieve\n     * the current mapping with {@link getCursorPositions()}.\n     *\n     * @see DragSortListView.RemoveListener#remove(int)\n     */\n    @Override\n    public void remove(int which) {\n        int cursorPos = mListMapping.get(which, which);\n        if (!mRemovedCursorPositions.contains(cursorPos)) {\n            mRemovedCursorPositions.add(cursorPos);\n        }\n\n        int newCount = getCount();\n        for (int i = which; i < newCount; ++i) {\n            mListMapping.put(i, mListMapping.get(i + 1, i + 1));\n        }\n\n        mListMapping.delete(newCount);\n\n        cleanMapping();\n        notifyDataSetChanged();\n    }\n\n    /**\n     * Does nothing. Just completes DragSortListener interface.\n     */\n    @Override\n    public void drag(int from, int to) {\n        // do nothing\n    }\n\n    /**\n     * Remove unnecessary mappings from sparse array.\n     */\n    private void cleanMapping() {\n        ArrayList<Integer> toRemove = new ArrayList<Integer>();\n\n        int size = mListMapping.size();\n        for (int i = 0; i < size; ++i) {\n            if (mListMapping.keyAt(i) == mListMapping.valueAt(i)) {\n                toRemove.add(mListMapping.keyAt(i));\n            }\n        }\n\n        size = toRemove.size();\n        for (int i = 0; i < size; ++i) {\n            mListMapping.delete(toRemove.get(i));\n        }\n    }\n\n    @Override\n    public int getCount() {\n        return super.getCount() - mRemovedCursorPositions.size();\n    }\n\n    /**\n     * Get the Cursor position mapped to by the provided list position\n     * (given all previously handled drag-sort\n     * operations).\n     *\n     * @param position List position\n     *\n     * @return The mapped-to Cursor position\n     */\n    public int getCursorPosition(int position) {\n        return mListMapping.get(position, position);\n    }\n\n    /**\n     * Get the current order of Cursor positions presented by the\n     * list.\n     */\n    public ArrayList<Integer> getCursorPositions() {\n        ArrayList<Integer> result = new ArrayList<Integer>();\n\n        for (int i = 0; i < getCount(); ++i) {\n            result.add(mListMapping.get(i, i));\n        }\n\n        return result;\n    }\n\n    /**\n     * Get the list position mapped to by the provided Cursor position.\n     * If the provided Cursor position has been removed by a drag-sort,\n     * this returns {@link #REMOVED}.\n     *\n     * @param cursorPosition A Cursor position\n     * @return The mapped-to list position or REMOVED\n     */\n    public int getListPosition(int cursorPosition) {\n        if (mRemovedCursorPositions.contains(cursorPosition)) {\n            return REMOVED;\n        }\n\n        int index = mListMapping.indexOfValue(cursorPosition);\n        if (index < 0) {\n            return cursorPosition;\n        } else {\n            return mListMapping.keyAt(index);\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/mobeta/android/dslv/DragSortItemView.java",
    "content": "package com.mobeta.android.dslv;\n\nimport android.content.Context;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.View.MeasureSpec;\nimport android.view.ViewGroup;\nimport android.widget.AbsListView;\nimport android.util.Log;\n\n/**\n * Lightweight ViewGroup that wraps list items obtained from user's\n * ListAdapter. ItemView expects a single child that has a definite\n * height (i.e. the child's layout height is not MATCH_PARENT).\n * The width of\n * ItemView will always match the width of its child (that is,\n * the width MeasureSpec given to ItemView is passed directly\n * to the child, and the ItemView measured width is set to the\n * child's measured width). The height of ItemView can be anything;\n * the \n * \n *\n * The purpose of this class is to optimize slide\n * shuffle animations.\n */\npublic class DragSortItemView extends ViewGroup {\n\n    private int mGravity = Gravity.TOP;\n\n    public DragSortItemView(Context context) {\n        super(context);\n\n        // always init with standard ListView layout params\n        setLayoutParams(new AbsListView.LayoutParams(\n                ViewGroup.LayoutParams.FILL_PARENT,\n                ViewGroup.LayoutParams.WRAP_CONTENT));\n\n        //setClipChildren(true);\n    }\n\n    public void setGravity(int gravity) {\n        mGravity = gravity;\n    }\n\n    public int getGravity() {\n        return mGravity;\n    }\n\n    @Override\n    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {\n        final View child = getChildAt(0);\n\n        if (child == null) {\n            return;\n        }\n\n        if (mGravity == Gravity.TOP) {\n            child.layout(0, 0, getMeasuredWidth(), child.getMeasuredHeight());\n        } else {\n            child.layout(0, getMeasuredHeight() - child.getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight());\n        }\n    }\n\n    /**\n     * \n     */\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        \n        int height = MeasureSpec.getSize(heightMeasureSpec);\n        int width = MeasureSpec.getSize(widthMeasureSpec);\n\n        int heightMode = MeasureSpec.getMode(heightMeasureSpec);\n\n        final View child = getChildAt(0);\n        if (child == null) {\n            setMeasuredDimension(0, width);\n            return;\n        }\n\n        if (child.isLayoutRequested()) {\n            // Always let child be as tall as it wants.\n            measureChild(child, widthMeasureSpec,\n                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));\n        }\n\n        if (heightMode == MeasureSpec.UNSPECIFIED) {\n            ViewGroup.LayoutParams lp = getLayoutParams();\n\n            if (lp.height > 0) {\n                height = lp.height;\n            } else {\n                height = child.getMeasuredHeight();\n            }\n        }\n\n        setMeasuredDimension(width, height);\n    }\n\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/mobeta/android/dslv/DragSortItemViewCheckable.java",
    "content": "package com.mobeta.android.dslv;\n\nimport android.content.Context;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.View.MeasureSpec;\nimport android.view.ViewGroup;\nimport android.widget.AbsListView;\nimport android.widget.Checkable;\nimport android.util.Log;\n\n/**\n * Lightweight ViewGroup that wraps list items obtained from user's\n * ListAdapter. ItemView expects a single child that has a definite\n * height (i.e. the child's layout height is not MATCH_PARENT).\n * The width of\n * ItemView will always match the width of its child (that is,\n * the width MeasureSpec given to ItemView is passed directly\n * to the child, and the ItemView measured width is set to the\n * child's measured width). The height of ItemView can be anything;\n * the \n * \n *\n * The purpose of this class is to optimize slide\n * shuffle animations.\n */\npublic class DragSortItemViewCheckable extends DragSortItemView implements Checkable {\n\n    public DragSortItemViewCheckable(Context context) {\n        super(context);\n    }\n\n    @Override\n    public boolean isChecked() {\n        View child = getChildAt(0);\n        if (child instanceof Checkable)\n            return ((Checkable) child).isChecked();\n        else\n            return false;\n    }\n\n    @Override\n    public void setChecked(boolean checked) {\n        View child = getChildAt(0);\n        if (child instanceof Checkable)\n            ((Checkable) child).setChecked(checked);\n    }\n\n    @Override\n    public void toggle() {\n        View child = getChildAt(0);\n        if (child instanceof Checkable)\n            ((Checkable) child).toggle();\n    }\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/mobeta/android/dslv/DragSortListView.java",
    "content": "/*\n * DragSortListView.\n *\n * A subclass of the Android ListView component that enables drag\n * and drop re-ordering of list items.\n *\n * Copyright 2012 Carl Bauer\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.mobeta.android.dslv;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.database.DataSetObserver;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Point;\nimport android.graphics.drawable.Drawable;\nimport android.os.Environment;\nimport android.os.SystemClock;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.util.SparseBooleanArray;\nimport android.util.SparseIntArray;\nimport android.view.Gravity;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.AbsListView;\nimport android.widget.BaseAdapter;\nimport android.widget.Checkable;\nimport android.widget.ListAdapter;\nimport android.widget.ListView;\n\nimport java.io.File;\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport com.example.PebbleKitExample.R;\n\n/**\n * ListView subclass that mediates drag and drop resorting of items.\n * \n * \n * @author heycosmo\n *\n */\npublic class DragSortListView extends ListView {\n    \n    \n    /**\n     * The View that floats above the ListView and represents\n     * the dragged item.\n     */\n    private View mFloatView;\n\n    /**\n     * The float View location. First based on touch location\n     * and given deltaX and deltaY. Then restricted by callback\n     * to FloatViewManager.onDragFloatView(). Finally restricted\n     * by bounds of DSLV.\n     */\n    private Point mFloatLoc = new Point();\n\n    private Point mTouchLoc = new Point();\n\n    /**\n     * The middle (in the y-direction) of the floating View.\n     */\n    private int mFloatViewMid;\n\n    /**\n     * Flag to make sure float View isn't measured twice\n     */\n    private boolean mFloatViewOnMeasured = false;\n\n    /**\n     * Watch the Adapter for data changes. Cancel a drag if\n     * coincident with a change.\n     */ \n    private DataSetObserver mObserver;\n\n    /**\n     * Transparency for the floating View (XML attribute).\n     */\n    private float mFloatAlpha = 1.0f;\n    private float mCurrFloatAlpha = 1.0f;\n\n    /**\n     * While drag-sorting, the current position of the floating\n     * View. If dropped, the dragged item will land in this position.\n     */\n    private int mFloatPos;\n\n    /**\n     * The first expanded ListView position that helps represent\n     * the drop slot tracking the floating View.\n     */\n    private int mFirstExpPos;\n\n    /**\n     * The second expanded ListView position that helps represent\n     * the drop slot tracking the floating View. This can equal\n     * mFirstExpPos if there is no slide shuffle occurring; otherwise\n     * it is equal to mFirstExpPos + 1.\n     */\n    private int mSecondExpPos;\n\n    /**\n     * Flag set if slide shuffling is enabled.\n     */\n    private boolean mAnimate = false;\n\n    /**\n     * The user dragged from this position.\n     */\n    private int mSrcPos;\n\n    /**\n     * Offset (in x) within the dragged item at which the user\n     * picked it up (or first touched down with the digitalis).\n     */\n    private int mDragDeltaX;\n\n    /**\n     * Offset (in y) within the dragged item at which the user\n     * picked it up (or first touched down with the digitalis).\n     */\n    private int mDragDeltaY;\n\n\n    /**\n     * The difference (in x) between screen coordinates and coordinates\n     * in this view.\n     */\n    private int mOffsetX;\n\n    /**\n     * The difference (in y) between screen coordinates and coordinates\n     * in this view.\n     */\n    private int mOffsetY;\n\n    /**\n     * A listener that receives callbacks whenever the floating View\n     * hovers over a new position.\n     */\n    private DragListener mDragListener;\n\n    /**\n     * A listener that receives a callback when the floating View\n     * is dropped.\n     */\n    private DropListener mDropListener;\n\n    /**\n     * A listener that receives a callback when the floating View\n     * (or more precisely the originally dragged item) is removed\n     * by one of the provided gestures.\n     */\n    private RemoveListener mRemoveListener;\n\n    /**\n     * Enable/Disable item dragging\n     * \n     * @attr name dslv:drag_enabled\n     */\n    private boolean mDragEnabled = true;\n\n    /**\n     * Drag state enum.\n     */\n    private final static int IDLE = 0;\n    private final static int REMOVING = 1;\n    private final static int DROPPING = 2;\n    private final static int STOPPED = 3;\n    private final static int DRAGGING = 4;\n\n    private int mDragState = IDLE;\n\n    /**\n     * Height in pixels to which the originally dragged item\n     * is collapsed during a drag-sort. Currently, this value\n     * must be greater than zero.\n     */\n    private int mItemHeightCollapsed = 1;\n\n    /**\n     * Height of the floating View. Stored for the purpose of\n     * providing the tracking drop slot.\n     */\n    private int mFloatViewHeight;\n\n    /**\n     * Convenience member. See above.\n     */\n    private int mFloatViewHeightHalf;\n\n    /**\n     * Save the given width spec for use in measuring children\n     */\n    private int mWidthMeasureSpec = 0;\n\n    /**\n     * Sample Views ultimately used for calculating the height\n     * of ListView items that are off-screen.\n     */\n    private View[] mSampleViewTypes = new View[1];\n\n    /**\n     * Drag-scroll encapsulator!\n     */\n    private DragScroller mDragScroller;\n\n    /**\n     * Determines the start of the upward drag-scroll region\n     * at the top of the ListView. Specified by a fraction\n     * of the ListView height, thus screen resolution agnostic.\n     */\n    private float mDragUpScrollStartFrac = 1.0f / 3.0f;\n\n    /**\n     * Determines the start of the downward drag-scroll region\n     * at the bottom of the ListView. Specified by a fraction\n     * of the ListView height, thus screen resolution agnostic.\n     */\n    private float mDragDownScrollStartFrac = 1.0f / 3.0f;\n\n    /**\n     * The following are calculated from the above fracs.\n     */\n    private int mUpScrollStartY;\n    private int mDownScrollStartY;\n    private float mDownScrollStartYF;\n    private float mUpScrollStartYF;\n\n    /**\n     * Calculated from above above and current ListView height.\n     */\n    private float mDragUpScrollHeight;\n\n    /**\n     * Calculated from above above and current ListView height.\n     */\n    private float mDragDownScrollHeight;\n\n    /**\n     * Maximum drag-scroll speed in pixels per ms. Only used with\n     * default linear drag-scroll profile.\n     */\n    private float mMaxScrollSpeed = 0.5f;\n\n    /**\n     * Defines the scroll speed during a drag-scroll. User can\n     * provide their own; this default is a simple linear profile\n     * where scroll speed increases linearly as the floating View\n     * nears the top/bottom of the ListView.\n     */\n    private DragScrollProfile mScrollProfile = new DragScrollProfile() {\n        @Override\n        public float getSpeed(float w, long t) {\n            return mMaxScrollSpeed * w;\n        }\n    };\n\n    /**\n     * Current touch x.\n     */\n    private int mX;\n\n    /**\n     * Current touch y.\n     */\n    private int mY;\n\n    /**\n     * Last touch x.\n     */\n    private int mLastX;\n\n    /**\n     * Last touch y.\n     */\n    private int mLastY;\n\n    /**\n     * The touch y-coord at which drag started\n     */\n    private int mDragStartY;\n\n    /**\n     * Drag flag bit. Floating View can move in the positive\n     * x direction.\n     */\n    public final static int DRAG_POS_X = 0x1;\n\n    /**\n     * Drag flag bit. Floating View can move in the negative\n     * x direction.\n     */\n    public final static int DRAG_NEG_X = 0x2;\n\n    /**\n     * Drag flag bit. Floating View can move in the positive\n     * y direction. This is subtle. What this actually means is\n     * that, if enabled, the floating View can be dragged below its starting\n     * position. Remove in favor of upper-bounding item position?\n     */\n    public final static int DRAG_POS_Y = 0x4;\n\n    /**\n     * Drag flag bit. Floating View can move in the negative\n     * y direction. This is subtle. What this actually means is\n     * that the floating View can be dragged above its starting\n     * position. Remove in favor of lower-bounding item position?\n     */\n    public final static int DRAG_NEG_Y = 0x8;\n\n    /**\n     * Flags that determine limits on the motion of the\n     * floating View. See flags above.\n     */\n    private int mDragFlags = 0;\n\n    /**\n     * Last call to an on*TouchEvent was a call to\n     * onInterceptTouchEvent.\n     */\n    private boolean mLastCallWasIntercept = false;\n\n    /**\n     * A touch event is in progress.\n     */\n    private boolean mInTouchEvent = false;\n\n    /**\n     * Let the user customize the floating View.\n     */\n    private FloatViewManager mFloatViewManager = null;\n\n    /**\n     * Given to ListView to cancel its action when a drag-sort\n     * begins.\n     */\n    private MotionEvent mCancelEvent;\n\n    /**\n     * Enum telling where to cancel the ListView action when a\n     * drag-sort begins\n     */\n    private static final int NO_CANCEL = 0;\n    private static final int ON_TOUCH_EVENT = 1;\n    private static final int ON_INTERCEPT_TOUCH_EVENT = 2;\n\n    /**\n     * Where to cancel the ListView action when a\n     * drag-sort begins\n     */ \n    private int mCancelMethod = NO_CANCEL;\n\n    /**\n     * Determines when a slide shuffle animation starts. That is,\n     * defines how close to the edge of the drop slot the floating\n     * View must be to initiate the slide.\n     */\n    private float mSlideRegionFrac = 0.25f;\n\n    /**\n     * Number between 0 and 1 indicating the relative location of\n     * a sliding item (only used if drag-sort animations\n     * are turned on). Nearly 1 means the item is \n     * at the top of the slide region (nearly full blank item\n     * is directly below).\n     */\n    private float mSlideFrac = 0.0f;\n\n    /**\n     * Wraps the user-provided ListAdapter. This is used to wrap each\n     * item View given by the user inside another View (currenly\n     * a RelativeLayout) which\n     * expands and collapses to simulate the item shuffling.\n     */\n    private AdapterWrapper mAdapterWrapper;\n\n    /**\n     * Turn on custom debugger.\n     */\n    private boolean mTrackDragSort = false;\n\n    /**\n     * Debugging class.\n     */\n    private DragSortTracker mDragSortTracker;\n\n    /**\n     * Needed for adjusting item heights from within layoutChildren\n     */\n    private boolean mBlockLayoutRequests = false;\n\n    /**\n     * Set to true when a down event happens during drag sort;\n     * for example, when drag finish animations are\n     * playing.\n     */\n    private boolean mIgnoreTouchEvent = false;\n\n    /**\n     * Caches DragSortItemView child heights. Sometimes DSLV has to\n     * know the height of an offscreen item. Since ListView virtualizes\n     * these, DSLV must get the item from the ListAdapter to obtain\n     * its height. That process can be expensive, but often the same\n     * offscreen item will be requested many times in a row. Once an\n     * offscreen item height is calculated, we cache it in this guy.\n     * Actually, we cache the height of the child of the\n     * DragSortItemView since the item height changes often during a\n     * drag-sort.\n     */\n    private static final int sCacheSize = 3;\n    private HeightCache mChildHeightCache = new HeightCache(sCacheSize);\n\n    private RemoveAnimator mRemoveAnimator;\n\n    private LiftAnimator mLiftAnimator;\n\n    private DropAnimator mDropAnimator;\n\n    private boolean mUseRemoveVelocity;\n    private float mRemoveVelocityX = 0;\n\n    public DragSortListView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n\n        int defaultDuration = 150;\n        int removeAnimDuration = defaultDuration; // ms\n        int dropAnimDuration = defaultDuration; // ms\n\n        if (attrs != null) {\n            TypedArray a = getContext().obtainStyledAttributes(attrs,\n                    R.styleable.DragSortListView, 0, 0);\n\n            mItemHeightCollapsed = Math.max(1, a.getDimensionPixelSize(\n                    R.styleable.DragSortListView_collapsed_height, 1));\n\n            mTrackDragSort = a.getBoolean(\n                    R.styleable.DragSortListView_track_drag_sort, false);\n\n            if (mTrackDragSort) {\n                mDragSortTracker = new DragSortTracker();\n            }\n\n            // alpha between 0 and 255, 0=transparent, 255=opaque\n            mFloatAlpha = a.getFloat(R.styleable.DragSortListView_float_alpha, mFloatAlpha);\n            mCurrFloatAlpha = mFloatAlpha;\n\n            mDragEnabled = a.getBoolean(R.styleable.DragSortListView_drag_enabled, mDragEnabled);\n\n            mSlideRegionFrac = Math.max(0.0f,\n                    Math.min(1.0f, 1.0f - a.getFloat(\n                            R.styleable.DragSortListView_slide_shuffle_speed,\n                            0.75f)));\n\n            mAnimate = mSlideRegionFrac > 0.0f;\n\n            float frac = a.getFloat(\n                    R.styleable.DragSortListView_drag_scroll_start,\n                    mDragUpScrollStartFrac);\n\n            setDragScrollStart(frac);\n\n            mMaxScrollSpeed = a.getFloat(\n                    R.styleable.DragSortListView_max_drag_scroll_speed,\n                    mMaxScrollSpeed);\n\n            removeAnimDuration = a.getInt(\n                    R.styleable.DragSortListView_remove_animation_duration,\n                    removeAnimDuration);\n\n            dropAnimDuration = a.getInt(\n                    R.styleable.DragSortListView_drop_animation_duration,\n                    dropAnimDuration);\n\n            boolean useDefault = a.getBoolean(\n                    R.styleable.DragSortListView_use_default_controller,\n                    true);\n\n            if (useDefault) {\n                boolean removeEnabled = a.getBoolean(\n                        R.styleable.DragSortListView_remove_enabled,\n                        false);\n                int removeMode = a.getInt(\n                        R.styleable.DragSortListView_remove_mode,\n                        DragSortController.FLING_REMOVE);\n                boolean sortEnabled = a.getBoolean(\n                        R.styleable.DragSortListView_sort_enabled,\n                        true);\n                int dragInitMode = a.getInt(\n                        R.styleable.DragSortListView_drag_start_mode,\n                        DragSortController.ON_DOWN);\n                int dragHandleId = a.getResourceId(\n                        R.styleable.DragSortListView_drag_handle_id,\n                        0);\n                int flingHandleId = a.getResourceId(\n                        R.styleable.DragSortListView_fling_handle_id,\n                        0);\n                int clickRemoveId = a.getResourceId(\n                        R.styleable.DragSortListView_click_remove_id,\n                        0);\n                int bgColor = a.getColor(\n                        R.styleable.DragSortListView_float_background_color,\n                        Color.BLACK);\n\n                DragSortController controller = new DragSortController(\n                        this, dragHandleId, dragInitMode, removeMode,\n                        clickRemoveId, flingHandleId);\n                controller.setRemoveEnabled(removeEnabled);\n                controller.setSortEnabled(sortEnabled);\n                controller.setBackgroundColor(bgColor);\n\n                mFloatViewManager = controller;\n                setOnTouchListener(controller);\n            }\n\n            a.recycle();\n        }\n\n        mDragScroller = new DragScroller();\n\n        float smoothness = 0.5f;\n        if (removeAnimDuration > 0) {\n            mRemoveAnimator = new RemoveAnimator(smoothness, removeAnimDuration);\n        }\n        // mLiftAnimator = new LiftAnimator(smoothness, 100);\n        if (dropAnimDuration > 0) {\n            mDropAnimator = new DropAnimator(smoothness, dropAnimDuration);\n        }\n\n        mCancelEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0f, 0f, 0f, 0f, 0, 0f,\n                0f, 0, 0);\n\n        // construct the dataset observer\n        mObserver = new DataSetObserver() {\n            private void cancel() {\n                if (mDragState == DRAGGING) {\n                    cancelDrag();\n                }\n            }\n\n            @Override\n            public void onChanged() {\n                cancel();\n            }\n\n            @Override\n            public void onInvalidated() {\n                cancel();\n            }\n        };\n    }\n\n    /**\n     * Usually called from a FloatViewManager. The float alpha\n     * will be reset to the xml-defined value every time a drag\n     * is stopped.\n     */\n    public void setFloatAlpha(float alpha) {\n        mCurrFloatAlpha = alpha;\n    }\n\n    public float getFloatAlpha() {\n        return mCurrFloatAlpha;\n    }\n\n    /**\n     * Set maximum drag scroll speed in positions/second. Only applies\n     * if using default ScrollSpeedProfile.\n     * \n     * @param max Maximum scroll speed.\n     */\n    public void setMaxScrollSpeed(float max) {\n        mMaxScrollSpeed = max;\n    }\n\n    /**\n     * For each DragSortListView Listener interface implemented by\n     * <code>adapter</code>, this method calls the appropriate\n     * set*Listener method with <code>adapter</code> as the argument.\n     * \n     * @param adapter The ListAdapter providing data to back\n     * DragSortListView.\n     *\n     * @see android.widget.ListView#setAdapter(android.widget.ListAdapter)\n     */\n    @Override\n    public void setAdapter(ListAdapter adapter) {\n        if (adapter != null) {\n            mAdapterWrapper = new AdapterWrapper(adapter);\n            adapter.registerDataSetObserver(mObserver);\n\n            if (adapter instanceof DropListener) {\n                setDropListener((DropListener) adapter);\n            }\n            if (adapter instanceof DragListener) {\n                setDragListener((DragListener) adapter);\n            }\n            if (adapter instanceof RemoveListener) {\n                setRemoveListener((RemoveListener) adapter);\n            }\n        } else {\n            mAdapterWrapper = null;\n        }\n\n        super.setAdapter(mAdapterWrapper);\n    }\n\n    /**\n     * As opposed to {@link ListView#getAdapter()}, which returns\n     * a heavily wrapped ListAdapter (DragSortListView wraps the\n     * input ListAdapter {\\emph and} ListView wraps the wrapped one).\n     *\n     * @return The ListAdapter set as the argument of {@link setAdapter()}\n     */\n    public ListAdapter getInputAdapter() {\n        if (mAdapterWrapper == null) {\n            return null;\n        } else {\n            return mAdapterWrapper.getAdapter();\n        }\n    }\n\n    private class AdapterWrapper extends BaseAdapter {\n        private ListAdapter mAdapter;\n\n        public AdapterWrapper(ListAdapter adapter) {\n            super();\n            mAdapter = adapter;\n            \n            mAdapter.registerDataSetObserver(new DataSetObserver() {\n                public void onChanged() {\n                    notifyDataSetChanged();\n                }\n\n                public void onInvalidated() {\n                    notifyDataSetInvalidated();\n                }\n            });\n        }\n\n        public ListAdapter getAdapter() {\n            return mAdapter;\n        }\n\n        @Override\n        public long getItemId(int position) {\n            return mAdapter.getItemId(position);\n        }\n\n        @Override\n        public Object getItem(int position) {\n            return mAdapter.getItem(position);\n        }\n\n        @Override\n        public int getCount() {\n            return mAdapter.getCount();\n        }\n\n        @Override\n        public boolean areAllItemsEnabled() {\n            return mAdapter.areAllItemsEnabled();\n        }\n\n        @Override\n        public boolean isEnabled(int position) {\n            return mAdapter.isEnabled(position);\n        }\n        \n        @Override\n        public int getItemViewType(int position) {\n            return mAdapter.getItemViewType(position);\n        }\n\n        @Override\n        public int getViewTypeCount() {\n            return mAdapter.getViewTypeCount();\n        }\n        \n        @Override\n        public boolean hasStableIds() {\n            return mAdapter.hasStableIds();\n        }\n        \n        @Override\n        public boolean isEmpty() {\n            return mAdapter.isEmpty();\n        }\n\n\n        @Override\n        public View getView(int position, View convertView, ViewGroup parent) {\n\n            DragSortItemView v;\n            View child;\n            // Log.d(\"mobeta\",\n            // \"getView: position=\"+position+\" convertView=\"+convertView);\n            if (convertView != null) {\n                v = (DragSortItemView) convertView;\n                View oldChild = v.getChildAt(0);\n\n                child = mAdapter.getView(position, oldChild, DragSortListView.this);\n                if (child != oldChild) {\n                    // shouldn't get here if user is reusing convertViews\n                    // properly\n                    if (oldChild != null) {\n                        v.removeViewAt(0);\n                    }\n                    v.addView(child);\n                }\n            } else {\n                child = mAdapter.getView(position, null, DragSortListView.this);\n                if (child instanceof Checkable) {\n                    v = new DragSortItemViewCheckable(getContext());\n                } else {\n                    v = new DragSortItemView(getContext());\n                }\n                v.setLayoutParams(new AbsListView.LayoutParams(\n                        ViewGroup.LayoutParams.FILL_PARENT,\n                        ViewGroup.LayoutParams.WRAP_CONTENT));\n                v.addView(child);\n            }\n\n            // Set the correct item height given drag state; passed\n            // View needs to be measured if measurement is required.\n            adjustItem(position + getHeaderViewsCount(), v, true);\n\n            return v;\n        }\n    }\n\n    private void drawDivider(int expPosition, Canvas canvas) {\n\n        final Drawable divider = getDivider();\n        final int dividerHeight = getDividerHeight();\n        // Log.d(\"mobeta\", \"div=\"+divider+\" divH=\"+dividerHeight);\n\n        if (divider != null && dividerHeight != 0) {\n            final ViewGroup expItem = (ViewGroup) getChildAt(expPosition\n                    - getFirstVisiblePosition());\n            if (expItem != null) {\n                final int l = getPaddingLeft();\n                final int r = getWidth() - getPaddingRight();\n                final int t;\n                final int b;\n\n                final int childHeight = expItem.getChildAt(0).getHeight();\n\n                if (expPosition > mSrcPos) {\n                    t = expItem.getTop() + childHeight;\n                    b = t + dividerHeight;\n                } else {\n                    b = expItem.getBottom() - childHeight;\n                    t = b - dividerHeight;\n                }\n                // Log.d(\"mobeta\", \"l=\"+l+\" t=\"+t+\" r=\"+r+\" b=\"+b);\n\n                // Have to clip to support ColorDrawable on <= Gingerbread\n                canvas.save();\n                canvas.clipRect(l, t, r, b);\n                divider.setBounds(l, t, r, b);\n                divider.draw(canvas);\n                canvas.restore();\n            }\n        }\n    }\n\n    @Override\n    protected void dispatchDraw(Canvas canvas) {\n        super.dispatchDraw(canvas);\n\n        if (mDragState != IDLE) {\n            // draw the divider over the expanded item\n            if (mFirstExpPos != mSrcPos) {\n                drawDivider(mFirstExpPos, canvas);\n            }\n            if (mSecondExpPos != mFirstExpPos && mSecondExpPos != mSrcPos) {\n                drawDivider(mSecondExpPos, canvas);\n            }\n        }\n\n        if (mFloatView != null) {\n            // draw the float view over everything\n            final int w = mFloatView.getWidth();\n            final int h = mFloatView.getHeight();\n\n            int x = mFloatLoc.x;\n\n            int width = getWidth();\n            if (x < 0)\n                x = -x;\n            float alphaMod;\n            if (x < width) {\n                alphaMod = ((float) (width - x)) / ((float) width);\n                alphaMod *= alphaMod;\n            } else {\n                alphaMod = 0;\n            }\n\n            final int alpha = (int) (255f * mCurrFloatAlpha * alphaMod);\n\n            canvas.save();\n            // Log.d(\"mobeta\", \"clip rect bounds: \" + canvas.getClipBounds());\n            canvas.translate(mFloatLoc.x, mFloatLoc.y);\n            canvas.clipRect(0, 0, w, h);\n\n            // Log.d(\"mobeta\", \"clip rect bounds: \" + canvas.getClipBounds());\n            canvas.saveLayerAlpha(0, 0, w, h, alpha, Canvas.ALL_SAVE_FLAG);\n            mFloatView.draw(canvas);\n            canvas.restore();\n            canvas.restore();\n        }\n    }\n\n    private int getItemHeight(int position) {\n        View v = getChildAt(position - getFirstVisiblePosition());\n\n        if (v != null) {\n            // item is onscreen, just get the height of the View\n            return v.getHeight();\n        } else {\n            // item is offscreen. get child height and calculate\n            // item height based on current shuffle state\n            return calcItemHeight(position, getChildHeight(position));\n        }\n    }\n\n    private void printPosData() {\n        Log.d(\"mobeta\", \"mSrcPos=\" + mSrcPos + \" mFirstExpPos=\" + mFirstExpPos + \" mSecondExpPos=\"\n                + mSecondExpPos);\n    }\n\n    private class HeightCache {\n\n        private SparseIntArray mMap;\n        private ArrayList<Integer> mOrder;\n        private int mMaxSize;\n\n        public HeightCache(int size) {\n            mMap = new SparseIntArray(size);\n            mOrder = new ArrayList<Integer>(size);\n            mMaxSize = size;\n        }\n\n        /**\n         * Add item height at position if doesn't already exist.\n         */\n        public void add(int position, int height) {\n            int currHeight = mMap.get(position, -1);\n            if (currHeight != height) {\n                if (currHeight == -1) {\n                    if (mMap.size() == mMaxSize) {\n                        // remove oldest entry\n                        mMap.delete(mOrder.remove(0));\n                    }\n                } else {\n                    // move position to newest slot\n                    mOrder.remove((Integer) position);\n                }\n                mMap.put(position, height);\n                mOrder.add(position);\n            }\n        }\n\n        public int get(int position) {\n            return mMap.get(position, -1);\n        }\n\n        public void clear() {\n            mMap.clear();\n            mOrder.clear();\n        }\n\n    }\n\n    /**\n     * Get the shuffle edge for item at position when top of\n     * item is at y-coord top. Assumes that current item heights\n     * are consistent with current float view location and\n     * thus expanded positions and slide fraction. i.e. Should not be\n     * called between update of expanded positions/slide fraction\n     * and layoutChildren.\n     *\n     * @param position \n     * @param top\n     * @param height Height of item at position. If -1, this function\n     * calculates this height.\n     *\n     * @return Shuffle line between position-1 and position (for\n     * the given view of the list; that is, for when top of item at\n     * position has y-coord of given `top`). If\n     * floating View (treated as horizontal line) is dropped\n     * immediately above this line, it lands in position-1. If\n     * dropped immediately below this line, it lands in position.\n     */\n    private int getShuffleEdge(int position, int top) {\n\n        final int numHeaders = getHeaderViewsCount();\n        final int numFooters = getFooterViewsCount();\n\n        // shuffle edges are defined between items that can be\n        // dragged; there are N-1 of them if there are N draggable\n        // items.\n\n        if (position <= numHeaders || (position >= getCount() - numFooters)) {\n            return top;\n        }\n\n        int divHeight = getDividerHeight();\n\n        int edge;\n\n        int maxBlankHeight = mFloatViewHeight - mItemHeightCollapsed;\n        int childHeight = getChildHeight(position);\n        int itemHeight = getItemHeight(position);\n\n        // first calculate top of item given that floating View is\n        // centered over src position\n        int otop = top;\n        if (mSecondExpPos <= mSrcPos) {\n            // items are expanded on and/or above the source position\n\n            if (position == mSecondExpPos && mFirstExpPos != mSecondExpPos) {\n                if (position == mSrcPos) {\n                    otop = top + itemHeight - mFloatViewHeight;\n                } else {\n                    int blankHeight = itemHeight - childHeight;\n                    otop = top + blankHeight - maxBlankHeight;\n                }\n            } else if (position > mSecondExpPos && position <= mSrcPos) {\n                otop = top - maxBlankHeight;\n            }\n\n        } else {\n            // items are expanded on and/or below the source position\n\n            if (position > mSrcPos && position <= mFirstExpPos) {\n                otop = top + maxBlankHeight;\n            } else if (position == mSecondExpPos && mFirstExpPos != mSecondExpPos) {\n                int blankHeight = itemHeight - childHeight;\n                otop = top + blankHeight;\n            }\n        }\n\n        // otop is set\n        if (position <= mSrcPos) {\n            edge = otop + (mFloatViewHeight - divHeight - getChildHeight(position - 1)) / 2;\n        } else {\n            edge = otop + (childHeight - divHeight - mFloatViewHeight) / 2;\n        }\n\n        return edge;\n    }\n\n    private boolean updatePositions() {\n\n        final int first = getFirstVisiblePosition();\n        int startPos = mFirstExpPos;\n        View startView = getChildAt(startPos - first);\n\n        if (startView == null) {\n            startPos = first + getChildCount() / 2;\n            startView = getChildAt(startPos - first);\n        }\n        int startTop = startView.getTop();\n\n        int itemHeight = startView.getHeight();\n\n        int edge = getShuffleEdge(startPos, startTop);\n        int lastEdge = edge;\n\n        int divHeight = getDividerHeight();\n\n        // Log.d(\"mobeta\", \"float mid=\"+mFloatViewMid);\n\n        int itemPos = startPos;\n        int itemTop = startTop;\n        if (mFloatViewMid < edge) {\n            // scanning up for float position\n            // Log.d(\"mobeta\", \"    edge=\"+edge);\n            while (itemPos >= 0) {\n                itemPos--;\n                itemHeight = getItemHeight(itemPos);\n\n                if (itemPos == 0) {\n                    edge = itemTop - divHeight - itemHeight;\n                    break;\n                }\n\n                itemTop -= itemHeight + divHeight;\n                edge = getShuffleEdge(itemPos, itemTop);\n                // Log.d(\"mobeta\", \"    edge=\"+edge);\n\n                if (mFloatViewMid >= edge) {\n                    break;\n                }\n\n                lastEdge = edge;\n            }\n        } else {\n            // scanning down for float position\n            // Log.d(\"mobeta\", \"    edge=\"+edge);\n            final int count = getCount();\n            while (itemPos < count) {\n                if (itemPos == count - 1) {\n                    edge = itemTop + divHeight + itemHeight;\n                    break;\n                }\n\n                itemTop += divHeight + itemHeight;\n                itemHeight = getItemHeight(itemPos + 1);\n                edge = getShuffleEdge(itemPos + 1, itemTop);\n                // Log.d(\"mobeta\", \"    edge=\"+edge);\n\n                // test for hit\n                if (mFloatViewMid < edge) {\n                    break;\n                }\n\n                lastEdge = edge;\n                itemPos++;\n            }\n        }\n\n        final int numHeaders = getHeaderViewsCount();\n        final int numFooters = getFooterViewsCount();\n\n        boolean updated = false;\n\n        int oldFirstExpPos = mFirstExpPos;\n        int oldSecondExpPos = mSecondExpPos;\n        float oldSlideFrac = mSlideFrac;\n\n        if (mAnimate) {\n            int edgeToEdge = Math.abs(edge - lastEdge);\n\n            int edgeTop, edgeBottom;\n            if (mFloatViewMid < edge) {\n                edgeBottom = edge;\n                edgeTop = lastEdge;\n            } else {\n                edgeTop = edge;\n                edgeBottom = lastEdge;\n            }\n            // Log.d(\"mobeta\", \"edgeTop=\"+edgeTop+\" edgeBot=\"+edgeBottom);\n\n            int slideRgnHeight = (int) (0.5f * mSlideRegionFrac * edgeToEdge);\n            float slideRgnHeightF = (float) slideRgnHeight;\n            int slideEdgeTop = edgeTop + slideRgnHeight;\n            int slideEdgeBottom = edgeBottom - slideRgnHeight;\n\n            // Three regions\n            if (mFloatViewMid < slideEdgeTop) {\n                mFirstExpPos = itemPos - 1;\n                mSecondExpPos = itemPos;\n                mSlideFrac = 0.5f * ((float) (slideEdgeTop - mFloatViewMid)) / slideRgnHeightF;\n                // Log.d(\"mobeta\",\n                // \"firstExp=\"+mFirstExpPos+\" secExp=\"+mSecondExpPos+\" slideFrac=\"+mSlideFrac);\n            } else if (mFloatViewMid < slideEdgeBottom) {\n                mFirstExpPos = itemPos;\n                mSecondExpPos = itemPos;\n            } else {\n                mFirstExpPos = itemPos;\n                mSecondExpPos = itemPos + 1;\n                mSlideFrac = 0.5f * (1.0f + ((float) (edgeBottom - mFloatViewMid))\n                        / slideRgnHeightF);\n                // Log.d(\"mobeta\",\n                // \"firstExp=\"+mFirstExpPos+\" secExp=\"+mSecondExpPos+\" slideFrac=\"+mSlideFrac);\n            }\n\n        } else {\n            mFirstExpPos = itemPos;\n            mSecondExpPos = itemPos;\n        }\n\n        // correct for headers and footers\n        if (mFirstExpPos < numHeaders) {\n            itemPos = numHeaders;\n            mFirstExpPos = itemPos;\n            mSecondExpPos = itemPos;\n        } else if (mSecondExpPos >= getCount() - numFooters) {\n            itemPos = getCount() - numFooters - 1;\n            mFirstExpPos = itemPos;\n            mSecondExpPos = itemPos;\n        }\n\n        if (mFirstExpPos != oldFirstExpPos || mSecondExpPos != oldSecondExpPos\n                || mSlideFrac != oldSlideFrac) {\n            updated = true;\n        }\n\n        if (itemPos != mFloatPos) {\n            if (mDragListener != null) {\n                mDragListener.drag(mFloatPos - numHeaders, itemPos - numHeaders);\n            }\n\n            mFloatPos = itemPos;\n            updated = true;\n        }\n\n        return updated;\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n\n        if (mTrackDragSort) {\n            mDragSortTracker.appendState();\n        }\n    }\n\n    private class SmoothAnimator implements Runnable {\n        protected long mStartTime;\n\n        private float mDurationF;\n\n        private float mAlpha;\n        private float mA, mB, mC, mD;\n\n        private boolean mCanceled;\n\n        public SmoothAnimator(float smoothness, int duration) {\n            mAlpha = smoothness;\n            mDurationF = (float) duration;\n            mA = mD = 1f / (2f * mAlpha * (1f - mAlpha));\n            mB = mAlpha / (2f * (mAlpha - 1f));\n            mC = 1f / (1f - mAlpha);\n        }\n\n        public float transform(float frac) {\n            if (frac < mAlpha) {\n                return mA * frac * frac;\n            } else if (frac < 1f - mAlpha) {\n                return mB + mC * frac;\n            } else {\n                return 1f - mD * (frac - 1f) * (frac - 1f);\n            }\n        }\n\n        public void start() {\n            mStartTime = SystemClock.uptimeMillis();\n            mCanceled = false;\n            onStart();\n            post(this);\n        }\n\n        public void cancel() {\n            mCanceled = true;\n        }\n\n        public void onStart() {\n            // stub\n        }\n\n        public void onUpdate(float frac, float smoothFrac) {\n            // stub\n        }\n\n        public void onStop() {\n            // stub\n        }\n\n        @Override\n        public void run() {\n            if (mCanceled) {\n                return;\n            }\n\n            float fraction = ((float) (SystemClock.uptimeMillis() - mStartTime)) / mDurationF;\n\n            if (fraction >= 1f) {\n                onUpdate(1f, 1f);\n                onStop();\n            } else {\n                onUpdate(fraction, transform(fraction));\n                post(this);\n            }\n        }\n    }\n\n    /**\n     * Centers floating View under touch point.\n     */\n    private class LiftAnimator extends SmoothAnimator {\n\n        private float mInitDragDeltaY;\n        private float mFinalDragDeltaY;\n\n        public LiftAnimator(float smoothness, int duration) {\n            super(smoothness, duration);\n        }\n\n        @Override\n        public void onStart() {\n            mInitDragDeltaY = mDragDeltaY;\n            mFinalDragDeltaY = mFloatViewHeightHalf;\n        }\n\n        @Override\n        public void onUpdate(float frac, float smoothFrac) {\n            if (mDragState != DRAGGING) {\n                cancel();\n            } else {\n                mDragDeltaY = (int) (smoothFrac * mFinalDragDeltaY + (1f - smoothFrac)\n                        * mInitDragDeltaY);\n                mFloatLoc.y = mY - mDragDeltaY;\n                doDragFloatView(true);\n            }\n        }\n    }\n\n    /**\n     * Centers floating View over drop slot before destroying.\n     */\n    private class DropAnimator extends SmoothAnimator {\n\n        private int mDropPos;\n        private int srcPos;\n        private float mInitDeltaY;\n        private float mInitDeltaX;\n\n        public DropAnimator(float smoothness, int duration) {\n            super(smoothness, duration);\n        }\n\n        @Override\n        public void onStart() {\n            mDropPos = mFloatPos;\n            srcPos = mSrcPos;\n            mDragState = DROPPING;\n            mInitDeltaY = mFloatLoc.y - getTargetY();\n            mInitDeltaX = mFloatLoc.x - getPaddingLeft();\n        }\n\n        private int getTargetY() {\n            final int first = getFirstVisiblePosition();\n            final int otherAdjust = (mItemHeightCollapsed + getDividerHeight()) / 2;\n            View v = getChildAt(mDropPos - first);\n            int targetY = -1;\n            if (v != null) {\n                if (mDropPos == srcPos) {\n                    targetY = v.getTop();\n                } else if (mDropPos < srcPos) {\n                    // expanded down\n                    targetY = v.getTop() - otherAdjust;\n                } else {\n                    // expanded up\n                    targetY = v.getBottom() + otherAdjust - mFloatViewHeight;\n                }\n            } else {\n                // drop position is not on screen?? no animation\n                cancel();\n            }\n\n            return targetY;\n        }\n\n        @Override\n        public void onUpdate(float frac, float smoothFrac) {\n            final int targetY = getTargetY();\n            final int targetX = getPaddingLeft();\n            final float deltaY = mFloatLoc.y - targetY;\n            final float deltaX = mFloatLoc.x - targetX;\n            final float f = 1f - smoothFrac;\n            if (f < Math.abs(deltaY / mInitDeltaY) || f < Math.abs(deltaX / mInitDeltaX)) {\n                mFloatLoc.y = targetY + (int) (mInitDeltaY * f);\n                mFloatLoc.x = getPaddingLeft() + (int) (mInitDeltaX * f);\n                doDragFloatView(true);\n            }\n        }\n\n        @Override\n        public void onStop() {\n            dropFloatView();\n        }\n\n    }\n\n    /**\n     * Collapses expanded items.\n     */\n    private class RemoveAnimator extends SmoothAnimator {\n\n        private float mFloatLocX;\n        private float mFirstStartBlank;\n        private float mSecondStartBlank;\n\n        private int mFirstChildHeight = -1;\n        private int mSecondChildHeight = -1;\n\n        private int mFirstPos;\n        private int mSecondPos;\n        private int srcPos;\n\n        public RemoveAnimator(float smoothness, int duration) {\n            super(smoothness, duration);\n        }\n\n        @Override\n        public void onStart() {\n            mFirstChildHeight = -1;\n            mSecondChildHeight = -1;\n            mFirstPos = mFirstExpPos;\n            mSecondPos = mSecondExpPos;\n            srcPos = mSrcPos;\n            mDragState = REMOVING;\n\n            mFloatLocX = mFloatLoc.x;\n            if (mUseRemoveVelocity) {\n                float minVelocity = 2f * getWidth();\n                if (mRemoveVelocityX == 0) {\n                    mRemoveVelocityX = (mFloatLocX < 0 ? -1 : 1) * minVelocity;\n                } else {\n                    minVelocity *= 2;\n                    if (mRemoveVelocityX < 0 && mRemoveVelocityX > -minVelocity)\n                        mRemoveVelocityX = -minVelocity;\n                    else if (mRemoveVelocityX > 0 && mRemoveVelocityX < minVelocity)\n                        mRemoveVelocityX = minVelocity;\n                }\n            } else {\n                destroyFloatView();\n            }\n        }\n\n        @Override\n        public void onUpdate(float frac, float smoothFrac) {\n            float f = 1f - smoothFrac;\n\n            final int firstVis = getFirstVisiblePosition();\n            View item = getChildAt(mFirstPos - firstVis);\n            ViewGroup.LayoutParams lp;\n            int blank;\n\n            if (mUseRemoveVelocity) {\n                float dt = (float) (SystemClock.uptimeMillis() - mStartTime) / 1000;\n                if (dt == 0)\n                    return;\n                float dx = mRemoveVelocityX * dt;\n                int w = getWidth();\n                mRemoveVelocityX += (mRemoveVelocityX > 0 ? 1 : -1) * dt * w;\n                mFloatLocX += dx;\n                mFloatLoc.x = (int) mFloatLocX;\n                if (mFloatLocX < w && mFloatLocX > -w) {\n                    mStartTime = SystemClock.uptimeMillis();\n                    doDragFloatView(true);\n                    return;\n                }\n            }\n\n            if (item != null) {\n                if (mFirstChildHeight == -1) {\n                    mFirstChildHeight = getChildHeight(mFirstPos, item, false);\n                    mFirstStartBlank = (float) (item.getHeight() - mFirstChildHeight);\n                }\n                blank = Math.max((int) (f * mFirstStartBlank), 1);\n                lp = item.getLayoutParams();\n                lp.height = mFirstChildHeight + blank;\n                item.setLayoutParams(lp);\n            }\n            if (mSecondPos != mFirstPos) {\n                item = getChildAt(mSecondPos - firstVis);\n                if (item != null) {\n                    if (mSecondChildHeight == -1) {\n                        mSecondChildHeight = getChildHeight(mSecondPos, item, false);\n                        mSecondStartBlank = (float) (item.getHeight() - mSecondChildHeight);\n                    }\n                    blank = Math.max((int) (f * mSecondStartBlank), 1);\n                    lp = item.getLayoutParams();\n                    lp.height = mSecondChildHeight + blank;\n                    item.setLayoutParams(lp);\n                }\n            }\n        }\n\n        @Override\n        public void onStop() {\n            doRemoveItem();\n        }\n    }\n\n    public void removeItem(int which) {\n\n        mUseRemoveVelocity = false;\n        removeItem(which, 0);\n    }\n\n    /**\n     * Removes an item from the list and animates the removal.\n     *\n     * @param which Position to remove (NOTE: headers/footers ignored!\n     * this is a position in your input ListAdapter).\n     * @param velocityX \n     */\n    public void removeItem(int which, float velocityX) {\n        if (mDragState == IDLE || mDragState == DRAGGING) {\n\n            if (mDragState == IDLE) {\n                // called from outside drag-sort\n                mSrcPos = getHeaderViewsCount() + which;\n                mFirstExpPos = mSrcPos;\n                mSecondExpPos = mSrcPos;\n                mFloatPos = mSrcPos;\n                View v = getChildAt(mSrcPos - getFirstVisiblePosition());\n                if (v != null) {\n                    v.setVisibility(View.INVISIBLE);\n                }\n            }\n\n            mDragState = REMOVING;\n            mRemoveVelocityX = velocityX;\n\n            if (mInTouchEvent) {\n                switch (mCancelMethod) {\n                    case ON_TOUCH_EVENT:\n                        super.onTouchEvent(mCancelEvent);\n                        break;\n                    case ON_INTERCEPT_TOUCH_EVENT:\n                        super.onInterceptTouchEvent(mCancelEvent);\n                        break;\n                }\n            }\n\n            if (mRemoveAnimator != null) {\n                mRemoveAnimator.start();\n            } else {\n                doRemoveItem(which);\n            }\n        }\n    }\n\n    /**\n     * Move an item, bypassing the drag-sort process. Simply calls\n     * through to {@link DropListener#drop(int, int)}.\n     * \n     * @param from Position to move (NOTE: headers/footers ignored!\n     * this is a position in your input ListAdapter).\n     * @param to Target position (NOTE: headers/footers ignored!\n     * this is a position in your input ListAdapter).\n     */\n    public void moveItem(int from, int to) {\n        if (mDropListener != null) {\n            final int count = getInputAdapter().getCount();\n            if (from >= 0 && from < count && to >= 0 && to < count) {\n                mDropListener.drop(from, to);\n            }\n        }\n    }\n\n    /**\n     * Cancel a drag. Calls {@link #stopDrag(boolean, boolean)} with\n     * <code>true</code> as the first argument.\n     */\n    public void cancelDrag() {\n        if (mDragState == DRAGGING) {\n            mDragScroller.stopScrolling(true);\n            destroyFloatView();\n            clearPositions();\n            adjustAllItems();\n\n            if (mInTouchEvent) {\n                mDragState = STOPPED;\n            } else {\n                mDragState = IDLE;\n            }\n        }\n    }\n\n    private void clearPositions() {\n        mSrcPos = -1;\n        mFirstExpPos = -1;\n        mSecondExpPos = -1;\n        mFloatPos = -1;\n    }\n\n    private void dropFloatView() {\n        // must set to avoid cancelDrag being called from the\n        // DataSetObserver\n        mDragState = DROPPING;\n\n        if (mDropListener != null && mFloatPos >= 0 && mFloatPos < getCount()) {\n            final int numHeaders = getHeaderViewsCount();\n            mDropListener.drop(mSrcPos - numHeaders, mFloatPos - numHeaders);\n        }\n\n        destroyFloatView();\n\n        adjustOnReorder();\n        clearPositions();\n        adjustAllItems();\n\n        // now the drag is done\n        if (mInTouchEvent) {\n            mDragState = STOPPED;\n        } else {\n            mDragState = IDLE;\n        }\n    }\n\n    private void doRemoveItem() {\n        doRemoveItem(mSrcPos - getHeaderViewsCount());\n    }\n\n    /**\n     * Removes dragged item from the list. Calls RemoveListener.\n     */\n    private void doRemoveItem(int which) {\n        // must set to avoid cancelDrag being called from the\n        // DataSetObserver\n        mDragState = REMOVING;\n\n        // end it\n        if (mRemoveListener != null) {\n            mRemoveListener.remove(which);\n        }\n\n        destroyFloatView();\n\n        adjustOnReorder();\n        clearPositions();\n\n        // now the drag is done\n        if (mInTouchEvent) {\n            mDragState = STOPPED;\n        } else {\n            mDragState = IDLE;\n        }\n    }\n\n    private void adjustOnReorder() {\n        final int firstPos = getFirstVisiblePosition();\n        // Log.d(\"mobeta\", \"first=\"+firstPos+\" src=\"+mSrcPos);\n        if (mSrcPos < firstPos) {\n            // collapsed src item is off screen;\n            // adjust the scroll after item heights have been fixed\n            View v = getChildAt(0);\n            int top = 0;\n            if (v != null) {\n                top = v.getTop();\n            }\n            // Log.d(\"mobeta\", \"top=\"+top+\" fvh=\"+mFloatViewHeight);\n            setSelectionFromTop(firstPos - 1, top - getPaddingTop());\n        }\n    }\n\n    /**\n     * Stop a drag in progress. Pass <code>true</code> if you would\n     * like to remove the dragged item from the list.\n     *\n     * @param remove Remove the dragged item from the list. Calls\n     * a registered RemoveListener, if one exists. Otherwise, calls\n     * the DropListener, if one exists.\n     *\n     * @return True if the stop was successful. False if there is\n     * no floating View.\n     */\n    public boolean stopDrag(boolean remove) {\n        mUseRemoveVelocity = false;\n        return stopDrag(remove, 0);\n    }\n\n    public boolean stopDragWithVelocity(boolean remove, float velocityX) {\n\n        mUseRemoveVelocity = true;\n        return stopDrag(remove, velocityX);\n    }\n\n    public boolean stopDrag(boolean remove, float velocityX) {\n        if (mFloatView != null) {\n            mDragScroller.stopScrolling(true);\n\n            if (remove) {\n                removeItem(mSrcPos - getHeaderViewsCount(), velocityX);\n            } else {\n                if (mDropAnimator != null) {\n                    mDropAnimator.start();\n                } else {\n                    dropFloatView();\n                }\n            }\n\n            if (mTrackDragSort) {\n                mDragSortTracker.stopTracking();\n            }\n\n            return true;\n        } else {\n            // stop failed\n            return false;\n        }\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent ev) {\n        if (mIgnoreTouchEvent) {\n            mIgnoreTouchEvent = false;\n            return false;\n        }\n\n        if (!mDragEnabled) {\n            return super.onTouchEvent(ev);\n        }\n\n        boolean more = false;\n\n        boolean lastCallWasIntercept = mLastCallWasIntercept;\n        mLastCallWasIntercept = false;\n\n        if (!lastCallWasIntercept) {\n            saveTouchCoords(ev);\n        }\n\n        // if (mFloatView != null) {\n        if (mDragState == DRAGGING) {\n            onDragTouchEvent(ev);\n            more = true; // give us more!\n        } else {\n            // what if float view is null b/c we dropped in middle\n            // of drag touch event?\n\n            // if (mDragState != STOPPED) {\n            if (mDragState == IDLE) {\n                if (super.onTouchEvent(ev)) {\n                    more = true;\n                }\n            }\n\n            int action = ev.getAction() & MotionEvent.ACTION_MASK;\n\n            switch (action) {\n                case MotionEvent.ACTION_CANCEL:\n                case MotionEvent.ACTION_UP:\n                    doActionUpOrCancel();\n                    break;\n                default:\n                    if (more) {\n                        mCancelMethod = ON_TOUCH_EVENT;\n                    }\n            }\n        }\n\n        return more;\n    }\n\n    private void doActionUpOrCancel() {\n        mCancelMethod = NO_CANCEL;\n        mInTouchEvent = false;\n        if (mDragState == STOPPED) {\n            mDragState = IDLE;\n        }\n        mCurrFloatAlpha = mFloatAlpha;\n        mListViewIntercepted = false;\n        mChildHeightCache.clear();\n    }\n\n    private void saveTouchCoords(MotionEvent ev) {\n        int action = ev.getAction() & MotionEvent.ACTION_MASK;\n        if (action != MotionEvent.ACTION_DOWN) {\n            mLastX = mX;\n            mLastY = mY;\n        }\n        mX = (int) ev.getX();\n        mY = (int) ev.getY();\n        if (action == MotionEvent.ACTION_DOWN) {\n            mLastX = mX;\n            mLastY = mY;\n        }\n        mOffsetX = (int) ev.getRawX() - mX;\n        mOffsetY = (int) ev.getRawY() - mY;\n    }\n\n    public boolean listViewIntercepted() {\n        return mListViewIntercepted;\n    }\n\n    private boolean mListViewIntercepted = false;\n\n    @Override\n    public boolean onInterceptTouchEvent(MotionEvent ev) {\n        if (!mDragEnabled) {\n            return super.onInterceptTouchEvent(ev);\n        }\n\n        saveTouchCoords(ev);\n        mLastCallWasIntercept = true;\n\n        int action = ev.getAction() & MotionEvent.ACTION_MASK;\n\n        if (action == MotionEvent.ACTION_DOWN) {\n            if (mDragState != IDLE) {\n                // intercept and ignore\n                mIgnoreTouchEvent = true;\n                return true;\n            }\n            mInTouchEvent = true;\n        }\n\n        boolean intercept = false;\n\n        // the following deals with calls to super.onInterceptTouchEvent\n        if (mFloatView != null) {\n            // super's touch event canceled in startDrag\n            intercept = true;\n        } else {\n            if (super.onInterceptTouchEvent(ev)) {\n                mListViewIntercepted = true;\n                intercept = true;\n            }\n\n            switch (action) {\n                case MotionEvent.ACTION_CANCEL:\n                case MotionEvent.ACTION_UP:\n                    doActionUpOrCancel();\n                    break;\n                default:\n                    if (intercept) {\n                        mCancelMethod = ON_TOUCH_EVENT;\n                    } else {\n                        mCancelMethod = ON_INTERCEPT_TOUCH_EVENT;\n                    }\n            }\n        }\n\n        if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {\n            mInTouchEvent = false;\n        }\n\n        return intercept;\n    }\n\n    /**\n     * Set the width of each drag scroll region by specifying\n     * a fraction of the ListView height.\n     *\n     * @param heightFraction Fraction of ListView height. Capped at\n     * 0.5f.\n     * \n     */\n    public void setDragScrollStart(float heightFraction) {\n        setDragScrollStarts(heightFraction, heightFraction);\n    }\n\n    /**\n     * Set the width of each drag scroll region by specifying\n     * a fraction of the ListView height.\n     *\n     * @param upperFrac Fraction of ListView height for up-scroll bound.\n     * Capped at 0.5f.\n     * @param lowerFrac Fraction of ListView height for down-scroll bound.\n     * Capped at 0.5f.\n     * \n     */\n    public void setDragScrollStarts(float upperFrac, float lowerFrac) {\n        if (lowerFrac > 0.5f) {\n            mDragDownScrollStartFrac = 0.5f;\n        } else {\n            mDragDownScrollStartFrac = lowerFrac;\n        }\n\n        if (upperFrac > 0.5f) {\n            mDragUpScrollStartFrac = 0.5f;\n        } else {\n            mDragUpScrollStartFrac = upperFrac;\n        }\n\n        if (getHeight() != 0) {\n            updateScrollStarts();\n        }\n    }\n\n    private void continueDrag(int x, int y) {\n\n        // proposed position\n        mFloatLoc.x = x - mDragDeltaX;\n        mFloatLoc.y = y - mDragDeltaY;\n\n        doDragFloatView(true);\n\n        int minY = Math.min(y, mFloatViewMid + mFloatViewHeightHalf);\n        int maxY = Math.max(y, mFloatViewMid - mFloatViewHeightHalf);\n\n        // get the current scroll direction\n        int currentScrollDir = mDragScroller.getScrollDir();\n\n        if (minY > mLastY && minY > mDownScrollStartY && currentScrollDir != DragScroller.DOWN) {\n            // dragged down, it is below the down scroll start and it is not\n            // scrolling up\n\n            if (currentScrollDir != DragScroller.STOP) {\n                // moved directly from up scroll to down scroll\n                mDragScroller.stopScrolling(true);\n            }\n\n            // start scrolling down\n            mDragScroller.startScrolling(DragScroller.DOWN);\n        } else if (maxY < mLastY && maxY < mUpScrollStartY && currentScrollDir != DragScroller.UP) {\n            // dragged up, it is above the up scroll start and it is not\n            // scrolling up\n\n            if (currentScrollDir != DragScroller.STOP) {\n                // moved directly from down scroll to up scroll\n                mDragScroller.stopScrolling(true);\n            }\n\n            // start scrolling up\n            mDragScroller.startScrolling(DragScroller.UP);\n        }\n        else if (maxY >= mUpScrollStartY && minY <= mDownScrollStartY\n                && mDragScroller.isScrolling()) {\n            // not in the upper nor in the lower drag-scroll regions but it is\n            // still scrolling\n\n            mDragScroller.stopScrolling(true);\n        }\n    }\n\n    private void updateScrollStarts() {\n        final int padTop = getPaddingTop();\n        final int listHeight = getHeight() - padTop - getPaddingBottom();\n        float heightF = (float) listHeight;\n\n        mUpScrollStartYF = padTop + mDragUpScrollStartFrac * heightF;\n        mDownScrollStartYF = padTop + (1.0f - mDragDownScrollStartFrac) * heightF;\n\n        mUpScrollStartY = (int) mUpScrollStartYF;\n        mDownScrollStartY = (int) mDownScrollStartYF;\n\n        mDragUpScrollHeight = mUpScrollStartYF - padTop;\n        mDragDownScrollHeight = padTop + listHeight - mDownScrollStartYF;\n    }\n\n    @Override\n    protected void onSizeChanged(int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n        updateScrollStarts();\n    }\n\n    private void adjustAllItems() {\n        final int first = getFirstVisiblePosition();\n        final int last = getLastVisiblePosition();\n\n        int begin = Math.max(0, getHeaderViewsCount() - first);\n        int end = Math.min(last - first, getCount() - 1 - getFooterViewsCount() - first);\n\n        for (int i = begin; i <= end; ++i) {\n            View v = getChildAt(i);\n            if (v != null) {\n                adjustItem(first + i, v, false);\n            }\n        }\n    }\n\n    private void adjustItem(int position) {\n        View v = getChildAt(position - getFirstVisiblePosition());\n\n        if (v != null) {\n            adjustItem(position, v, false);\n        }\n    }\n\n    /**\n     * Sets layout param height, gravity, and visibility  on\n     * wrapped item.\n     */\n    private void adjustItem(int position, View v, boolean invalidChildHeight) {\n\n        // Adjust item height\n        ViewGroup.LayoutParams lp = v.getLayoutParams();\n        int height;\n        if (position != mSrcPos && position != mFirstExpPos && position != mSecondExpPos) {\n            height = ViewGroup.LayoutParams.WRAP_CONTENT;\n        } else {\n            height = calcItemHeight(position, v, invalidChildHeight);\n        }\n\n        if (height != lp.height) {\n            lp.height = height;\n            v.setLayoutParams(lp);\n        }\n\n        // Adjust item gravity\n        if (position == mFirstExpPos || position == mSecondExpPos) {\n            if (position < mSrcPos) {\n                ((DragSortItemView) v).setGravity(Gravity.BOTTOM);\n            } else if (position > mSrcPos) {\n                ((DragSortItemView) v).setGravity(Gravity.TOP);\n            }\n        }\n\n        // Finally adjust item visibility\n\n        int oldVis = v.getVisibility();\n        int vis = View.VISIBLE;\n\n        if (position == mSrcPos && mFloatView != null) {\n            vis = View.INVISIBLE;\n        }\n\n        if (vis != oldVis) {\n            v.setVisibility(vis);\n        }\n    }\n\n    private int getChildHeight(int position) {\n        if (position == mSrcPos) {\n            return 0;\n        }\n\n        View v = getChildAt(position - getFirstVisiblePosition());\n\n        if (v != null) {\n            // item is onscreen, therefore child height is valid,\n            // hence the \"true\"\n            return getChildHeight(position, v, false);\n        } else {\n            // item is offscreen\n            // first check cache for child height at this position\n            int childHeight = mChildHeightCache.get(position);\n            if (childHeight != -1) {\n                // Log.d(\"mobeta\", \"found child height in cache!\");\n                return childHeight;\n            }\n\n            final ListAdapter adapter = getAdapter();\n            int type = adapter.getItemViewType(position);\n\n            // There might be a better place for checking for the following\n            final int typeCount = adapter.getViewTypeCount();\n            if (typeCount != mSampleViewTypes.length) {\n                mSampleViewTypes = new View[typeCount];\n            }\n\n            if (type >= 0) {\n                if (mSampleViewTypes[type] == null) {\n                    v = adapter.getView(position, null, this);\n                    mSampleViewTypes[type] = v;\n                } else {\n                    v = adapter.getView(position, mSampleViewTypes[type], this);\n                }\n            } else {\n                // type is HEADER_OR_FOOTER or IGNORE\n                v = adapter.getView(position, null, this);\n            }\n\n            // current child height is invalid, hence \"true\" below\n            childHeight = getChildHeight(position, v, true);\n\n            // cache it because this could have been expensive\n            mChildHeightCache.add(position, childHeight);\n\n            return childHeight;\n        }\n    }\n\n    private int getChildHeight(int position, View item, boolean invalidChildHeight) {\n        if (position == mSrcPos) {\n            return 0;\n        }\n\n        View child;\n        if (position < getHeaderViewsCount() || position >= getCount() - getFooterViewsCount()) {\n            child = item;\n        } else {\n            child = ((ViewGroup) item).getChildAt(0);\n        }\n\n        ViewGroup.LayoutParams lp = child.getLayoutParams();\n\n        if (lp != null) {\n            if (lp.height > 0) {\n                return lp.height;\n            }\n        }\n\n        int childHeight = child.getHeight();\n\n        if (childHeight == 0 || invalidChildHeight) {\n            measureItem(child);\n            childHeight = child.getMeasuredHeight();\n        }\n\n        return childHeight;\n    }\n\n    private int calcItemHeight(int position, View item, boolean invalidChildHeight) {\n        return calcItemHeight(position, getChildHeight(position, item, invalidChildHeight));\n    }\n\n    private int calcItemHeight(int position, int childHeight) {\n\n        int divHeight = getDividerHeight();\n\n        boolean isSliding = mAnimate && mFirstExpPos != mSecondExpPos;\n        int maxNonSrcBlankHeight = mFloatViewHeight - mItemHeightCollapsed;\n        int slideHeight = (int) (mSlideFrac * maxNonSrcBlankHeight);\n\n        int height;\n\n        if (position == mSrcPos) {\n            if (mSrcPos == mFirstExpPos) {\n                if (isSliding) {\n                    height = slideHeight + mItemHeightCollapsed;\n                } else {\n                    height = mFloatViewHeight;\n                }\n            } else if (mSrcPos == mSecondExpPos) {\n                // if gets here, we know an item is sliding\n                height = mFloatViewHeight - slideHeight;\n            } else {\n                height = mItemHeightCollapsed;\n            }\n        } else if (position == mFirstExpPos) {\n            if (isSliding) {\n                height = childHeight + slideHeight;\n            } else {\n                height = childHeight + maxNonSrcBlankHeight;\n            }\n        } else if (position == mSecondExpPos) {\n            // we know an item is sliding (b/c 2ndPos != 1stPos)\n            height = childHeight + maxNonSrcBlankHeight - slideHeight;\n        } else {\n            height = childHeight;\n        }\n\n        return height;\n    }\n\n    @Override\n    public void requestLayout() {\n        if (!mBlockLayoutRequests) {\n            super.requestLayout();\n        }\n    }\n\n    private int adjustScroll(int movePos, View moveItem, int oldFirstExpPos, int oldSecondExpPos) {\n        int adjust = 0;\n\n        final int childHeight = getChildHeight(movePos);\n\n        int moveHeightBefore = moveItem.getHeight();\n        int moveHeightAfter = calcItemHeight(movePos, childHeight);\n\n        int moveBlankBefore = moveHeightBefore;\n        int moveBlankAfter = moveHeightAfter;\n        if (movePos != mSrcPos) {\n            moveBlankBefore -= childHeight;\n            moveBlankAfter -= childHeight;\n        }\n\n        int maxBlank = mFloatViewHeight;\n        if (mSrcPos != mFirstExpPos && mSrcPos != mSecondExpPos) {\n            maxBlank -= mItemHeightCollapsed;\n        }\n\n        if (movePos <= oldFirstExpPos) {\n            if (movePos > mFirstExpPos) {\n                adjust += maxBlank - moveBlankAfter;\n            }\n        } else if (movePos == oldSecondExpPos) {\n            if (movePos <= mFirstExpPos) {\n                adjust += moveBlankBefore - maxBlank;\n            } else if (movePos == mSecondExpPos) {\n                adjust += moveHeightBefore - moveHeightAfter;\n            } else {\n                adjust += moveBlankBefore;\n            }\n        } else {\n            if (movePos <= mFirstExpPos) {\n                adjust -= maxBlank;\n            } else if (movePos == mSecondExpPos) {\n                adjust -= moveBlankAfter;\n            }\n        }\n\n        return adjust;\n    }\n\n    private void measureItem(View item) {\n        ViewGroup.LayoutParams lp = item.getLayoutParams();\n        if (lp == null) {\n            lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);\n            item.setLayoutParams(lp);\n        }\n        int wspec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec, getListPaddingLeft()\n                + getListPaddingRight(), lp.width);\n        int hspec;\n        if (lp.height > 0) {\n            hspec = MeasureSpec.makeMeasureSpec(lp.height, MeasureSpec.EXACTLY);\n        } else {\n            hspec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);\n        }\n        item.measure(wspec, hspec);\n    }\n\n    private void measureFloatView() {\n        if (mFloatView != null) {\n            measureItem(mFloatView);\n            mFloatViewHeight = mFloatView.getMeasuredHeight();\n            mFloatViewHeightHalf = mFloatViewHeight / 2;\n        }\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec);\n        // Log.d(\"mobeta\", \"onMeasure called\");\n        if (mFloatView != null) {\n            if (mFloatView.isLayoutRequested()) {\n                measureFloatView();\n            }\n            mFloatViewOnMeasured = true; // set to false after layout\n        }\n        mWidthMeasureSpec = widthMeasureSpec;\n    }\n\n    @Override\n    protected void layoutChildren() {\n        super.layoutChildren();\n\n        if (mFloatView != null) {\n            if (mFloatView.isLayoutRequested() && !mFloatViewOnMeasured) {\n                // Have to measure here when usual android measure\n                // pass is skipped. This happens during a drag-sort\n                // when layoutChildren is called directly.\n                measureFloatView();\n            }\n            mFloatView.layout(0, 0, mFloatView.getMeasuredWidth(), mFloatView.getMeasuredHeight());\n            mFloatViewOnMeasured = false;\n        }\n    }\n\n    protected boolean onDragTouchEvent(MotionEvent ev) {\n        // we are in a drag\n        int action = ev.getAction() & MotionEvent.ACTION_MASK;\n\n        switch (ev.getAction() & MotionEvent.ACTION_MASK) {\n            case MotionEvent.ACTION_CANCEL:\n                if (mDragState == DRAGGING) {\n                    cancelDrag();\n                }\n                doActionUpOrCancel();\n                break;\n            case MotionEvent.ACTION_UP:\n                // Log.d(\"mobeta\", \"calling stopDrag from onDragTouchEvent\");\n                if (mDragState == DRAGGING) {\n                    stopDrag(false);\n                }\n                doActionUpOrCancel();\n                break;\n            case MotionEvent.ACTION_MOVE:\n                continueDrag((int) ev.getX(), (int) ev.getY());\n                break;\n        }\n\n        return true;\n    }\n\n    private boolean mFloatViewInvalidated = false;\n\n    private void invalidateFloatView() {\n        mFloatViewInvalidated = true;\n    }\n\n    /**\n     * Start a drag of item at <code>position</code> using the\n     * registered FloatViewManager. Calls through\n     * to {@link #startDrag(int,View,int,int,int)} after obtaining\n     * the floating View from the FloatViewManager.\n     *\n     * @param position Item to drag.\n     * @param dragFlags Flags that restrict some movements of the\n     * floating View. For example, set <code>dragFlags |= \n     * ~{@link #DRAG_NEG_X}</code> to allow dragging the floating\n     * View in all directions except off the screen to the left.\n     * @param deltaX Offset in x of the touch coordinate from the\n     * left edge of the floating View (i.e. touch-x minus float View\n     * left).\n     * @param deltaY Offset in y of the touch coordinate from the\n     * top edge of the floating View (i.e. touch-y minus float View\n     * top).\n     *\n     * @return True if the drag was started, false otherwise. This\n     * <code>startDrag</code> will fail if we are not currently in\n     * a touch event, there is no registered FloatViewManager,\n     * or the FloatViewManager returns a null View.\n     */\n    public boolean startDrag(int position, int dragFlags, int deltaX, int deltaY) {\n        if (!mInTouchEvent || mFloatViewManager == null) {\n            return false;\n        }\n\n        View v = mFloatViewManager.onCreateFloatView(position);\n\n        if (v == null) {\n            return false;\n        } else {\n            return startDrag(position, v, dragFlags, deltaX, deltaY);\n        }\n\n    }\n\n    /**\n     * Start a drag of item at <code>position</code> without using\n     * a FloatViewManager.\n     *\n     * @param position Item to drag.\n     * @param floatView Floating View.\n     * @param dragFlags Flags that restrict some movements of the\n     * floating View. For example, set <code>dragFlags |= \n     * ~{@link #DRAG_NEG_X}</code> to allow dragging the floating\n     * View in all directions except off the screen to the left.\n     * @param deltaX Offset in x of the touch coordinate from the\n     * left edge of the floating View (i.e. touch-x minus float View\n     * left).\n     * @param deltaY Offset in y of the touch coordinate from the\n     * top edge of the floating View (i.e. touch-y minus float View\n     * top).\n     *\n     * @return True if the drag was started, false otherwise. This\n     * <code>startDrag</code> will fail if we are not currently in\n     * a touch event, <code>floatView</code> is null, or there is\n     * a drag in progress.\n     */\n    public boolean startDrag(int position, View floatView, int dragFlags, int deltaX, int deltaY) {\n        if (mDragState != IDLE || !mInTouchEvent || mFloatView != null || floatView == null\n                || !mDragEnabled) {\n            return false;\n        }\n\n        if (getParent() != null) {\n            getParent().requestDisallowInterceptTouchEvent(true);\n        }\n\n        int pos = position + getHeaderViewsCount();\n        mFirstExpPos = pos;\n        mSecondExpPos = pos;\n        mSrcPos = pos;\n        mFloatPos = pos;\n\n        // mDragState = dragType;\n        mDragState = DRAGGING;\n        mDragFlags = 0;\n        mDragFlags |= dragFlags;\n\n        mFloatView = floatView;\n        measureFloatView(); // sets mFloatViewHeight\n\n        mDragDeltaX = deltaX;\n        mDragDeltaY = deltaY;\n        mDragStartY = mY;\n\n        // updateFloatView(mX - mDragDeltaX, mY - mDragDeltaY);\n        mFloatLoc.x = mX - mDragDeltaX;\n        mFloatLoc.y = mY - mDragDeltaY;\n\n        // set src item invisible\n        final View srcItem = getChildAt(mSrcPos - getFirstVisiblePosition());\n\n        if (srcItem != null) {\n            srcItem.setVisibility(View.INVISIBLE);\n        }\n\n        if (mTrackDragSort) {\n            mDragSortTracker.startTracking();\n        }\n\n        // once float view is created, events are no longer passed\n        // to ListView\n        switch (mCancelMethod) {\n            case ON_TOUCH_EVENT:\n                super.onTouchEvent(mCancelEvent);\n                break;\n            case ON_INTERCEPT_TOUCH_EVENT:\n                super.onInterceptTouchEvent(mCancelEvent);\n                break;\n        }\n\n        requestLayout();\n\n        if (mLiftAnimator != null) {\n            mLiftAnimator.start();\n        }\n\n        return true;\n    }\n\n    private void doDragFloatView(boolean forceInvalidate) {\n        int movePos = getFirstVisiblePosition() + getChildCount() / 2;\n        View moveItem = getChildAt(getChildCount() / 2);\n\n        if (moveItem == null) {\n            return;\n        }\n\n        doDragFloatView(movePos, moveItem, forceInvalidate);\n    }\n\n    private void doDragFloatView(int movePos, View moveItem, boolean forceInvalidate) {\n        mBlockLayoutRequests = true;\n\n        updateFloatView();\n\n        int oldFirstExpPos = mFirstExpPos;\n        int oldSecondExpPos = mSecondExpPos;\n\n        boolean updated = updatePositions();\n\n        if (updated) {\n            adjustAllItems();\n            int scroll = adjustScroll(movePos, moveItem, oldFirstExpPos, oldSecondExpPos);\n            // Log.d(\"mobeta\", \"  adjust scroll=\"+scroll);\n\n            setSelectionFromTop(movePos, moveItem.getTop() + scroll - getPaddingTop());\n            layoutChildren();\n        }\n\n        if (updated || forceInvalidate) {\n            invalidate();\n        }\n\n        mBlockLayoutRequests = false;\n    }\n\n    /**\n     * Sets float View location based on suggested values and\n     * constraints set in mDragFlags.\n     */\n    private void updateFloatView() {\n\n        if (mFloatViewManager != null) {\n            mTouchLoc.set(mX, mY);\n            mFloatViewManager.onDragFloatView(mFloatView, mFloatLoc, mTouchLoc);\n        }\n\n        final int floatX = mFloatLoc.x;\n        final int floatY = mFloatLoc.y;\n\n        // restrict x motion\n        int padLeft = getPaddingLeft();\n        if ((mDragFlags & DRAG_POS_X) == 0 && floatX > padLeft) {\n            mFloatLoc.x = padLeft;\n        } else if ((mDragFlags & DRAG_NEG_X) == 0 && floatX < padLeft) {\n            mFloatLoc.x = padLeft;\n        }\n\n        // keep floating view from going past bottom of last header view\n        final int numHeaders = getHeaderViewsCount();\n        final int numFooters = getFooterViewsCount();\n        final int firstPos = getFirstVisiblePosition();\n        final int lastPos = getLastVisiblePosition();\n\n        // Log.d(\"mobeta\",\n        // \"nHead=\"+numHeaders+\" nFoot=\"+numFooters+\" first=\"+firstPos+\" last=\"+lastPos);\n        int topLimit = getPaddingTop();\n        if (firstPos < numHeaders) {\n            topLimit = getChildAt(numHeaders - firstPos - 1).getBottom();\n        }\n        if ((mDragFlags & DRAG_NEG_Y) == 0) {\n            if (firstPos <= mSrcPos) {\n                topLimit = Math.max(getChildAt(mSrcPos - firstPos).getTop(), topLimit);\n            }\n        }\n        // bottom limit is top of first footer View or\n        // bottom of last item in list\n        int bottomLimit = getHeight() - getPaddingBottom();\n        if (lastPos >= getCount() - numFooters - 1) {\n            bottomLimit = getChildAt(getCount() - numFooters - 1 - firstPos).getBottom();\n        }\n        if ((mDragFlags & DRAG_POS_Y) == 0) {\n            if (lastPos >= mSrcPos) {\n                bottomLimit = Math.min(getChildAt(mSrcPos - firstPos).getBottom(), bottomLimit);\n            }\n        }\n\n        // Log.d(\"mobeta\", \"dragView top=\" + (y - mDragDeltaY));\n        // Log.d(\"mobeta\", \"limit=\" + limit);\n        // Log.d(\"mobeta\", \"mDragDeltaY=\" + mDragDeltaY);\n\n        if (floatY < topLimit) {\n            mFloatLoc.y = topLimit;\n        } else if (floatY + mFloatViewHeight > bottomLimit) {\n            mFloatLoc.y = bottomLimit - mFloatViewHeight;\n        }\n\n        // get y-midpoint of floating view (constrained to ListView bounds)\n        mFloatViewMid = mFloatLoc.y + mFloatViewHeightHalf;\n    }\n\n    private void destroyFloatView() {\n        if (mFloatView != null) {\n            mFloatView.setVisibility(GONE);\n            if (mFloatViewManager != null) {\n                mFloatViewManager.onDestroyFloatView(mFloatView);\n            }\n            mFloatView = null;\n            invalidate();\n        }\n    }\n\n    /**\n     * Interface for customization of the floating View appearance\n     * and dragging behavior. Implement\n     * your own and pass it to {@link #setFloatViewManager}. If\n     * your own is not passed, the default {@link SimpleFloatViewManager}\n     * implementation is used.\n     */\n    public interface FloatViewManager {\n        /**\n         * Return the floating View for item at <code>position</code>.\n         * DragSortListView will measure and layout this View for you,\n         * so feel free to just inflate it. You can help DSLV by\n         * setting some {@link ViewGroup.LayoutParams} on this View;\n         * otherwise it will set some for you (with a width of FILL_PARENT\n         * and a height of WRAP_CONTENT).\n         *\n         * @param position Position of item to drag (NOTE:\n         * <code>position</code> excludes header Views; thus, if you\n         * want to call {@link ListView#getChildAt(int)}, you will need\n         * to add {@link ListView#getHeaderViewsCount()} to the index).\n         *\n         * @return The View you wish to display as the floating View.\n         */\n        public View onCreateFloatView(int position);\n\n        /**\n         * Called whenever the floating View is dragged. Float View\n         * properties can be changed here. Also, the upcoming location\n         * of the float View can be altered by setting\n         * <code>location.x</code> and <code>location.y</code>.\n         *\n         * @param floatView The floating View.\n         * @param location The location (top-left; relative to DSLV\n         * top-left) at which the float\n         * View would like to appear, given the current touch location\n         * and the offset provided in {@link DragSortListView#startDrag}.\n         * @param touch The current touch location (relative to DSLV\n         * top-left).\n         * @param pendingScroll \n         */\n        public void onDragFloatView(View floatView, Point location, Point touch);\n\n        /**\n         * Called when the float View is dropped; lets you perform\n         * any necessary cleanup. The internal DSLV floating View\n         * reference is set to null immediately after this is called.\n         *\n         * @param floatView The floating View passed to\n         * {@link #onCreateFloatView(int)}.\n         */\n        public void onDestroyFloatView(View floatView);\n    }\n\n    public void setFloatViewManager(FloatViewManager manager) {\n        mFloatViewManager = manager;\n    }\n\n    public void setDragListener(DragListener l) {\n        mDragListener = l;\n    }\n\n    /**\n     * Allows for easy toggling between a DragSortListView\n     * and a regular old ListView. If enabled, items are\n     * draggable, where the drag init mode determines how\n     * items are lifted (see {@link setDragInitMode(int)}).\n     * If disabled, items cannot be dragged.\n     *\n     * @param enabled Set <code>true</code> to enable list\n     * item dragging\n     */\n    public void setDragEnabled(boolean enabled) {\n        mDragEnabled = enabled;\n    }\n\n    public boolean isDragEnabled() {\n        return mDragEnabled;\n    }\n\n    /**\n     * This better reorder your ListAdapter! DragSortListView does not do this\n     * for you; doesn't make sense to. Make sure\n     * {@link BaseAdapter#notifyDataSetChanged()} or something like it is called\n     * in your implementation. Furthermore, if you have a choiceMode other than\n     * none and the ListAdapter does not return true for\n     * {@link ListAdapter#hasStableIds()}, you will need to call\n     * {@link #moveCheckState(int, int)} to move the check boxes along with the\n     * list items.\n     * \n     * @param l\n     */\n    public void setDropListener(DropListener l) {\n        mDropListener = l;\n    }\n\n    /**\n     * Probably a no-brainer, but make sure that your remove listener\n     * calls {@link BaseAdapter#notifyDataSetChanged()} or something like it.\n     * When an item removal occurs, DragSortListView\n     * relies on a redraw of all the items to recover invisible views\n     * and such. Strictly speaking, if you remove something, your dataset\n     * has changed...\n     * \n     * @param l\n     */\n    public void setRemoveListener(RemoveListener l) {\n        mRemoveListener = l;\n    }\n\n    public interface DragListener {\n        public void drag(int from, int to);\n    }\n\n    /**\n     * Your implementation of this has to reorder your ListAdapter! \n     * Make sure to call\n     * {@link BaseAdapter#notifyDataSetChanged()} or something like it\n     * in your implementation.\n     * \n     * @author heycosmo\n     *\n     */\n    public interface DropListener {\n        public void drop(int from, int to);\n    }\n\n    /**\n     * Make sure to call\n     * {@link BaseAdapter#notifyDataSetChanged()} or something like it\n     * in your implementation.\n     * \n     * @author heycosmo\n     *\n     */\n    public interface RemoveListener {\n        public void remove(int which);\n    }\n\n    public interface DragSortListener extends DropListener, DragListener, RemoveListener {\n    }\n\n    public void setDragSortListener(DragSortListener l) {\n        setDropListener(l);\n        setDragListener(l);\n        setRemoveListener(l);\n    }\n\n    /**\n     * Completely custom scroll speed profile. Default increases linearly\n     * with position and is constant in time. Create your own by implementing\n     * {@link DragSortListView.DragScrollProfile}.\n     * \n     * @param ssp\n     */\n    public void setDragScrollProfile(DragScrollProfile ssp) {\n        if (ssp != null) {\n            mScrollProfile = ssp;\n        }\n    }\n\n    /**\n     * Use this to move the check state of an item from one position to another\n     * in a drop operation. If you have a choiceMode which is not none, this\n     * method must be called when the order of items changes in an underlying\n     * adapter which does not have stable IDs (see\n     * {@link ListAdapter#hasStableIds()}). This is because without IDs, the\n     * ListView has no way of knowing which items have moved where, and cannot\n     * update the check state accordingly.\n     * <p>\n     * A word of warning about a \"feature\" in Android that you may run into when\n     * dealing with movable list items: for an adapter that <em>does</em> have\n     * stable IDs, ListView will attempt to locate each item based on its ID and\n     * move the check state from the item's old position to the new position —\n     * which is all fine and good (and removes the need for calling this\n     * function), except for the half-baked approach. Apparently to save time in\n     * the naive algorithm used, ListView will only search for an ID in the\n     * close neighborhood of the old position. If the user moves an item too far\n     * (specifically, more than 20 rows away), ListView will give up and just\n     * force the item to be unchecked. So if there is a reasonable chance that\n     * the user will move items more than 20 rows away from the original\n     * position, you may wish to use an adapter with unstable IDs and call this\n     * method manually instead.\n     * \n     * @param from\n     * @param to\n     */\n    public void moveCheckState(int from, int to) {\n        // This method runs in O(n log n) time (n being the number of list\n        // items). The bottleneck is the call to AbsListView.setItemChecked,\n        // which is O(log n) because of the binary search involved in calling\n        // SparseBooleanArray.put().\n        //\n        // To improve on the average time, we minimize the number of calls to\n        // setItemChecked by only calling it for items that actually have a\n        // changed state. This is achieved by building a list containing the\n        // start and end of the \"runs\" of checked items, and then moving the\n        // runs. Note that moving an item from A to B is essentially a rotation\n        // of the range of items in [A, B]. Let's say we have\n        // . . U V X Y Z . .\n        // and move U after Z. This is equivalent to a rotation one step to the\n        // left within the range you are moving across:\n        // . . V X Y Z U . .\n        //\n        // So, to perform the move we enumerate all the runs within the move\n        // range, then rotate each run one step to the left or right (depending\n        // on move direction). For example, in the list:\n        // X X . X X X . X\n        // we have two runs. One begins at the last item of the list and wraps\n        // around to the beginning, ending at position 1. The second begins at\n        // position 3 and ends at position 5. To rotate a run, regardless of\n        // length, we only need to set a check mark at one end of the run, and\n        // clear a check mark at the other end:\n        // X . X X X . X X\n        SparseBooleanArray cip = getCheckedItemPositions();\n        int rangeStart = from;\n        int rangeEnd = to;\n        if (to < from) {\n            rangeStart = to;\n            rangeEnd = from;\n        }\n        rangeEnd += 1;\n\n        int[] runStart = new int[cip.size()];\n        int[] runEnd = new int[cip.size()];\n        int runCount = buildRunList(cip, rangeStart, rangeEnd, runStart, runEnd);\n        if (runCount == 1 && (runStart[0] == runEnd[0])) {\n            // Special case where all items are checked, we can never set any\n            // item to false like we do below.\n            return;\n        }\n\n        if (from < to) {\n            for (int i = 0; i != runCount; i++) {\n                setItemChecked(rotate(runStart[i], -1, rangeStart, rangeEnd), true);\n                setItemChecked(rotate(runEnd[i], -1, rangeStart, rangeEnd), false);\n            }\n\n        } else {\n            for (int i = 0; i != runCount; i++) {\n                setItemChecked(runStart[i], false);\n                setItemChecked(runEnd[i], true);\n            }\n        }\n    }\n\n    /**\n     * Use this when an item has been deleted, to move the check state of all\n     * following items up one step. If you have a choiceMode which is not none,\n     * this method must be called when the order of items changes in an\n     * underlying adapter which does not have stable IDs (see\n     * {@link ListAdapter#hasStableIds()}). This is because without IDs, the\n     * ListView has no way of knowing which items have moved where, and cannot\n     * update the check state accordingly.\n     * \n     * See also further comments on {@link #moveCheckState(int, int)}.\n     * \n     * @param position\n     */\n    public void removeCheckState(int position) {\n        SparseBooleanArray cip = getCheckedItemPositions();\n\n        if (cip.size() == 0)\n            return;\n        int[] runStart = new int[cip.size()];\n        int[] runEnd = new int[cip.size()];\n        int rangeStart = position;\n        int rangeEnd = cip.keyAt(cip.size() - 1) + 1;\n        int runCount = buildRunList(cip, rangeStart, rangeEnd, runStart, runEnd);\n        for (int i = 0; i != runCount; i++) {\n            if (!(runStart[i] == position || (runEnd[i] < runStart[i] && runEnd[i] > position))) {\n                // Only set a new check mark in front of this run if it does\n                // not contain the deleted position. If it does, we only need\n                // to make it one check mark shorter at the end.\n                setItemChecked(rotate(runStart[i], -1, rangeStart, rangeEnd), true);\n            }\n            setItemChecked(rotate(runEnd[i], -1, rangeStart, rangeEnd), false);\n        }\n    }\n\n    private static int buildRunList(SparseBooleanArray cip, int rangeStart,\n            int rangeEnd, int[] runStart, int[] runEnd) {\n        int runCount = 0;\n\n        int i = findFirstSetIndex(cip, rangeStart, rangeEnd);\n        if (i == -1)\n            return 0;\n\n        int position = cip.keyAt(i);\n        int currentRunStart = position;\n        int currentRunEnd = currentRunStart + 1;\n        for (i++; i < cip.size() && (position = cip.keyAt(i)) < rangeEnd; i++) {\n            if (!cip.valueAt(i)) // not checked => not interesting\n                continue;\n            if (position == currentRunEnd) {\n                currentRunEnd++;\n            } else {\n                runStart[runCount] = currentRunStart;\n                runEnd[runCount] = currentRunEnd;\n                runCount++;\n                currentRunStart = position;\n                currentRunEnd = position + 1;\n            }\n        }\n\n        if (currentRunEnd == rangeEnd) {\n            // rangeStart and rangeEnd are equivalent positions so to be\n            // consistent we translate them to the same integer value. That way\n            // we can check whether a run covers the entire range by just\n            // checking if the start equals the end position.\n            currentRunEnd = rangeStart;\n        }\n        runStart[runCount] = currentRunStart;\n        runEnd[runCount] = currentRunEnd;\n        runCount++;\n\n        if (runCount > 1) {\n            if (runStart[0] == rangeStart && runEnd[runCount - 1] == rangeStart) {\n                // The last run ends at the end of the range, and the first run\n                // starts at the beginning of the range. So they are actually\n                // part of the same run, except they wrap around the end of the\n                // range. To avoid adjacent runs, we need to merge them.\n                runStart[0] = runStart[runCount - 1];\n                runCount--;\n            }\n        }\n        return runCount;\n    }\n\n    private static int rotate(int value, int offset, int lowerBound, int upperBound) {\n        int windowSize = upperBound - lowerBound;\n\n        value += offset;\n        if (value < lowerBound) {\n            value += windowSize;\n        } else if (value >= upperBound) {\n            value -= windowSize;\n        }\n        return value;\n    }\n\n    private static int findFirstSetIndex(SparseBooleanArray sba, int rangeStart, int rangeEnd) {\n        int size = sba.size();\n        int i = insertionIndexForKey(sba, rangeStart);\n        while (i < size && sba.keyAt(i) < rangeEnd && !sba.valueAt(i))\n            i++;\n        if (i == size || sba.keyAt(i) >= rangeEnd)\n            return -1;\n        return i;\n    }\n\n    private static int insertionIndexForKey(SparseBooleanArray sba, int key) {\n        int low = 0;\n        int high = sba.size();\n        while (high - low > 0) {\n            int middle = (low + high) >> 1;\n            if (sba.keyAt(middle) < key)\n                low = middle + 1;\n            else\n                high = middle;\n        }\n        return low;\n    }\n\n    /**\n     * Interface for controlling\n     * scroll speed as a function of touch position and time. Use\n     * {@link DragSortListView#setDragScrollProfile(DragScrollProfile)} to\n     * set custom profile.\n     * \n     * @author heycosmo\n     *\n     */\n    public interface DragScrollProfile {\n        /**\n         * Return a scroll speed in pixels/millisecond. Always return a\n         * positive number.\n         * \n         * @param w Normalized position in scroll region (i.e. w \\in [0,1]).\n         * Small w typically means slow scrolling.\n         * @param t Time (in milliseconds) since start of scroll (handy if you\n         * want scroll acceleration).\n         * @return Scroll speed at position w and time t in pixels/ms.\n         */\n        float getSpeed(float w, long t);\n    }\n\n    private class DragScroller implements Runnable {\n\n        private boolean mAbort;\n\n        private long mPrevTime;\n        private long mCurrTime;\n\n        private int dy;\n        private float dt;\n        private long tStart;\n        private int scrollDir;\n\n        public final static int STOP = -1;\n        public final static int UP = 0;\n        public final static int DOWN = 1;\n\n        private float mScrollSpeed; // pixels per ms\n\n        private boolean mScrolling = false;\n\n        private int mLastHeader;\n        private int mFirstFooter;\n\n        public boolean isScrolling() {\n            return mScrolling;\n        }\n\n        public int getScrollDir() {\n            return mScrolling ? scrollDir : STOP;\n        }\n\n        public DragScroller() {\n        }\n\n        public void startScrolling(int dir) {\n            if (!mScrolling) {\n                // Debug.startMethodTracing(\"dslv-scroll\");\n                mAbort = false;\n                mScrolling = true;\n                tStart = SystemClock.uptimeMillis();\n                mPrevTime = tStart;\n                scrollDir = dir;\n                post(this);\n            }\n        }\n\n        public void stopScrolling(boolean now) {\n            if (now) {\n                DragSortListView.this.removeCallbacks(this);\n                mScrolling = false;\n            } else {\n                mAbort = true;\n            }\n\n            // Debug.stopMethodTracing();\n        }\n\n        @Override\n        public void run() {\n            if (mAbort) {\n                mScrolling = false;\n                return;\n            }\n\n            // Log.d(\"mobeta\", \"scroll\");\n\n            final int first = getFirstVisiblePosition();\n            final int last = getLastVisiblePosition();\n            final int count = getCount();\n            final int padTop = getPaddingTop();\n            final int listHeight = getHeight() - padTop - getPaddingBottom();\n\n            int minY = Math.min(mY, mFloatViewMid + mFloatViewHeightHalf);\n            int maxY = Math.max(mY, mFloatViewMid - mFloatViewHeightHalf);\n\n            if (scrollDir == UP) {\n                View v = getChildAt(0);\n                // Log.d(\"mobeta\", \"vtop=\"+v.getTop()+\" padtop=\"+padTop);\n                if (v == null) {\n                    mScrolling = false;\n                    return;\n                } else {\n                    if (first == 0 && v.getTop() == padTop) {\n                        mScrolling = false;\n                        return;\n                    }\n                }\n                mScrollSpeed = mScrollProfile.getSpeed((mUpScrollStartYF - maxY)\n                        / mDragUpScrollHeight, mPrevTime);\n            } else {\n                View v = getChildAt(last - first);\n                if (v == null) {\n                    mScrolling = false;\n                    return;\n                } else {\n                    if (last == count - 1 && v.getBottom() <= listHeight + padTop) {\n                        mScrolling = false;\n                        return;\n                    }\n                }\n                mScrollSpeed = -mScrollProfile.getSpeed((minY - mDownScrollStartYF)\n                        / mDragDownScrollHeight, mPrevTime);\n            }\n\n            mCurrTime = SystemClock.uptimeMillis();\n            dt = (float) (mCurrTime - mPrevTime);\n\n            // dy is change in View position of a list item; i.e. positive dy\n            // means user is scrolling up (list item moves down the screen,\n            // remember\n            // y=0 is at top of View).\n            dy = (int) Math.round(mScrollSpeed * dt);\n\n            int movePos;\n            if (dy >= 0) {\n                dy = Math.min(listHeight, dy);\n                movePos = first;\n            } else {\n                dy = Math.max(-listHeight, dy);\n                movePos = last;\n            }\n\n            final View moveItem = getChildAt(movePos - first);\n            int top = moveItem.getTop() + dy;\n\n            if (movePos == 0 && top > padTop) {\n                top = padTop;\n            }\n\n            // always do scroll\n            mBlockLayoutRequests = true;\n\n            setSelectionFromTop(movePos, top - padTop);\n            DragSortListView.this.layoutChildren();\n            invalidate();\n\n            mBlockLayoutRequests = false;\n\n            // scroll means relative float View movement\n            doDragFloatView(movePos, moveItem, false);\n\n            mPrevTime = mCurrTime;\n            // Log.d(\"mobeta\", \"  updated prevTime=\"+mPrevTime);\n\n            post(this);\n        }\n    }\n\n    private class DragSortTracker {\n        StringBuilder mBuilder = new StringBuilder();\n\n        File mFile;\n\n        private int mNumInBuffer = 0;\n        private int mNumFlushes = 0;\n\n        private boolean mTracking = false;\n\n        public DragSortTracker() {\n            File root = Environment.getExternalStorageDirectory();\n            mFile = new File(root, \"dslv_state.txt\");\n\n            if (!mFile.exists()) {\n                try {\n                    mFile.createNewFile();\n                    Log.d(\"mobeta\", \"file created\");\n                } catch (IOException e) {\n                    Log.w(\"mobeta\", \"Could not create dslv_state.txt\");\n                    Log.d(\"mobeta\", e.getMessage());\n                }\n            }\n\n        }\n\n        public void startTracking() {\n            mBuilder.append(\"<DSLVStates>\\n\");\n            mNumFlushes = 0;\n            mTracking = true;\n        }\n\n        public void appendState() {\n            if (!mTracking) {\n                return;\n            }\n\n            mBuilder.append(\"<DSLVState>\\n\");\n            final int children = getChildCount();\n            final int first = getFirstVisiblePosition();\n            mBuilder.append(\"    <Positions>\");\n            for (int i = 0; i < children; ++i) {\n                mBuilder.append(first + i).append(\",\");\n            }\n            mBuilder.append(\"</Positions>\\n\");\n\n            mBuilder.append(\"    <Tops>\");\n            for (int i = 0; i < children; ++i) {\n                mBuilder.append(getChildAt(i).getTop()).append(\",\");\n            }\n            mBuilder.append(\"</Tops>\\n\");\n            mBuilder.append(\"    <Bottoms>\");\n            for (int i = 0; i < children; ++i) {\n                mBuilder.append(getChildAt(i).getBottom()).append(\",\");\n            }\n            mBuilder.append(\"</Bottoms>\\n\");\n\n            mBuilder.append(\"    <FirstExpPos>\").append(mFirstExpPos).append(\"</FirstExpPos>\\n\");\n            mBuilder.append(\"    <FirstExpBlankHeight>\")\n                    .append(getItemHeight(mFirstExpPos) - getChildHeight(mFirstExpPos))\n                    .append(\"</FirstExpBlankHeight>\\n\");\n            mBuilder.append(\"    <SecondExpPos>\").append(mSecondExpPos).append(\"</SecondExpPos>\\n\");\n            mBuilder.append(\"    <SecondExpBlankHeight>\")\n                    .append(getItemHeight(mSecondExpPos) - getChildHeight(mSecondExpPos))\n                    .append(\"</SecondExpBlankHeight>\\n\");\n            mBuilder.append(\"    <SrcPos>\").append(mSrcPos).append(\"</SrcPos>\\n\");\n            mBuilder.append(\"    <SrcHeight>\").append(mFloatViewHeight + getDividerHeight())\n                    .append(\"</SrcHeight>\\n\");\n            mBuilder.append(\"    <ViewHeight>\").append(getHeight()).append(\"</ViewHeight>\\n\");\n            mBuilder.append(\"    <LastY>\").append(mLastY).append(\"</LastY>\\n\");\n            mBuilder.append(\"    <FloatY>\").append(mFloatViewMid).append(\"</FloatY>\\n\");\n            mBuilder.append(\"    <ShuffleEdges>\");\n            for (int i = 0; i < children; ++i) {\n                mBuilder.append(getShuffleEdge(first + i, getChildAt(i).getTop())).append(\",\");\n            }\n            mBuilder.append(\"</ShuffleEdges>\\n\");\n\n            mBuilder.append(\"</DSLVState>\\n\");\n            mNumInBuffer++;\n\n            if (mNumInBuffer > 1000) {\n                flush();\n                mNumInBuffer = 0;\n            }\n        }\n\n        public void flush() {\n            if (!mTracking) {\n                return;\n            }\n\n            // save to file on sdcard\n            try {\n                boolean append = true;\n                if (mNumFlushes == 0) {\n                    append = false;\n                }\n                FileWriter writer = new FileWriter(mFile, append);\n\n                writer.write(mBuilder.toString());\n                mBuilder.delete(0, mBuilder.length());\n\n                writer.flush();\n                writer.close();\n\n                mNumFlushes++;\n            } catch (IOException e) {\n                // do nothing\n            }\n        }\n\n        public void stopTracking() {\n            if (mTracking) {\n                mBuilder.append(\"</DSLVStates>\\n\");\n                flush();\n                mTracking = false;\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/mobeta/android/dslv/ResourceDragSortCursorAdapter.java",
    "content": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.mobeta.android.dslv;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.LayoutInflater;\n\n// taken from v4 rev. 10 ResourceCursorAdapter.java\n\n/**\n * Static library support version of the framework's {@link android.widget.ResourceCursorAdapter}.\n * Used to write apps that run on platforms prior to Android 3.0.  When running\n * on Android 3.0 or above, this implementation is still used; it does not try\n * to switch to the framework's implementation.  See the framework SDK\n * documentation for a class overview.\n */\npublic abstract class ResourceDragSortCursorAdapter extends DragSortCursorAdapter {\n    private int mLayout;\n\n    private int mDropDownLayout;\n    \n    private LayoutInflater mInflater;\n    \n    /**\n     * Constructor the enables auto-requery.\n     *\n     * @deprecated This option is discouraged, as it results in Cursor queries\n     * being performed on the application's UI thread and thus can cause poor\n     * responsiveness or even Application Not Responding errors.  As an alternative,\n     * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.\n     *\n     * @param context The context where the ListView associated with this adapter is running\n     * @param layout resource identifier of a layout file that defines the views\n     *            for this list item.  Unless you override them later, this will\n     *            define both the item views and the drop down views.\n     */\n    @Deprecated\n    public ResourceDragSortCursorAdapter(Context context, int layout, Cursor c) {\n        super(context, c);\n        mLayout = mDropDownLayout = layout;\n        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n    }\n    \n    /**\n     * Constructor with default behavior as per\n     * {@link CursorAdapter#CursorAdapter(Context, Cursor, boolean)}; it is recommended\n     * you not use this, but instead {@link #ResourceCursorAdapter(Context, int, Cursor, int)}.\n     * When using this constructor, {@link #FLAG_REGISTER_CONTENT_OBSERVER}\n     * will always be set.\n     *\n     * @param context The context where the ListView associated with this adapter is running\n     * @param layout resource identifier of a layout file that defines the views\n     *            for this list item.  Unless you override them later, this will\n     *            define both the item views and the drop down views.\n     * @param c The cursor from which to get the data.\n     * @param autoRequery If true the adapter will call requery() on the\n     *                    cursor whenever it changes so the most recent\n     *                    data is always displayed.  Using true here is discouraged.\n     */\n    public ResourceDragSortCursorAdapter(Context context, int layout, Cursor c, boolean autoRequery) {\n        super(context, c, autoRequery);\n        mLayout = mDropDownLayout = layout;\n        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n    }\n\n    /**\n     * Standard constructor.\n     *\n     * @param context The context where the ListView associated with this adapter is running\n     * @param layout Resource identifier of a layout file that defines the views\n     *            for this list item.  Unless you override them later, this will\n     *            define both the item views and the drop down views.\n     * @param c The cursor from which to get the data.\n     * @param flags Flags used to determine the behavior of the adapter,\n     * as per {@link CursorAdapter#CursorAdapter(Context, Cursor, int)}.\n     */\n    public ResourceDragSortCursorAdapter(Context context, int layout, Cursor c, int flags) {\n        super(context, c, flags);\n        mLayout = mDropDownLayout = layout;\n        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n    }\n\n    /**\n     * Inflates view(s) from the specified XML file.\n     * \n     * @see android.widget.CursorAdapter#newView(android.content.Context,\n     *      android.database.Cursor, ViewGroup)\n     */\n    @Override\n    public View newView(Context context, Cursor cursor, ViewGroup parent) {\n        return mInflater.inflate(mLayout, parent, false);\n    }\n\n    @Override\n    public View newDropDownView(Context context, Cursor cursor, ViewGroup parent) {\n        return mInflater.inflate(mDropDownLayout, parent, false);\n    }\n\n    /**\n     * <p>Sets the layout resource of the item views.</p>\n     *\n     * @param layout the layout resources used to create item views\n     */\n    public void setViewResource(int layout) {\n        mLayout = layout;\n    }\n    \n    /**\n     * <p>Sets the layout resource of the drop down views.</p>\n     *\n     * @param dropDownLayout the layout resources used to create drop down views\n     */\n    public void setDropDownViewResource(int dropDownLayout) {\n        mDropDownLayout = dropDownLayout;\n    }\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/mobeta/android/dslv/SimpleDragSortCursorAdapter.java",
    "content": "/*\n * Copyright (C) 2006 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.mobeta.android.dslv;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.view.View;\nimport android.widget.TextView;\nimport android.widget.ImageView;\n\n// taken from sdk/sources/android-16/android/widget/SimpleCursorAdapter.java\n\n/**\n * An easy adapter to map columns from a cursor to TextViews or ImageViews\n * defined in an XML file. You can specify which columns you want, which\n * views you want to display the columns, and the XML file that defines\n * the appearance of these views.\n *\n * Binding occurs in two phases. First, if a\n * {@link android.widget.SimpleCursorAdapter.ViewBinder} is available,\n * {@link ViewBinder#setViewValue(android.view.View, android.database.Cursor, int)}\n * is invoked. If the returned value is true, binding has occured. If the\n * returned value is false and the view to bind is a TextView,\n * {@link #setViewText(TextView, String)} is invoked. If the returned value\n * is false and the view to bind is an ImageView,\n * {@link #setViewImage(ImageView, String)} is invoked. If no appropriate\n * binding can be found, an {@link IllegalStateException} is thrown.\n *\n * If this adapter is used with filtering, for instance in an\n * {@link android.widget.AutoCompleteTextView}, you can use the\n * {@link android.widget.SimpleCursorAdapter.CursorToStringConverter} and the\n * {@link android.widget.FilterQueryProvider} interfaces\n * to get control over the filtering process. You can refer to\n * {@link #convertToString(android.database.Cursor)} and\n * {@link #runQueryOnBackgroundThread(CharSequence)} for more information.\n */\npublic class SimpleDragSortCursorAdapter extends ResourceDragSortCursorAdapter {\n    /**\n     * A list of columns containing the data to bind to the UI.\n     * This field should be made private, so it is hidden from the SDK.\n     * {@hide}\n     */\n    protected int[] mFrom;\n    /**\n     * A list of View ids representing the views to which the data must be bound.\n     * This field should be made private, so it is hidden from the SDK.\n     * {@hide}\n     */\n    protected int[] mTo;\n\n    private int mStringConversionColumn = -1;\n    private CursorToStringConverter mCursorToStringConverter;\n    private ViewBinder mViewBinder;\n\n    String[] mOriginalFrom;\n\n    /**\n     * Constructor the enables auto-requery.\n     *\n     * @deprecated This option is discouraged, as it results in Cursor queries\n     * being performed on the application's UI thread and thus can cause poor\n     * responsiveness or even Application Not Responding errors.  As an alternative,\n     * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.\n     */\n    @Deprecated\n    public SimpleDragSortCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {\n        super(context, layout, c);\n        mTo = to;\n        mOriginalFrom = from;\n        findColumns(c, from);\n    }\n\n    /**\n     * Standard constructor.\n     * \n     * @param context The context where the ListView associated with this\n     *            SimpleListItemFactory is running\n     * @param layout resource identifier of a layout file that defines the views\n     *            for this list item. The layout file should include at least\n     *            those named views defined in \"to\"\n     * @param c The database cursor.  Can be null if the cursor is not available yet.\n     * @param from A list of column names representing the data to bind to the UI.  Can be null \n     *            if the cursor is not available yet.\n     * @param to The views that should display column in the \"from\" parameter.\n     *            These should all be TextViews. The first N views in this list\n     *            are given the values of the first N columns in the from\n     *            parameter.  Can be null if the cursor is not available yet.\n     * @param flags Flags used to determine the behavior of the adapter,\n     * as per {@link CursorAdapter#CursorAdapter(Context, Cursor, int)}.\n     */\n    public SimpleDragSortCursorAdapter(Context context, int layout,\n            Cursor c, String[] from, int[] to, int flags) {\n        super(context, layout, c, flags);\n        mTo = to;\n        mOriginalFrom = from;\n        findColumns(c, from);\n    }\n\n    /**\n     * Binds all of the field names passed into the \"to\" parameter of the\n     * constructor with their corresponding cursor columns as specified in the\n     * \"from\" parameter.\n     *\n     * Binding occurs in two phases. First, if a\n     * {@link android.widget.SimpleCursorAdapter.ViewBinder} is available,\n     * {@link ViewBinder#setViewValue(android.view.View, android.database.Cursor, int)}\n     * is invoked. If the returned value is true, binding has occured. If the\n     * returned value is false and the view to bind is a TextView,\n     * {@link #setViewText(TextView, String)} is invoked. If the returned value is\n     * false and the view to bind is an ImageView,\n     * {@link #setViewImage(ImageView, String)} is invoked. If no appropriate\n     * binding can be found, an {@link IllegalStateException} is thrown.\n     *\n     * @throws IllegalStateException if binding cannot occur\n     * \n     * @see android.widget.CursorAdapter#bindView(android.view.View,\n     *      android.content.Context, android.database.Cursor)\n     * @see #getViewBinder()\n     * @see #setViewBinder(android.widget.SimpleCursorAdapter.ViewBinder)\n     * @see #setViewImage(ImageView, String)\n     * @see #setViewText(TextView, String)\n     */\n    @Override\n    public void bindView(View view, Context context, Cursor cursor) {\n        final ViewBinder binder = mViewBinder;\n        final int count = mTo.length;\n        final int[] from = mFrom;\n        final int[] to = mTo;\n\n        for (int i = 0; i < count; i++) {\n            final View v = view.findViewById(to[i]);\n            if (v != null) {\n                boolean bound = false;\n                if (binder != null) {\n                    bound = binder.setViewValue(v, cursor, from[i]);\n                }\n\n                if (!bound) {\n                    String text = cursor.getString(from[i]);\n                    if (text == null) {\n                        text = \"\";\n                    }\n\n                    if (v instanceof TextView) {\n                        setViewText((TextView) v, text);\n                    } else if (v instanceof ImageView) {\n                        setViewImage((ImageView) v, text);\n                    } else {\n                        throw new IllegalStateException(v.getClass().getName() + \" is not a \" +\n                                \" view that can be bounds by this SimpleCursorAdapter\");\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Returns the {@link ViewBinder} used to bind data to views.\n     *\n     * @return a ViewBinder or null if the binder does not exist\n     *\n     * @see #bindView(android.view.View, android.content.Context, android.database.Cursor)\n     * @see #setViewBinder(android.widget.SimpleCursorAdapter.ViewBinder)\n     */\n    public ViewBinder getViewBinder() {\n        return mViewBinder;\n    }\n\n    /**\n     * Sets the binder used to bind data to views.\n     *\n     * @param viewBinder the binder used to bind data to views, can be null to\n     *        remove the existing binder\n     *\n     * @see #bindView(android.view.View, android.content.Context, android.database.Cursor)\n     * @see #getViewBinder()\n     */\n    public void setViewBinder(ViewBinder viewBinder) {\n        mViewBinder = viewBinder;\n    }\n\n    /**\n     * Called by bindView() to set the image for an ImageView but only if\n     * there is no existing ViewBinder or if the existing ViewBinder cannot\n     * handle binding to an ImageView.\n     *\n     * By default, the value will be treated as an image resource. If the\n     * value cannot be used as an image resource, the value is used as an\n     * image Uri.\n     *\n     * Intended to be overridden by Adapters that need to filter strings\n     * retrieved from the database.\n     *\n     * @param v ImageView to receive an image\n     * @param value the value retrieved from the cursor\n     */\n    public void setViewImage(ImageView v, String value) {\n        try {\n            v.setImageResource(Integer.parseInt(value));\n        } catch (NumberFormatException nfe) {\n            v.setImageURI(Uri.parse(value));\n        }\n    }\n\n    /**\n     * Called by bindView() to set the text for a TextView but only if\n     * there is no existing ViewBinder or if the existing ViewBinder cannot\n     * handle binding to a TextView.\n     *\n     * Intended to be overridden by Adapters that need to filter strings\n     * retrieved from the database.\n     * \n     * @param v TextView to receive text\n     * @param text the text to be set for the TextView\n     */    \n    public void setViewText(TextView v, String text) {\n        v.setText(text);\n    }\n\n    /**\n     * Return the index of the column used to get a String representation\n     * of the Cursor.\n     *\n     * @return a valid index in the current Cursor or -1\n     *\n     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)\n     * @see #setStringConversionColumn(int) \n     * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)\n     * @see #getCursorToStringConverter()\n     */\n    public int getStringConversionColumn() {\n        return mStringConversionColumn;\n    }\n\n    /**\n     * Defines the index of the column in the Cursor used to get a String\n     * representation of that Cursor. The column is used to convert the\n     * Cursor to a String only when the current CursorToStringConverter\n     * is null.\n     *\n     * @param stringConversionColumn a valid index in the current Cursor or -1 to use the default\n     *        conversion mechanism\n     *\n     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)\n     * @see #getStringConversionColumn()\n     * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)\n     * @see #getCursorToStringConverter()\n     */\n    public void setStringConversionColumn(int stringConversionColumn) {\n        mStringConversionColumn = stringConversionColumn;\n    }\n\n    /**\n     * Returns the converter used to convert the filtering Cursor\n     * into a String.\n     *\n     * @return null if the converter does not exist or an instance of\n     *         {@link android.widget.SimpleCursorAdapter.CursorToStringConverter}\n     *\n     * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)\n     * @see #getStringConversionColumn()\n     * @see #setStringConversionColumn(int)\n     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)\n     */\n    public CursorToStringConverter getCursorToStringConverter() {\n        return mCursorToStringConverter;\n    }\n\n    /**\n     * Sets the converter  used to convert the filtering Cursor\n     * into a String.\n     *\n     * @param cursorToStringConverter the Cursor to String converter, or\n     *        null to remove the converter\n     *\n     * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter) \n     * @see #getStringConversionColumn()\n     * @see #setStringConversionColumn(int)\n     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)\n     */\n    public void setCursorToStringConverter(CursorToStringConverter cursorToStringConverter) {\n        mCursorToStringConverter = cursorToStringConverter;\n    }\n\n    /**\n     * Returns a CharSequence representation of the specified Cursor as defined\n     * by the current CursorToStringConverter. If no CursorToStringConverter\n     * has been set, the String conversion column is used instead. If the\n     * conversion column is -1, the returned String is empty if the cursor\n     * is null or Cursor.toString().\n     *\n     * @param cursor the Cursor to convert to a CharSequence\n     *\n     * @return a non-null CharSequence representing the cursor\n     */\n    @Override\n    public CharSequence convertToString(Cursor cursor) {\n        if (mCursorToStringConverter != null) {\n            return mCursorToStringConverter.convertToString(cursor);\n        } else if (mStringConversionColumn > -1) {\n            return cursor.getString(mStringConversionColumn);\n        }\n\n        return super.convertToString(cursor);\n    }\n\n    /**\n     * Create a map from an array of strings to an array of column-id integers in cursor c.\n     * If c is null, the array will be discarded.\n     *\n     * @param c the cursor to find the columns from\n     * @param from the Strings naming the columns of interest\n     */\n    private void findColumns(Cursor c, String[] from) {\n        if (c != null) {\n            int i;\n            int count = from.length;\n            if (mFrom == null || mFrom.length != count) {\n                mFrom = new int[count];\n            }\n            for (i = 0; i < count; i++) {\n                mFrom[i] = c.getColumnIndexOrThrow(from[i]);\n            }\n        } else {\n            mFrom = null;\n        }\n    }\n\n    @Override\n    public Cursor swapCursor(Cursor c) {\n        // super.swapCursor() will notify observers before we have\n        // a valid mapping, make sure we have a mapping before this\n        // happens\n        findColumns(c, mOriginalFrom);\n        return super.swapCursor(c);\n    }\n    \n    /**\n     * Change the cursor and change the column-to-view mappings at the same time.\n     *  \n     * @param c The database cursor.  Can be null if the cursor is not available yet.\n     * @param from A list of column names representing the data to bind to the UI.  Can be null \n     *            if the cursor is not available yet.\n     * @param to The views that should display column in the \"from\" parameter.\n     *            These should all be TextViews. The first N views in this list\n     *            are given the values of the first N columns in the from\n     *            parameter.  Can be null if the cursor is not available yet.\n     */\n    public void changeCursorAndColumns(Cursor c, String[] from, int[] to) {\n        mOriginalFrom = from;\n        mTo = to;\n        // super.changeCursor() will notify observers before we have\n        // a valid mapping, make sure we have a mapping before this\n        // happens\n        findColumns(c, mOriginalFrom);\n        super.changeCursor(c);\n    }\n\n    /**\n     * This class can be used by external clients of SimpleCursorAdapter\n     * to bind values fom the Cursor to views.\n     *\n     * You should use this class to bind values from the Cursor to views\n     * that are not directly supported by SimpleCursorAdapter or to\n     * change the way binding occurs for views supported by\n     * SimpleCursorAdapter.\n     *\n     * @see SimpleCursorAdapter#bindView(android.view.View, android.content.Context, android.database.Cursor)\n     * @see SimpleCursorAdapter#setViewImage(ImageView, String) \n     * @see SimpleCursorAdapter#setViewText(TextView, String)\n     */\n    public static interface ViewBinder {\n        /**\n         * Binds the Cursor column defined by the specified index to the specified view.\n         *\n         * When binding is handled by this ViewBinder, this method must return true.\n         * If this method returns false, SimpleCursorAdapter will attempts to handle\n         * the binding on its own.\n         *\n         * @param view the view to bind the data to\n         * @param cursor the cursor to get the data from\n         * @param columnIndex the column at which the data can be found in the cursor\n         *\n         * @return true if the data was bound to the view, false otherwise\n         */\n        boolean setViewValue(View view, Cursor cursor, int columnIndex);\n    }\n\n    /**\n     * This class can be used by external clients of SimpleCursorAdapter\n     * to define how the Cursor should be converted to a String.\n     *\n     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)\n     */\n    public static interface CursorToStringConverter {\n        /**\n         * Returns a CharSequence representing the specified Cursor.\n         *\n         * @param cursor the cursor for which a CharSequence representation\n         *        is requested\n         *\n         * @return a non-null CharSequence representing the cursor\n         */\n        CharSequence convertToString(Cursor cursor);\n    }\n\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-Android/src/com/mobeta/android/dslv/SimpleFloatViewManager.java",
    "content": "package com.mobeta.android.dslv;\n\nimport android.graphics.Bitmap;\nimport android.graphics.Point;\nimport android.graphics.Color;\nimport android.widget.ListView;\nimport android.widget.ImageView;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.util.Log;\n\n/**\n * Simple implementation of the FloatViewManager class. Uses list\n * items as they appear in the ListView to create the floating View.\n */\npublic class SimpleFloatViewManager implements DragSortListView.FloatViewManager {\n\n    private Bitmap mFloatBitmap;\n\n    private ImageView mImageView;\n\n    private int mFloatBGColor = Color.BLACK;\n\n    private ListView mListView;\n\n    public SimpleFloatViewManager(ListView lv) {\n        mListView = lv;\n    }\n\n    public void setBackgroundColor(int color) {\n        mFloatBGColor = color;\n    }\n\n    /**\n     * This simple implementation creates a Bitmap copy of the\n     * list item currently shown at ListView <code>position</code>.\n     */\n    @Override\n    public View onCreateFloatView(int position) {\n        // Guaranteed that this will not be null? I think so. Nope, got\n        // a NullPointerException once...\n        View v = mListView.getChildAt(position + mListView.getHeaderViewsCount() - mListView.getFirstVisiblePosition());\n\n        if (v == null) {\n            return null;\n        }\n\n        v.setPressed(false);\n\n        // Create a copy of the drawing cache so that it does not get\n        // recycled by the framework when the list tries to clean up memory\n        //v.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);\n        v.setDrawingCacheEnabled(true);\n        mFloatBitmap = Bitmap.createBitmap(v.getDrawingCache());\n        v.setDrawingCacheEnabled(false);\n\n        if (mImageView == null) {\n            mImageView = new ImageView(mListView.getContext());\n        }\n        mImageView.setBackgroundColor(mFloatBGColor);\n        mImageView.setPadding(0, 0, 0, 0);\n        mImageView.setImageBitmap(mFloatBitmap);\n        mImageView.setLayoutParams(new ViewGroup.LayoutParams(v.getWidth(), v.getHeight()));\n\n        return mImageView;\n    }\n\n    /**\n     * This does nothing\n     */\n    @Override\n    public void onDragFloatView(View floatView, Point position, Point touch) {\n        // do nothing\n    }\n\n    /**\n     * Removes the Bitmap from the ImageView created in\n     * onCreateFloatView() and tells the system to recycle it.\n     */\n    @Override\n    public void onDestroyFloatView(View floatView) {\n        ((ImageView) floatView).setImageDrawable(null);\n\n        mFloatBitmap.recycle();\n        mFloatBitmap = null;\n    }\n\n}\n\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo/GDAppDelegate.h",
    "content": "//\n//  GDAppDelegate.h\n//  GolfDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface GDAppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate>\n\n@property (strong, nonatomic) UIWindow *window;\n\n@property (strong, nonatomic) UITabBarController *tabBarController;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo/GDAppDelegate.m",
    "content": "//\n//  GDAppDelegate.m\n//  GolfDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import \"GDAppDelegate.h\"\n#import \"GDAppViewController.h\"\n#import \"GDDataViewController.h\"\n#import \"GDIconViewController.h\"\n\n#import <PebbleKit/PebbleKit.h>\n\n@interface GDAppDelegate () <PBPebbleCentralDelegate>\n@end\n\n@implementation GDAppDelegate {\n  PBWatch *_targetWatch;\n  GDAppViewController *_appViewController;\n  GDDataViewController *_dataViewController;\n  GDIconViewController *_iconViewController;\n}\n\n- (void)setTargetWatch:(PBWatch*)watch {\n  _targetWatch = watch;\n\n  // NOTE:\n  // For demonstration purposes, we start communicating with the watch immediately upon connection,\n  // because we are calling -appMessagesGetIsSupported: here, which implicitely opens the communication session.\n  // Real world apps should communicate only if the user is actively using the app, because there\n  // is one communication session that is shared between all 3rd party iOS apps.\n\n  // Test if the Pebble's firmware supports AppMessages / Golf:\n  [watch appMessagesGetIsSupported:^(PBWatch *watch, BOOL isAppMessagesSupported) {\n    if (isAppMessagesSupported) {\n      // Configure our communications channel to target the golf app:\n      [[PBPebbleCentral defaultCentral] setAppUUID:PBGolfUUID];\n      [_appViewController setTargetWatch:_targetWatch];\n      [_dataViewController setTargetWatch:_targetWatch];\n      [_iconViewController setTargetWatch:_targetWatch];\n\n      NSString *message = [NSString stringWithFormat:@\"Yay! %@ supports AppMessages :D\", [watch name]];\n      [[[UIAlertView alloc] initWithTitle:@\"Connected!\" message:message delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n    } else {\n      [_appViewController setTargetWatch:nil];\n      [_dataViewController setTargetWatch:nil];\n      [_iconViewController setTargetWatch:nil];\n\n      NSString *message = [NSString stringWithFormat:@\"Blegh... %@ does NOT support AppMessages :'(\", [watch name]];\n      [[[UIAlertView alloc] initWithTitle:@\"Connected...\" message:message delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n    }\n  }];\n}\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];\n  // Override point for customization after application launch.\n  _appViewController = [[GDAppViewController alloc] init];\n  _dataViewController = [[GDDataViewController alloc] init];\n  _iconViewController = [[GDIconViewController alloc] init];\n  UINavigationController *nav1 = [[UINavigationController alloc] initWithRootViewController:_appViewController];\n  nav1.tabBarItem.title = @\"App\";\n  nav1.tabBarItem.image = [UIImage imageNamed:@\"first\"];\n  UINavigationController *nav2 = [[UINavigationController alloc] initWithRootViewController:_dataViewController];\n  nav2.tabBarItem.title = @\"Data\";\n  nav2.tabBarItem.image = [UIImage imageNamed:@\"second\"];\n  UINavigationController *nav3 = [[UINavigationController alloc] initWithRootViewController:_iconViewController];\n  nav3.tabBarItem.title = @\"Icon\";\n  nav3.tabBarItem.image = [UIImage imageNamed:@\"second\"];\n  self.tabBarController = [[UITabBarController alloc] init];\n  self.tabBarController.viewControllers = @[nav1, nav2, nav3];\n  self.window.rootViewController = self.tabBarController;\n  [self.window makeKeyAndVisible];\n\n  // We'd like to get called when Pebbles connect and disconnect, so become the delegate of PBPebbleCentral:\n  [[PBPebbleCentral defaultCentral] setDelegate:self];\n\n  // Initialize with the last connected watch:\n  [self setTargetWatch:[[PBPebbleCentral defaultCentral] lastConnectedWatch]];\n  return YES;\n}\n\n/*\n *  PBPebbleCentral delegate methods\n */\n\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidConnect:(PBWatch*)watch isNew:(BOOL)isNew {\n  [self setTargetWatch:watch];\n}\n\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidDisconnect:(PBWatch*)watch {\n  [[[UIAlertView alloc] initWithTitle:@\"Disconnected!\" message:[watch name] delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n  if (_targetWatch == watch || [watch isEqual:_targetWatch]) {\n    [self setTargetWatch:nil];\n  }\n}\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo/GDAppViewController.h",
    "content": "//\n//  GDAppViewController.h\n//  GolfDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import <PebbleKit/PebbleKit.h>\n\n@interface GDAppViewController : UIViewController\n- (void)setTargetWatch:(PBWatch*)watch;\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo/GDAppViewController.m",
    "content": "//\n//  GDAppViewController.m\n//  GolfDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import \"GDAppViewController.h\"\n\n@interface GDAppViewController ()\n\n@end\n\n@implementation GDAppViewController {\n  PBWatch *_watch;\n  __weak IBOutlet UITextView *_logTextView;\n}\n\n- (void)logIfNoWatch {\n  if (_watch == nil) {\n    _logTextView.text = [_logTextView.text stringByAppendingString:@\"No Pebble connected!\\n\"];\n  }\n}\n\n- (IBAction)launchAction:(id)sender {\n  [self logIfNoWatch];\n\n  [_watch golfAppLaunch:^(PBWatch *watch, NSError *error) {\n    if (error) {\n      _logTextView.text = [_logTextView.text stringByAppendingString:@\"Failed sending launch command.\\n\"];\n    } else {\n      _logTextView.text = [_logTextView.text stringByAppendingString:@\"Launch command sent.\\n\"];\n    }\n  }];\n}\n\n- (IBAction)killAction:(id)sender {\n  [self logIfNoWatch];\n\n  [_watch golfAppKill:^(PBWatch *watch, NSError *error) {\n    if (error) {\n      _logTextView.text = [_logTextView.text stringByAppendingString:@\"Failed sending kill command.\\n\"];\n    } else {\n      _logTextView.text = [_logTextView.text stringByAppendingString:@\"Kill command sent.\\n\"];\n    }\n  }];\n\n}\n\n- (void)setTargetWatch:(PBWatch*)watch {\n  _watch = watch;\n  self.navigationItem.prompt = _watch ? [_watch name] : @\"No Pebble\";\n}\n\n- (void)closeSession {\n  [_watch closeSession:^{\n    NSLog(@\"Session closed.\");\n  }];\n}\n\n- (void)dealloc {\n  [self setTargetWatch:nil];\n}\n\n- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {\n  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];\n  if (self) {\n    self.navigationItem.title = @\"Golf App\";\n    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@\"Close Session\" style:UIBarButtonItemStylePlain target:self action:@selector(closeSession)];\n  }\n  return self;\n}\n\t\t\t\t\t\t\t\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo/GDDataViewController.h",
    "content": "//\n//  GDDataViewController.h\n//  GolfDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import <PebbleKit/PebbleKit.h>\n\n@interface GDDataViewController : UIViewController\n- (void)setTargetWatch:(PBWatch*)watch;\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo/GDDataViewController.m",
    "content": "//\n//  GDSecondViewController.m\n//  GolfDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import \"GDDataViewController.h\"\n\nenum {\n  GDIndexTime = 0,\n  GDIndexDistance,\n  GDIndexPace,\n};\n\n@interface GDDataViewController ()\n\n@end\n\n@implementation GDDataViewController {\n  PBWatch *_watch;\n  IBOutletCollection(UISlider) NSArray *_textFields;\n  __weak IBOutlet UITextView *_logTextView;\n  id _opaqueUpdateHandler;\n}\n\n- (void)setTargetWatch:(PBWatch*)watch {\n  if (_watch && _opaqueUpdateHandler) {\n    // Unregister the update handler that was registered below:\n    [_watch golfAppRemoveUpdateHandler:_opaqueUpdateHandler];\n  }\n  _watch = watch;\n  if (_watch) {\n    // Add the handler for inbound (watch -> phone) updates:\n    // For the Golf protocol, there are currently only two commands that can get sent, \"previous\" and \"next\":\n    __weak GDDataViewController *weakSelf = self;\n    _opaqueUpdateHandler = [_watch golfAppAddReceiveUpdateHandler:^BOOL(PBWatch *watch, GolfAppCommand command) {\n      NSString *commandString = nil;\n      switch (command) {\n        case GolfAppCommandNext: commandString = @\"Next\"; break;\n        case GolfAppCommandPrevious: commandString = @\"Previous\"; break;\n        case GolfAppCommandSelect: commandString = @\"Select\"; break;\n        default: commandString = @\"Unknown Command\"; break;\n      }\n      GDDataViewController *strongSelf = weakSelf;\n      UITextView *logTextView = strongSelf->_logTextView;\n      logTextView.text = [logTextView.text stringByAppendingFormat:@\"Received command: %@\\n\", commandString];\n      return YES;\n    }];\n  }\n  self.navigationItem.prompt = _watch ? [_watch name] : @\"No Pebble\";\n}\n\n- (void)logIfNoWatch {\n  if (_watch == nil) {\n    _logTextView.text = [_logTextView.text stringByAppendingString:@\"No Pebble connected!\\n\"];\n  }\n}\n\n- (IBAction)updateAction:(id)sender {\n  [self logIfNoWatch];\n\n  NSUInteger count = _textFields.count;\n  NSMutableDictionary *update = [NSMutableDictionary dictionary];\n  for (int i = 0; i < count; ++i) {\n    UITextField *field = _textFields[i];\n    NSNumber *key = nil;\n    switch (field.tag) {\n      case 0: key = PBGolfFrontKey; break;\n      case 1: key = PBGolfMidKey; break;\n      case 2: key = PBGolfBackKey; break;\n      case 3: key = PBGolfParKey; break;\n      case 4: key = PBGolfHoleKey; break;\n      default: continue;\n    }\n    [update setObject:field.text forKey:key];\n  }\n\n  NSString *log = [NSString stringWithFormat:@\"Sent update: F:%@, M:%@, B:%@, P:%@, H:%@\\n\",\n                   update[PBGolfFrontKey],\n                   update[PBGolfMidKey],\n                   update[PBGolfBackKey],\n                   update[PBGolfParKey],\n                   update[PBGolfHoleKey]];\n  \n  [_watch golfAppUpdate:update onSent:^(PBWatch *watch, NSError *error) {\n    if (error) {\n      _logTextView.text = [_logTextView.text stringByAppendingFormat:@\"Failed sending update: %@\\n\", error];\n    } else {\n      _logTextView.text = [_logTextView.text stringByAppendingString:log];\n    }\n  }];\n}\n\n- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {\n  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];\n  if (self) {\n    self.navigationItem.title = @\"Golf Data\";\n  }\n  return self;\n}\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo/GDIconViewController.h",
    "content": "//\n//  GDIconViewController.h\n//  GolfDemo\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import <PebbleKit/PebbleKit.h>\n\n@interface GDIconViewController : UIViewController\n- (void)setTargetWatch:(PBWatch*)watch;\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo/GDIconViewController.m",
    "content": "//\n//  GDIconViewController.m\n//  GolfDemo\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import \"GDIconViewController.h\"\n\n@interface GDIconViewController () <UITextFieldDelegate>\n\n@end\n\n@implementation GDIconViewController {\n  PBWatch *_watch;\n  __weak IBOutlet UITextField *_titleTextField;\n  __weak IBOutlet UISegmentedControl *_iconSegmentedControl;\n  __weak IBOutlet UITextView *_logTextView;\n}\n\n- (void)setTargetWatch:(PBWatch*)watch {\n  _watch = watch;\n  self.navigationItem.prompt = _watch ? [_watch name] : @\"No Pebble\";\n}\n\n- (void)dealloc {\n  [self setTargetWatch:nil];\n}\n\n- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {\n  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];\n  if (self) {\n    self.navigationItem.title = @\"Golf App\";\n  }\n  return self;\n}\n\n- (IBAction)assignAction:(id)sender {\n  NSString *fileName = (_iconSegmentedControl.selectedSegmentIndex == 0) ? @\"balltee.png\" : @\"green.png\";\n  UIImage *icon = [UIImage imageNamed:fileName];\n  __weak GDIconViewController *weakSelf = self;\n  [_watch golfSetTitle:_titleTextField.text icon:icon onSent:^(PBWatch *watch, NSError *error) {\n    GDIconViewController *strongSelf = weakSelf;\n    NSString *log = error ? [error description] : @\"Icon + Title set!\";\n    [strongSelf->_logTextView setText:[strongSelf->_logTextView.text stringByAppendingFormat:@\"\\n%@\", log]];\n  }];\n}\n\n- (BOOL)textFieldShouldReturn:(UITextField *)textField {\n  [textField resignFirstResponder];\n  return YES;\n}\n\n- (void)viewDidUnload {\n  _titleTextField = nil;\n  _iconSegmentedControl = nil;\n  _logTextView = nil;\n  [super viewDidUnload];\n}\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo/GDIconViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"8.00\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1280</int>\n\t\t<string key=\"IBDocument.SystemVersion\">12D78</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">3084</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1187.37</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">626.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">2083</string>\n\t\t</object>\n\t\t<array key=\"IBDocument.IntegratedClassDependencies\">\n\t\t\t<string>IBProxyObject</string>\n\t\t\t<string>IBUIButton</string>\n\t\t\t<string>IBUILabel</string>\n\t\t\t<string>IBUISegmentedControl</string>\n\t\t\t<string>IBUITextField</string>\n\t\t\t<string>IBUITextView</string>\n\t\t\t<string>IBUIView</string>\n\t\t</array>\n\t\t<array key=\"IBDocument.PluginDependencies\">\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</array>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<string key=\"NS.key.0\">PluginDependencyRecalculationVersion</string>\n\t\t\t<integer value=\"1\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<array class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<object class=\"IBProxyObject\" id=\"372490531\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"975951072\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIView\" id=\"191373211\">\n\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t<object class=\"IBUISegmentedControl\" id=\"902871310\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 111}, {280, 44}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"60452189\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBNumberOfSegments\">2</int>\n\t\t\t\t\t\t<int key=\"IBSelectedSegmentIndex\">0</int>\n\t\t\t\t\t\t<array key=\"IBSegmentTitles\">\n\t\t\t\t\t\t\t<string/>\n\t\t\t\t\t\t\t<string/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentWidths\">\n\t\t\t\t\t\t\t<real value=\"0.0\"/>\n\t\t\t\t\t\t\t<real value=\"0.0\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentEnabledStates\">\n\t\t\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentContentOffsets\">\n\t\t\t\t\t\t\t<string>{0, 0}</string>\n\t\t\t\t\t\t\t<string>{0, 0}</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentImages\">\n\t\t\t\t\t\t\t<object class=\"NSCustomResource\">\n\t\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t\t<string key=\"NSResourceName\">balltee.png</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"NSCustomResource\">\n\t\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t\t<string key=\"NSResourceName\">green.png</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUITextField\" id=\"213212205\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 44}, {280, 30}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"95513918\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<string key=\"IBUIText\">Birdie</string>\n\t\t\t\t\t\t<int key=\"IBUIBorderStyle\">3</int>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUITextColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MAA</bytes>\n\t\t\t\t\t\t\t<object class=\"NSColorSpace\" key=\"NSCustomColorSpace\" id=\"893380889\">\n\t\t\t\t\t\t\t\t<int key=\"NSID\">2</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">YES</bool>\n\t\t\t\t\t\t<float key=\"IBUIMinimumFontSize\">17</float>\n\t\t\t\t\t\t<object class=\"IBUITextInputTraits\" key=\"IBUITextInputTraits\">\n\t\t\t\t\t\t\t<bool key=\"IBUIEnablesReturnKeyAutomatically\">YES</bool>\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<int key=\"IBUIClearButtonMode\">3</int>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\" id=\"144252832\">\n\t\t\t\t\t\t\t<int key=\"type\">1</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">14</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\" id=\"1010480037\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">14</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"739211888\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 15}, {280, 21}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"213212205\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Golf App Title:</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUITextColor\" id=\"937391241\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MCAwIDAAA</bytes>\n\t\t\t\t\t\t\t<string key=\"IBUIColorCocoaTouchKeyPath\">darkTextColor</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\" id=\"889205494\">\n\t\t\t\t\t\t\t<int key=\"type\">1</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">17</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\" id=\"441697935\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">17</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"95513918\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 82}, {280, 21}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"902871310\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Golf App Icon:</string>\n\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"937391241\"/>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"889205494\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"441697935\"/>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUIButton\" id=\"60452189\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 176}, {280, 75}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"602319143\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentHorizontalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIButtonType\">1</int>\n\t\t\t\t\t\t<string key=\"IBUINormalTitle\">Assign</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIHighlightedTitleColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleShadowColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MC41AA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\">\n\t\t\t\t\t\t\t<int key=\"type\">2</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">15</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica-Bold</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">15</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUITextView\" id=\"602319143\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{0, 271}, {320, 154}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MSAxIDEAA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<bool key=\"IBUIMultipleTouchEnabled\">YES</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<bool key=\"IBUIEditable\">NO</bool>\n\t\t\t\t\t\t<string key=\"IBUIText\"/>\n\t\t\t\t\t\t<object class=\"IBUITextInputTraits\" key=\"IBUITextInputTraits\">\n\t\t\t\t\t\t\t<int key=\"IBUIAutocapitalizationType\">2</int>\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"144252832\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"1010480037\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t\t<string key=\"NSFrame\">{{0, 94}, {320, 425}}</string>\n\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"739211888\"/>\n\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t<reference key=\"NSCustomColorSpace\" ref=\"893380889\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedNavigationBarMetrics\" key=\"IBUISimulatedTopBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedTabBarMetrics\" key=\"IBUISimulatedBottomBarMetrics\"/>\n\t\t\t\t<object class=\"IBUIScreenMetrics\" key=\"IBUISimulatedDestinationMetrics\">\n\t\t\t\t\t<string key=\"IBUISimulatedSizeMetricsClass\">IBUIScreenMetrics</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"IBUINormalizedOrientationToSizeMap\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<array key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<integer value=\"1\"/>\n\t\t\t\t\t\t\t<integer value=\"3\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array key=\"dict.values\">\n\t\t\t\t\t\t\t<string>{320, 568}</string>\n\t\t\t\t\t\t\t<string>{568, 320}</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</object>\n\t\t\t\t\t<string key=\"IBUITargetRuntime\">IBCocoaTouchFramework</string>\n\t\t\t\t\t<string key=\"IBUIDisplayName\">Retina 4 Full Screen</string>\n\t\t\t\t\t<int key=\"IBUIType\">2</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t</array>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<array class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">view</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">3</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_titleTextField</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"213212205\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">13</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_iconSegmentedControl</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"902871310\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">14</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_logTextView</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"602319143\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">16</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">delegate</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"213212205\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">17</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchEventConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">assignAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"60452189\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t\t<int key=\"IBEventType\">7</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">12</int>\n\t\t\t\t</object>\n\t\t\t</array>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<array key=\"orderedObjects\">\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<array key=\"object\" id=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"191373211\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"739211888\"/>\n\t\t\t\t\t\t\t<reference ref=\"213212205\"/>\n\t\t\t\t\t\t\t<reference ref=\"95513918\"/>\n\t\t\t\t\t\t\t<reference ref=\"902871310\"/>\n\t\t\t\t\t\t\t<reference ref=\"60452189\"/>\n\t\t\t\t\t\t\t<reference ref=\"602319143\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"975951072\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">4</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"902871310\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">8</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"213212205\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">9</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"739211888\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">10</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"95513918\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">11</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"60452189\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">15</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"602319143\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t</object>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<string key=\"-1.CustomClassName\">GDIconViewController</string>\n\t\t\t\t<string key=\"-1.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"-2.CustomClassName\">UIResponder</string>\n\t\t\t\t<string key=\"-2.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"1.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"10.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"11.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"15.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"4.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<integer value=\"1\" key=\"4.IUISegmentedControlInspectorSelectedSegmentMetadataKey\"/>\n\t\t\t\t<string key=\"8.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"9.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t</dictionary>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"unlocalizedProperties\"/>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"localizations\"/>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">17</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<array class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">GDIconViewController</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actions\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">assignAction:</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">id</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actionInfosByName\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">assignAction:</string>\n\t\t\t\t\t\t<object class=\"IBActionInfo\" key=\"NS.object.0\">\n\t\t\t\t\t\t\t<string key=\"name\">assignAction:</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/GDIconViewController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</array>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>\n\t\t\t<real value=\"1280\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<dictionary class=\"NSMutableDictionary\" key=\"IBDocument.LastKnownImageSizes\">\n\t\t\t<string key=\"balltee.png\">{20, 29}</string>\n\t\t\t<string key=\"green.png\">{28, 32}</string>\n\t\t</dictionary>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">2083</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo/GolfDemo-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.getpebble.${PRODUCT_NAME:rfc1034identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UIStatusBarTintParameters</key>\n\t<dict>\n\t\t<key>UINavigationBar</key>\n\t\t<dict>\n\t\t\t<key>Style</key>\n\t\t\t<string>UIBarStyleDefault</string>\n\t\t\t<key>Translucent</key>\n\t\t\t<false/>\n\t\t</dict>\n\t</dict>\n\t<key>UISupportedExternalAccessoryProtocols</key>\n\t<array>\n\t\t<string>com.getpebble.public</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo/GolfDemo-Prefix.pch",
    "content": "//\n// Prefix header for all source files of the 'GolfDemo' target in the 'GolfDemo' project\n//\n\n#import <Availability.h>\n\n#ifndef __IPHONE_4_0\n#warning \"This project uses features only available in iOS SDK 4.0 and later.\"\n#endif\n\n#ifdef __OBJC__\n  #import <UIKit/UIKit.h>\n  #import <Foundation/Foundation.h>\n#endif\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo/en.lproj/GDAppViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"8.00\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1280</int>\n\t\t<string key=\"IBDocument.SystemVersion\">12D78</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">3084</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1187.37</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">626.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">2083</string>\n\t\t</object>\n\t\t<array key=\"IBDocument.IntegratedClassDependencies\">\n\t\t\t<string>IBProxyObject</string>\n\t\t\t<string>IBUIButton</string>\n\t\t\t<string>IBUITextView</string>\n\t\t\t<string>IBUIView</string>\n\t\t</array>\n\t\t<array key=\"IBDocument.PluginDependencies\">\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</array>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<string key=\"NS.key.0\">PluginDependencyRecalculationVersion</string>\n\t\t\t<integer value=\"1\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<array class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<object class=\"IBProxyObject\" id=\"372490531\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"263589821\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIView\" id=\"191373211\">\n\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t<object class=\"IBUITextView\" id=\"221023520\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t\t\t<string key=\"NSFrameSize\">{320, 276}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"904047753\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MSAxIDEAA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<bool key=\"IBUIMultipleTouchEnabled\">YES</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<bool key=\"IBUIEditable\">NO</bool>\n\t\t\t\t\t\t<string key=\"IBUIText\"/>\n\t\t\t\t\t\t<object class=\"IBUITextInputTraits\" key=\"IBUITextInputTraits\">\n\t\t\t\t\t\t\t<int key=\"IBUIAutocapitalizationType\">2</int>\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\">\n\t\t\t\t\t\t\t<int key=\"type\">1</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">14</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">14</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUIButton\" id=\"904047753\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">266</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 284}, {280, 65}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"926826579\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentHorizontalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIButtonType\">1</int>\n\t\t\t\t\t\t<string key=\"IBUINormalTitle\">Launch</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIHighlightedTitleColor\" id=\"1057852180\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleShadowColor\" id=\"889872547\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MC41AA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\" id=\"53014958\">\n\t\t\t\t\t\t\t<int key=\"type\">2</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">15</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\" id=\"581421605\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica-Bold</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">15</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUIButton\" id=\"926826579\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">266</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 371}, {280, 65}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentHorizontalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIButtonType\">1</int>\n\t\t\t\t\t\t<string key=\"IBUINormalTitle\">Kill</string>\n\t\t\t\t\t\t<reference key=\"IBUIHighlightedTitleColor\" ref=\"1057852180\"/>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"IBUINormalTitleShadowColor\" ref=\"889872547\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"53014958\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"581421605\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t\t<string key=\"NSFrame\">{{0, 64}, {320, 455}}</string>\n\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"221023520\"/>\n\t\t\t\t<reference key=\"IBUIBackgroundColor\" ref=\"1057852180\"/>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedNavigationBarMetrics\" key=\"IBUISimulatedTopBarMetrics\">\n\t\t\t\t\t<bool key=\"IBUIPrompted\">NO</bool>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBUISimulatedTabBarMetrics\" key=\"IBUISimulatedBottomBarMetrics\"/>\n\t\t\t\t<object class=\"IBUIScreenMetrics\" key=\"IBUISimulatedDestinationMetrics\">\n\t\t\t\t\t<string key=\"IBUISimulatedSizeMetricsClass\">IBUIScreenMetrics</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"IBUINormalizedOrientationToSizeMap\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<array key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<integer value=\"1\"/>\n\t\t\t\t\t\t\t<integer value=\"3\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array key=\"dict.values\">\n\t\t\t\t\t\t\t<string>{320, 568}</string>\n\t\t\t\t\t\t\t<string>{568, 320}</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</object>\n\t\t\t\t\t<string key=\"IBUITargetRuntime\">IBCocoaTouchFramework</string>\n\t\t\t\t\t<string key=\"IBUIDisplayName\">Retina 4 Full Screen</string>\n\t\t\t\t\t<int key=\"IBUIType\">2</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t</array>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<array class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">view</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">3</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_logTextView</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"221023520\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">45</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchEventConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">launchAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"904047753\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t\t<int key=\"IBEventType\">7</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">46</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchEventConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">killAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"926826579\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t\t<int key=\"IBEventType\">7</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">47</int>\n\t\t\t\t</object>\n\t\t\t</array>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<array key=\"orderedObjects\">\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<array key=\"object\" id=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"191373211\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"221023520\"/>\n\t\t\t\t\t\t\t<reference ref=\"926826579\"/>\n\t\t\t\t\t\t\t<reference ref=\"904047753\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"263589821\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">18</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"221023520\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">28</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"904047753\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">40</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"926826579\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t</object>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<string key=\"-1.CustomClassName\">GDAppViewController</string>\n\t\t\t\t<string key=\"-1.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"-2.CustomClassName\">UIResponder</string>\n\t\t\t\t<string key=\"-2.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"1.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"18.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"28.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"40.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t</dictionary>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"unlocalizedProperties\"/>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"localizations\"/>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">47</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<array class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">GDAppViewController</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"actions\">\n\t\t\t\t\t\t<string key=\"killAction:\">id</string>\n\t\t\t\t\t\t<string key=\"launchAction:\">id</string>\n\t\t\t\t\t</dictionary>\n\t\t\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"actionInfosByName\">\n\t\t\t\t\t\t<object class=\"IBActionInfo\" key=\"killAction:\">\n\t\t\t\t\t\t\t<string key=\"name\">killAction:</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBActionInfo\" key=\"launchAction:\">\n\t\t\t\t\t\t\t<string key=\"name\">launchAction:</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</dictionary>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/GDAppViewController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</array>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>\n\t\t\t<real value=\"1280\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">2083</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo/en.lproj/GDDataViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"8.00\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1280</int>\n\t\t<string key=\"IBDocument.SystemVersion\">12D78</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">3084</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1187.37</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">626.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">2083</string>\n\t\t</object>\n\t\t<array key=\"IBDocument.IntegratedClassDependencies\">\n\t\t\t<string>IBProxyObject</string>\n\t\t\t<string>IBUIButton</string>\n\t\t\t<string>IBUILabel</string>\n\t\t\t<string>IBUITextField</string>\n\t\t\t<string>IBUITextView</string>\n\t\t\t<string>IBUIView</string>\n\t\t</array>\n\t\t<array key=\"IBDocument.PluginDependencies\">\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</array>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<string key=\"NS.key.0\">PluginDependencyRecalculationVersion</string>\n\t\t\t<integer value=\"1\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<array class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<object class=\"IBProxyObject\" id=\"372490531\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"263589821\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIView\" id=\"191373211\">\n\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"595364284\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 9}, {67, 21}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"67101611\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Front</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUITextColor\" id=\"1038888864\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MCAwIDAAA</bytes>\n\t\t\t\t\t\t\t<string key=\"IBUIColorCocoaTouchKeyPath\">darkTextColor</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\" id=\"545284918\">\n\t\t\t\t\t\t\t<int key=\"type\">1</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">17</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\" id=\"783142302\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">17</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUITextView\" id=\"936456972\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{0, 252}, {320, 203}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MSAxIDEAA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<bool key=\"IBUIMultipleTouchEnabled\">YES</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<bool key=\"IBUIEditable\">NO</bool>\n\t\t\t\t\t\t<string key=\"IBUIText\"/>\n\t\t\t\t\t\t<object class=\"IBUITextInputTraits\" key=\"IBUITextInputTraits\">\n\t\t\t\t\t\t\t<int key=\"IBUIAutocapitalizationType\">2</int>\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\" id=\"766746775\">\n\t\t\t\t\t\t\t<int key=\"type\">1</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">14</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\" id=\"223683656\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">14</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUIButton\" id=\"608235232\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{95, 196}, {205, 49}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"936456972\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentHorizontalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIButtonType\">1</int>\n\t\t\t\t\t\t<string key=\"IBUINormalTitle\">Send Update</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIHighlightedTitleColor\" id=\"779778186\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleShadowColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MC41AA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\">\n\t\t\t\t\t\t\t<int key=\"type\">2</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">15</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica-Bold</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">15</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUITextField\" id=\"67101611\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{95, 6}, {205, 30}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"1010069531\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<string key=\"IBUIText\">8</string>\n\t\t\t\t\t\t<int key=\"IBUIBorderStyle\">3</int>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUITextColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MAA</bytes>\n\t\t\t\t\t\t\t<object class=\"NSColorSpace\" key=\"NSCustomColorSpace\" id=\"351847545\">\n\t\t\t\t\t\t\t\t<int key=\"NSID\">2</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">YES</bool>\n\t\t\t\t\t\t<float key=\"IBUIMinimumFontSize\">17</float>\n\t\t\t\t\t\t<object class=\"IBUITextInputTraits\" key=\"IBUITextInputTraits\">\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"766746775\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"223683656\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"1010069531\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 47}, {67, 21}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"299435084\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Mid</string>\n\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"1038888864\"/>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"545284918\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"783142302\"/>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUITextField\" id=\"299435084\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{95, 44}, {205, 30}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"188781074\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUITag\">1</int>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<string key=\"IBUIText\">7</string>\n\t\t\t\t\t\t<int key=\"IBUIBorderStyle\">3</int>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUITextColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MAA</bytes>\n\t\t\t\t\t\t\t<reference key=\"NSCustomColorSpace\" ref=\"351847545\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">YES</bool>\n\t\t\t\t\t\t<float key=\"IBUIMinimumFontSize\">17</float>\n\t\t\t\t\t\t<object class=\"IBUITextInputTraits\" key=\"IBUITextInputTraits\">\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"766746775\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"223683656\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"188781074\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 85}, {67, 21}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"915018685\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Back</string>\n\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"1038888864\"/>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"545284918\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"783142302\"/>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUITextField\" id=\"915018685\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{95, 82}, {205, 30}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"575766166\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUITag\">2</int>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<string key=\"IBUIText\">6</string>\n\t\t\t\t\t\t<int key=\"IBUIBorderStyle\">3</int>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUITextColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MAA</bytes>\n\t\t\t\t\t\t\t<reference key=\"NSCustomColorSpace\" ref=\"351847545\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">YES</bool>\n\t\t\t\t\t\t<float key=\"IBUIMinimumFontSize\">17</float>\n\t\t\t\t\t\t<object class=\"IBUITextInputTraits\" key=\"IBUITextInputTraits\">\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"766746775\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"223683656\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"575766166\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 123}, {67, 21}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"271138528\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Par</string>\n\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"1038888864\"/>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"545284918\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"783142302\"/>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUITextField\" id=\"271138528\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{95, 120}, {205, 30}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"950986707\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUITag\">3</int>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<string key=\"IBUIText\">2</string>\n\t\t\t\t\t\t<int key=\"IBUIBorderStyle\">3</int>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUITextColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MAA</bytes>\n\t\t\t\t\t\t\t<reference key=\"NSCustomColorSpace\" ref=\"351847545\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">YES</bool>\n\t\t\t\t\t\t<float key=\"IBUIMinimumFontSize\">17</float>\n\t\t\t\t\t\t<object class=\"IBUITextInputTraits\" key=\"IBUITextInputTraits\">\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"766746775\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"223683656\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"950986707\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 161}, {67, 21}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"913919920\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Hole</string>\n\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"1038888864\"/>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"545284918\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"783142302\"/>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUITextField\" id=\"913919920\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{95, 158}, {205, 30}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"608235232\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUITag\">4</int>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<string key=\"IBUIText\">9</string>\n\t\t\t\t\t\t<int key=\"IBUIBorderStyle\">3</int>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUITextColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MAA</bytes>\n\t\t\t\t\t\t\t<reference key=\"NSCustomColorSpace\" ref=\"351847545\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">YES</bool>\n\t\t\t\t\t\t<float key=\"IBUIMinimumFontSize\">17</float>\n\t\t\t\t\t\t<object class=\"IBUITextInputTraits\" key=\"IBUITextInputTraits\">\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"766746775\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"223683656\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t\t<string key=\"NSFrame\">{{0, 64}, {320, 455}}</string>\n\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"595364284\"/>\n\t\t\t\t<reference key=\"IBUIBackgroundColor\" ref=\"779778186\"/>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedNavigationBarMetrics\" key=\"IBUISimulatedTopBarMetrics\">\n\t\t\t\t\t<bool key=\"IBUIPrompted\">NO</bool>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBUISimulatedTabBarMetrics\" key=\"IBUISimulatedBottomBarMetrics\"/>\n\t\t\t\t<object class=\"IBUIScreenMetrics\" key=\"IBUISimulatedDestinationMetrics\">\n\t\t\t\t\t<string key=\"IBUISimulatedSizeMetricsClass\">IBUIScreenMetrics</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"IBUINormalizedOrientationToSizeMap\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<array key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<integer value=\"1\"/>\n\t\t\t\t\t\t\t<integer value=\"3\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array key=\"dict.values\">\n\t\t\t\t\t\t\t<string>{320, 568}</string>\n\t\t\t\t\t\t\t<string>{568, 320}</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</object>\n\t\t\t\t\t<string key=\"IBUITargetRuntime\">IBCocoaTouchFramework</string>\n\t\t\t\t\t<string key=\"IBUIDisplayName\">Retina 4 Full Screen</string>\n\t\t\t\t\t<int key=\"IBUIType\">2</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t</array>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<array class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">view</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">3</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_logTextView</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"936456972\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">103</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_textFields</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"67101611\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">116</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_textFields</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"299435084\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">117</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_textFields</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"915018685\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">118</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_textFields</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"271138528\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">119</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_textFields</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"913919920\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">120</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchEventConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">updateAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"608235232\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t\t<int key=\"IBEventType\">7</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">102</int>\n\t\t\t\t</object>\n\t\t\t</array>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<array key=\"orderedObjects\">\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<array key=\"object\" id=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"263589821\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"191373211\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"936456972\"/>\n\t\t\t\t\t\t\t<reference ref=\"595364284\"/>\n\t\t\t\t\t\t\t<reference ref=\"67101611\"/>\n\t\t\t\t\t\t\t<reference ref=\"1010069531\"/>\n\t\t\t\t\t\t\t<reference ref=\"299435084\"/>\n\t\t\t\t\t\t\t<reference ref=\"188781074\"/>\n\t\t\t\t\t\t\t<reference ref=\"915018685\"/>\n\t\t\t\t\t\t\t<reference ref=\"575766166\"/>\n\t\t\t\t\t\t\t<reference ref=\"271138528\"/>\n\t\t\t\t\t\t\t<reference ref=\"950986707\"/>\n\t\t\t\t\t\t\t<reference ref=\"913919920\"/>\n\t\t\t\t\t\t\t<reference ref=\"608235232\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">107</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"67101611\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">101</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"608235232\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">33</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"595364284\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">60</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"936456972\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">108</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1010069531\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">109</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"299435084\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">110</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"188781074\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">111</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"915018685\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">112</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"575766166\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">113</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"271138528\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">114</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"950986707\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">115</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"913919920\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t</object>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<string key=\"-1.CustomClassName\">GDDataViewController</string>\n\t\t\t\t<string key=\"-1.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"-2.CustomClassName\">UIResponder</string>\n\t\t\t\t<string key=\"-2.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"1.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"101.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"107.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"108.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"109.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"110.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"111.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"112.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"113.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"114.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"115.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"33.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"60.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t</dictionary>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"unlocalizedProperties\"/>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"localizations\"/>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">120</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<array class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">GDDataViewController</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actions\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">updateAction:</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">id</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actionInfosByName\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">updateAction:</string>\n\t\t\t\t\t\t<object class=\"IBActionInfo\" key=\"NS.object.0\">\n\t\t\t\t\t\t\t<string key=\"name\">updateAction:</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/GDDataViewController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</array>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>\n\t\t\t<real value=\"1280\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">2083</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo/main.m",
    "content": "//\n//  main.m\n//  GolfDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n#import \"GDAppDelegate.h\"\n\nint main(int argc, char *argv[])\n{\n  @autoreleasepool {\n      return UIApplicationMain(argc, argv, nil, NSStringFromClass([GDAppDelegate class]));\n  }\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1030EB5E16C4DB1A006F46EA /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1030EB5D16C4DB1A006F46EA /* UIKit.framework */; };\n\t\t1030EB6016C4DB1A006F46EA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1030EB5F16C4DB1A006F46EA /* Foundation.framework */; };\n\t\t1030EB6216C4DB1A006F46EA /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1030EB6116C4DB1A006F46EA /* CoreGraphics.framework */; };\n\t\t1030EB6816C4DB1A006F46EA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB6616C4DB1A006F46EA /* InfoPlist.strings */; };\n\t\t1030EB6A16C4DB1A006F46EA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1030EB6916C4DB1A006F46EA /* main.m */; };\n\t\t1030EB6E16C4DB1A006F46EA /* GDAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1030EB6D16C4DB1A006F46EA /* GDAppDelegate.m */; };\n\t\t1030EB7016C4DB1A006F46EA /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB6F16C4DB1A006F46EA /* Default.png */; };\n\t\t1030EB7216C4DB1A006F46EA /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB7116C4DB1A006F46EA /* Default@2x.png */; };\n\t\t1030EB7416C4DB1A006F46EA /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB7316C4DB1A006F46EA /* Default-568h@2x.png */; };\n\t\t1030EB7716C4DB1A006F46EA /* GDAppViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1030EB7616C4DB1A006F46EA /* GDAppViewController.m */; };\n\t\t1030EB7916C4DB1A006F46EA /* first.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB7816C4DB1A006F46EA /* first.png */; };\n\t\t1030EB7B16C4DB1A006F46EA /* first@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB7A16C4DB1A006F46EA /* first@2x.png */; };\n\t\t1030EB7E16C4DB1A006F46EA /* GDDataViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1030EB7D16C4DB1A006F46EA /* GDDataViewController.m */; };\n\t\t1030EB8016C4DB1A006F46EA /* second.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB7F16C4DB1A006F46EA /* second.png */; };\n\t\t1030EB8216C4DB1A006F46EA /* second@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB8116C4DB1A006F46EA /* second@2x.png */; };\n\t\t1030EB8516C4DB1A006F46EA /* GDAppViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB8316C4DB1A006F46EA /* GDAppViewController.xib */; };\n\t\t1030EB8816C4DB1A006F46EA /* GDDataViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB8616C4DB1A006F46EA /* GDDataViewController.xib */; };\n\t\t1030EB9616C4DECC006F46EA /* ExternalAccessory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1030EB9516C4DECC006F46EA /* ExternalAccessory.framework */; };\n\t\t104820FE16C5970F00F2AFC8 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 104820FD16C5970F00F2AFC8 /* libz.dylib */; };\n\t\t1048210016C5972E00F2AFC8 /* CoreBluetooth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 104820FF16C5972E00F2AFC8 /* CoreBluetooth.framework */; };\n\t\t1048210216C5973B00F2AFC8 /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1048210116C5973B00F2AFC8 /* CoreMotion.framework */; };\n\t\t1048210416C5974800F2AFC8 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1048210316C5974800F2AFC8 /* MessageUI.framework */; };\n\t\t1095B831170DF59B00B6075C /* balltee.png in Resources */ = {isa = PBXBuildFile; fileRef = 1095B82F170DF59A00B6075C /* balltee.png */; };\n\t\t1095B832170DF59C00B6075C /* green.png in Resources */ = {isa = PBXBuildFile; fileRef = 1095B830170DF59B00B6075C /* green.png */; };\n\t\t10B6DA0716FFF89F0079E460 /* GDIconViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 10B6DA0516FFF89F0079E460 /* GDIconViewController.m */; };\n\t\t10B6DA0816FFF89F0079E460 /* GDIconViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 10B6DA0616FFF89F0079E460 /* GDIconViewController.xib */; };\n\t\t2ABD33391829FF1D0077C1C8 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2ABD33381829FF1D0077C1C8 /* CFNetwork.framework */; };\n\t\tE4BA4FDC53394BEF80F2F1FB /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E8B090FC7CA44687BF682BEB /* libPods.a */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t1030EB5A16C4DB1A006F46EA /* GolfDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GolfDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1030EB5D16C4DB1A006F46EA /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };\n\t\t1030EB5F16C4DB1A006F46EA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t1030EB6116C4DB1A006F46EA /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };\n\t\t1030EB6516C4DB1A006F46EA /* GolfDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"GolfDemo-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t1030EB6716C4DB1A006F46EA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t1030EB6916C4DB1A006F46EA /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t1030EB6B16C4DB1A006F46EA /* GolfDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"GolfDemo-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t1030EB6C16C4DB1A006F46EA /* GDAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GDAppDelegate.h; sourceTree = \"<group>\"; };\n\t\t1030EB6D16C4DB1A006F46EA /* GDAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GDAppDelegate.m; sourceTree = \"<group>\"; };\n\t\t1030EB6F16C4DB1A006F46EA /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = \"<group>\"; };\n\t\t1030EB7116C4DB1A006F46EA /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Default@2x.png\"; sourceTree = \"<group>\"; };\n\t\t1030EB7316C4DB1A006F46EA /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Default-568h@2x.png\"; sourceTree = \"<group>\"; };\n\t\t1030EB7516C4DB1A006F46EA /* GDAppViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GDAppViewController.h; sourceTree = \"<group>\"; };\n\t\t1030EB7616C4DB1A006F46EA /* GDAppViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GDAppViewController.m; sourceTree = \"<group>\"; };\n\t\t1030EB7816C4DB1A006F46EA /* first.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = first.png; sourceTree = \"<group>\"; };\n\t\t1030EB7A16C4DB1A006F46EA /* first@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"first@2x.png\"; sourceTree = \"<group>\"; };\n\t\t1030EB7C16C4DB1A006F46EA /* GDDataViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GDDataViewController.h; sourceTree = \"<group>\"; };\n\t\t1030EB7D16C4DB1A006F46EA /* GDDataViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GDDataViewController.m; sourceTree = \"<group>\"; };\n\t\t1030EB7F16C4DB1A006F46EA /* second.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = second.png; sourceTree = \"<group>\"; };\n\t\t1030EB8116C4DB1A006F46EA /* second@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"second@2x.png\"; sourceTree = \"<group>\"; };\n\t\t1030EB8416C4DB1A006F46EA /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/GDAppViewController.xib; sourceTree = \"<group>\"; };\n\t\t1030EB8716C4DB1A006F46EA /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/GDDataViewController.xib; sourceTree = \"<group>\"; };\n\t\t1030EB9516C4DECC006F46EA /* ExternalAccessory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ExternalAccessory.framework; path = System/Library/Frameworks/ExternalAccessory.framework; sourceTree = SDKROOT; };\n\t\t104820FD16C5970F00F2AFC8 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.dylib\"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };\n\t\t104820FF16C5972E00F2AFC8 /* CoreBluetooth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreBluetooth.framework; path = System/Library/Frameworks/CoreBluetooth.framework; sourceTree = SDKROOT; };\n\t\t1048210116C5973B00F2AFC8 /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; };\n\t\t1048210316C5974800F2AFC8 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; };\n\t\t1095B82F170DF59A00B6075C /* balltee.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = balltee.png; sourceTree = \"<group>\"; };\n\t\t1095B830170DF59B00B6075C /* green.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = green.png; sourceTree = \"<group>\"; };\n\t\t10B6DA0416FFF89F0079E460 /* GDIconViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GDIconViewController.h; sourceTree = \"<group>\"; };\n\t\t10B6DA0516FFF89F0079E460 /* GDIconViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GDIconViewController.m; sourceTree = \"<group>\"; };\n\t\t10B6DA0616FFF89F0079E460 /* GDIconViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GDIconViewController.xib; sourceTree = \"<group>\"; };\n\t\t2ABD33381829FF1D0077C1C8 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; };\n\t\tE8B090FC7CA44687BF682BEB /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF98B8A874F59461B962DCA51 /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.xcconfig; path = Pods/Pods.xcconfig; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t1030EB5716C4DB1A006F46EA /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2ABD33391829FF1D0077C1C8 /* CFNetwork.framework in Frameworks */,\n\t\t\t\t1048210416C5974800F2AFC8 /* MessageUI.framework in Frameworks */,\n\t\t\t\t1048210216C5973B00F2AFC8 /* CoreMotion.framework in Frameworks */,\n\t\t\t\t1048210016C5972E00F2AFC8 /* CoreBluetooth.framework in Frameworks */,\n\t\t\t\t104820FE16C5970F00F2AFC8 /* libz.dylib in Frameworks */,\n\t\t\t\t1030EB9616C4DECC006F46EA /* ExternalAccessory.framework in Frameworks */,\n\t\t\t\t1030EB5E16C4DB1A006F46EA /* UIKit.framework in Frameworks */,\n\t\t\t\t1030EB6016C4DB1A006F46EA /* Foundation.framework in Frameworks */,\n\t\t\t\t1030EB6216C4DB1A006F46EA /* CoreGraphics.framework in Frameworks */,\n\t\t\t\tE4BA4FDC53394BEF80F2F1FB /* libPods.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t1030EB5116C4DB1A006F46EA = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB6316C4DB1A006F46EA /* GolfDemo */,\n\t\t\t\t1030EB5C16C4DB1A006F46EA /* Frameworks */,\n\t\t\t\t1030EB5B16C4DB1A006F46EA /* Products */,\n\t\t\t\tF98B8A874F59461B962DCA51 /* Pods.xcconfig */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1030EB5B16C4DB1A006F46EA /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB5A16C4DB1A006F46EA /* GolfDemo.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1030EB5C16C4DB1A006F46EA /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2ABD33381829FF1D0077C1C8 /* CFNetwork.framework */,\n\t\t\t\t1048210316C5974800F2AFC8 /* MessageUI.framework */,\n\t\t\t\t1048210116C5973B00F2AFC8 /* CoreMotion.framework */,\n\t\t\t\t104820FF16C5972E00F2AFC8 /* CoreBluetooth.framework */,\n\t\t\t\t104820FD16C5970F00F2AFC8 /* libz.dylib */,\n\t\t\t\t1030EB9516C4DECC006F46EA /* ExternalAccessory.framework */,\n\t\t\t\t1030EB5D16C4DB1A006F46EA /* UIKit.framework */,\n\t\t\t\t1030EB5F16C4DB1A006F46EA /* Foundation.framework */,\n\t\t\t\t1030EB6116C4DB1A006F46EA /* CoreGraphics.framework */,\n\t\t\t\tE8B090FC7CA44687BF682BEB /* libPods.a */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1030EB6316C4DB1A006F46EA /* GolfDemo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB6C16C4DB1A006F46EA /* GDAppDelegate.h */,\n\t\t\t\t1030EB6D16C4DB1A006F46EA /* GDAppDelegate.m */,\n\t\t\t\t10B6DA0416FFF89F0079E460 /* GDIconViewController.h */,\n\t\t\t\t10B6DA0516FFF89F0079E460 /* GDIconViewController.m */,\n\t\t\t\t10B6DA0616FFF89F0079E460 /* GDIconViewController.xib */,\n\t\t\t\t1030EB7516C4DB1A006F46EA /* GDAppViewController.h */,\n\t\t\t\t1030EB7616C4DB1A006F46EA /* GDAppViewController.m */,\n\t\t\t\t1030EB8316C4DB1A006F46EA /* GDAppViewController.xib */,\n\t\t\t\t1030EB7816C4DB1A006F46EA /* first.png */,\n\t\t\t\t1030EB7A16C4DB1A006F46EA /* first@2x.png */,\n\t\t\t\t1030EB7C16C4DB1A006F46EA /* GDDataViewController.h */,\n\t\t\t\t1030EB7D16C4DB1A006F46EA /* GDDataViewController.m */,\n\t\t\t\t1030EB8616C4DB1A006F46EA /* GDDataViewController.xib */,\n\t\t\t\t1030EB7F16C4DB1A006F46EA /* second.png */,\n\t\t\t\t1030EB8116C4DB1A006F46EA /* second@2x.png */,\n\t\t\t\t1095B82F170DF59A00B6075C /* balltee.png */,\n\t\t\t\t1095B830170DF59B00B6075C /* green.png */,\n\t\t\t\t1030EB6416C4DB1A006F46EA /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = GolfDemo;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1030EB6416C4DB1A006F46EA /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB6516C4DB1A006F46EA /* GolfDemo-Info.plist */,\n\t\t\t\t1030EB6616C4DB1A006F46EA /* InfoPlist.strings */,\n\t\t\t\t1030EB6916C4DB1A006F46EA /* main.m */,\n\t\t\t\t1030EB6B16C4DB1A006F46EA /* GolfDemo-Prefix.pch */,\n\t\t\t\t1030EB6F16C4DB1A006F46EA /* Default.png */,\n\t\t\t\t1030EB7116C4DB1A006F46EA /* Default@2x.png */,\n\t\t\t\t1030EB7316C4DB1A006F46EA /* Default-568h@2x.png */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t1030EB5916C4DB1A006F46EA /* GolfDemo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1030EB8B16C4DB1B006F46EA /* Build configuration list for PBXNativeTarget \"GolfDemo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t0F5079D089D047318FE8FA43 /* Check Pods Manifest.lock */,\n\t\t\t\t1030EB5616C4DB1A006F46EA /* Sources */,\n\t\t\t\t1030EB5716C4DB1A006F46EA /* Frameworks */,\n\t\t\t\t1030EB5816C4DB1A006F46EA /* Resources */,\n\t\t\t\tB9C1F3B16A4F4E21A673637F /* Copy Pods Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = GolfDemo;\n\t\t\tproductName = GolfDemo;\n\t\t\tproductReference = 1030EB5A16C4DB1A006F46EA /* GolfDemo.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t1030EB5216C4DB1A006F46EA /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tCLASSPREFIX = SD;\n\t\t\t\tLastUpgradeCheck = 0460;\n\t\t\t\tORGANIZATIONNAME = \"Pebble Technology Corp.\";\n\t\t\t};\n\t\t\tbuildConfigurationList = 1030EB5516C4DB1A006F46EA /* Build configuration list for PBXProject \"GolfDemo\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 1030EB5116C4DB1A006F46EA;\n\t\t\tproductRefGroup = 1030EB5B16C4DB1A006F46EA /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t1030EB5916C4DB1A006F46EA /* GolfDemo */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t1030EB5816C4DB1A006F46EA /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1030EB6816C4DB1A006F46EA /* InfoPlist.strings in Resources */,\n\t\t\t\t1030EB7016C4DB1A006F46EA /* Default.png in Resources */,\n\t\t\t\t1030EB7216C4DB1A006F46EA /* Default@2x.png in Resources */,\n\t\t\t\t1030EB7416C4DB1A006F46EA /* Default-568h@2x.png in Resources */,\n\t\t\t\t1030EB7916C4DB1A006F46EA /* first.png in Resources */,\n\t\t\t\t1030EB7B16C4DB1A006F46EA /* first@2x.png in Resources */,\n\t\t\t\t1030EB8016C4DB1A006F46EA /* second.png in Resources */,\n\t\t\t\t1030EB8216C4DB1A006F46EA /* second@2x.png in Resources */,\n\t\t\t\t1030EB8516C4DB1A006F46EA /* GDAppViewController.xib in Resources */,\n\t\t\t\t1030EB8816C4DB1A006F46EA /* GDDataViewController.xib in Resources */,\n\t\t\t\t10B6DA0816FFF89F0079E460 /* GDIconViewController.xib in Resources */,\n\t\t\t\t1095B831170DF59B00B6075C /* balltee.png in Resources */,\n\t\t\t\t1095B832170DF59C00B6075C /* green.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t0F5079D089D047318FE8FA43 /* Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Check Pods Manifest.lock\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_ROOT}/../Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [[ $? != 0 ]] ; then\\n    cat << EOM\\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\nEOM\\n    exit 1\\nfi\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tB9C1F3B16A4F4E21A673637F /* Copy Pods Resources */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Copy Pods Resources\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/Pods/Pods-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t1030EB5616C4DB1A006F46EA /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1030EB6A16C4DB1A006F46EA /* main.m in Sources */,\n\t\t\t\t1030EB6E16C4DB1A006F46EA /* GDAppDelegate.m in Sources */,\n\t\t\t\t1030EB7716C4DB1A006F46EA /* GDAppViewController.m in Sources */,\n\t\t\t\t1030EB7E16C4DB1A006F46EA /* GDDataViewController.m in Sources */,\n\t\t\t\t10B6DA0716FFF89F0079E460 /* GDIconViewController.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t1030EB6616C4DB1A006F46EA /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB6716C4DB1A006F46EA /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1030EB8316C4DB1A006F46EA /* GDAppViewController.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB8416C4DB1A006F46EA /* en */,\n\t\t\t);\n\t\t\tname = GDAppViewController.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1030EB8616C4DB1A006F46EA /* GDDataViewController.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB8716C4DB1A006F46EA /* en */,\n\t\t\t);\n\t\t\tname = GDDataViewController.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t1030EB8916C4DB1A006F46EA /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.1;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1030EB8A16C4DB1A006F46EA /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.1;\n\t\t\t\tOTHER_CFLAGS = \"-DNS_BLOCK_ASSERTIONS=1\";\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1030EB8C16C4DB1B006F46EA /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = F98B8A874F59461B962DCA51 /* Pods.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"GolfDemo/GolfDemo-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"GolfDemo/GolfDemo-Info.plist\";\n\t\t\t\tPRODUCT_NAME = GolfDemo;\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1030EB8D16C4DB1B006F46EA /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = F98B8A874F59461B962DCA51 /* Pods.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"GolfDemo/GolfDemo-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"GolfDemo/GolfDemo-Info.plist\";\n\t\t\t\tPRODUCT_NAME = GolfDemo;\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1030EB5516C4DB1A006F46EA /* Build configuration list for PBXProject \"GolfDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1030EB8916C4DB1A006F46EA /* Debug */,\n\t\t\t\t1030EB8A16C4DB1A006F46EA /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1030EB8B16C4DB1B006F46EA /* Build configuration list for PBXNativeTarget \"GolfDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1030EB8C16C4DB1B006F46EA /* Debug */,\n\t\t\t\t1030EB8D16C4DB1B006F46EA /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 1030EB5216C4DB1A006F46EA /* Project object */;\n}\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:GolfDemo.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo.xcodeproj/project.xcworkspace/xcshareddata/GolfDemo.xccheckout",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDESourceControlProjectIdentifier</key>\n\t<string>1D381B7C-B65E-4CBC-B5A6-A7BC664F1FA6</string>\n\t<key>IDESourceControlProjectName</key>\n\t<string>GolfDemo</string>\n\t<key>IDESourceControlProjectOriginsDictionary</key>\n\t<dict>\n\t\t<key>3A0B87F4-437B-4F41-9F0F-BACA80C47296</key>\n\t\t<string>ssh://github.com/pebble/pebblesdk-examples.git</string>\n\t\t<key>A0D51475-1583-439F-BE7E-C821016956E2</key>\n\t\t<string>ssh://github.com/pebble/pebblekit-ios.git</string>\n\t</dict>\n\t<key>IDESourceControlProjectPath</key>\n\t<string>golf-demo/GolfDemo-iOS/GolfDemo.xcodeproj/project.xcworkspace</string>\n\t<key>IDESourceControlProjectRelativeInstallPathDictionary</key>\n\t<dict>\n\t\t<key>3A0B87F4-437B-4F41-9F0F-BACA80C47296</key>\n\t\t<string>../../../..</string>\n\t\t<key>A0D51475-1583-439F-BE7E-C821016956E2</key>\n\t\t<string>../../../../../pebblekit-ios</string>\n\t</dict>\n\t<key>IDESourceControlProjectURL</key>\n\t<string>ssh://github.com/pebble/pebblesdk-examples.git</string>\n\t<key>IDESourceControlProjectVersion</key>\n\t<integer>110</integer>\n\t<key>IDESourceControlProjectWCCIdentifier</key>\n\t<string>3A0B87F4-437B-4F41-9F0F-BACA80C47296</string>\n\t<key>IDESourceControlProjectWCConfigurations</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>IDESourceControlRepositoryExtensionIdentifierKey</key>\n\t\t\t<string>public.vcs.git</string>\n\t\t\t<key>IDESourceControlWCCIdentifierKey</key>\n\t\t\t<string>3A0B87F4-437B-4F41-9F0F-BACA80C47296</string>\n\t\t\t<key>IDESourceControlWCCName</key>\n\t\t\t<string>pebblesdk-examples</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>IDESourceControlRepositoryExtensionIdentifierKey</key>\n\t\t\t<string>public.vcs.git</string>\n\t\t\t<key>IDESourceControlWCCIdentifierKey</key>\n\t\t\t<string>A0D51475-1583-439F-BE7E-C821016956E2</string>\n\t\t\t<key>IDESourceControlWCCName</key>\n\t\t\t<string>pebblekit-ios</string>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/GolfDemo.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version='1.0' encoding='UTF-8'?><Workspace version='1.0'><FileRef location='group:GolfDemo.xcodeproj'/><FileRef location='group:Pods/Pods.xcodeproj'/></Workspace>"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Podfile",
    "content": "pod \"PebbleKit\""
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/NSDictionary+Pebble.h",
    "content": "//\n//  NSDictionary+Pebble.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSDictionary (Pebble)\n\n/**\n *  Serializes the receiver into a Pebble dict.\n *  @note The receiver dictionary must comply to the following constraints:\n *  * The keys must be instances of NSNumber. Their -unsignedLongValue return value will be used as final key.\n *  * The values must be instances of either NSString, NSData or NSNumber. Use the NSNumber (stdint) category\n *  to specify the signedness and width of NSNumbers.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryUnsupportedKeyClass,\n *  PBErrorCodeDictionaryUnsupportedValueClass or PBErrorCodeDictionaryUnsupportedValueClass.\n *  @see -dictionaryFromPebbleDictionaryDataWithError:\n */\n- (NSData*)pebbleDictionaryData:(NSError * __autoreleasing *)error;\n\n@end\n\n@interface NSData (Pebble)\n\n/**\n *  Interprets the receiver as Pebble dict data and deserializes it into an NSDictionary.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryInternalConsistency.\n *  @see -pebbleDictionaryData:\n */\n- (NSDictionary*)dictionaryFromPebbleDictionaryDataWithError:(NSError * __autoreleasing *)error;\n\n@end"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/NSNumber+stdint.h",
    "content": "//\n//  NSNumber+stdint.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/**\n *  This category exposes the capabilities the underlying CFNumber to explicitely\n *  store the signedness and the width of the storage.\n */\n\n@interface NSNumber (stdint)\n\n/**\n *  Interprets the receiver as a 32-bits wide, unsigned integer.\n */\n- (uint32_t)uint32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, unsigned integer.\n */\n- (uint16_t)uint16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, unsigned integer.\n */\n- (uint8_t)uint8Value;\n\n/**\n *  Interprets the receiver as a 32-bits wide, signed integer.\n */\n- (int32_t)int32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, signed integer.\n */\n- (int16_t)int16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, signed integer.\n */\n- (int8_t)int8Value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint32:(uint32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint16:(uint16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint8:(uint8_t)value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt32:(int32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt16:(int16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt8:(int8_t)value;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a floating pointer number or not.\n */\n- (BOOL)isFloat;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a signed integer or not.\n */\n- (BOOL)isSigned;\n\n/**\n *  Gets the width in bytes of the integer that is stored by the receiver.\n */\n- (uint8_t)width;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBBitmap.h",
    "content": "//\n//  PBBitmap.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIImage.h>\n#import <PebbleKit/gtypes.h>\n\n/**\n *  Helper class to convert a UIImage to Pebble bitmap pixel data and GBitmap metadata.\n *  Refer to the documentation of Pebble's native watch app SDK on the GBitmap format.\n */\n\n@interface PBBitmap : NSObject\n\n/**\n *  The pixel data of the bitmap.\n *  This corresponds to the data as pointed to by GBitmap's `addr` field.\n */\n@property (nonatomic, readonly, strong) NSData *pixelData;\n\n/**\n *  The number of bytes per row.\n *  Always a multiple of 4 bytes.\n */\n@property (nonatomic, readonly, assign) uint16_t rowSizeBytes;\n\n/**\n *  Bitfield of metadata flags.\n *  This corresponds to GBitmap's `info_flags` field.\n */\n@property (nonatomic, readonly, assign) uint16_t infoFlags;\n\n/**\n *  The box of bits inside `pixelData`, that contains\n *  the actual image data to use.\n *  This corresponds to GBitmap's `bounds` field.\n */\n@property (nonatomic, readonly, assign) GRect bounds;\n\n/**\n *  Factory method to create a PBBitmap from a UIImage instance.\n *  @param image The UIImage from which to create the PBBitmap\n */\n+ (PBBitmap*)pebbleBitmapWithUIImage:(UIImage*)image;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBDataLoggingService.h",
    "content": "//\n//  PBDataLoggingService.h\n//  PebbleKit\n//\n//  Created by Martijn The on 7/19/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  Data logging datatypes.\n */\nenum {\n  //! Array of bytes\n  PBDataLoggingTypeByteArray = 0,\n  //! unsigned integer\n  PBDataLoggingTypeUInt = 2,\n  //! signed integer\n  PBDataLoggingTypeInt = 3,\n};\ntypedef UInt8 PBDataLoggingType;\n\n/**\n *  The metadata of a data logging session. Used to identify a session.\n */\n@interface PBDataLoggingSessionMetadata : NSObject <NSSecureCoding, NSCopying>\n\n/**\n *  A tag associated with the session.\n */\n@property (nonatomic, readonly) UInt32 tag;\n\n/**\n *  The timestamp of the moment the session was created by the watchapp.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The type of data stored in this session.\n */\n@property (nonatomic, readonly) PBDataLoggingType type;\n\n/**\n *  The size of a data item.\n */\n@property (nonatomic, readonly) UInt16 itemSize;\n\n/**\n *  The serial number of the watch that created the sessions.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  Creates a new data logging session metadata object, given all its property values.\n *  This method is provided to create a metadata object that can be used to\n *  compare it with a metadata object that is passed into one of the\n *  PBDataLoggingServiceDelegate methods.\n *  @param tag The tag associated with the session\n *  @param timestamp The timestamp of the creation of the session\n *  @param type The type of data stored in the session\n *  @param itemSize The size of a data item\n *  @param serialNumber The serial number of the watch that created the session\n *  @return A session metadata object with the specified information\n */\n+ (id)metadataWithTag:(UInt32)tag\n            timestamp:(UInt32)timestamp\n                 type:(PBDataLoggingType)type\n             itemSize:(UInt16)itemSize\n         serialNumber:(NSString *)serialNumber;\n\n/**\n *  Tests the equality of two data logging session metadata objects.\n *  This method can be used to compare two session metadata objects\n *  to check whether they are referring to the same session or not.\n *  @param sessionMetadata\n *  @return YES if all the property values of receiver are equal to the property\n *  values of the given session.\n *  @note Equivalent to -[PBDataLoggingSessionMetadata isEqual:]\n */\n- (BOOL)isEqualToDataLoggingSessionMetadata:(PBDataLoggingSessionMetadata *)sessionMetadata;\n@end\n\n/**\n *  Data logging delegate protocol. The object that implements this protocol\n *  is responsible for handling incoming data.\n */\n@protocol PBDataLoggingServiceDelegate <NSObject>\n@optional\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param bytes Pointer to the array of bytes.\n *  The array contains (numberOfItems * session.itemSize) bytes.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasByteArrays:(const UInt8 * const)bytes numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt8s:(const UInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt16s:(const UInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt32s:(const UInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt8s:(const SInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt16s:(const SInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt32s:(const SInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time a session is finished.\n *  This is guaranteed to be called only after all data has been received and\n *  consumed by the application.\n *  @param service The data logging service.\n *  @param session The metadata of the session.\n */\n- (void)dataLoggingService:(PBDataLoggingService *)service sessionDidFinish:(PBDataLoggingSessionMetadata *)session;\n\n@end\n\n/**\n *  The data logging service. Assign a delegate object in order to receive\n *  data from your watchapp.\n */\n@interface PBDataLoggingService : NSObject\n\n/**\n *  The delegate that has the responsility of handling callbacks from the\n *  data logging service.\n */\n@property (atomic, readwrite, weak) id<PBDataLoggingServiceDelegate> delegate;\n\n/**\n *  Sets the queue on which delegate methods will be executed.\n *  Callbacks are intended to be processed in the order as they come in, so it\n *  you must use a serial queue. If set to nil (default) the main queue is used.\n *  @param delegateQueue The queue on which the delegate methods will be executed.\n */\n- (void)setDelegateQueue:(dispatch_queue_t)delegateQueue;\n\n/**\n * Query the watch for data logging data.\n */\n- (void)pollForData;\n  \n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBErrors.h",
    "content": "//\n//  PBErrors.h\n//  PebbleSDK\n//\n//  Created by Martijn The on 7/26/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nextern NSString *PBErrorDomain;\n\n/**\n *  PebbleKit Error codes.\n *  Inspect the localizedDescription of any NSError objects for a description.\n */\n\ntypedef enum {\n  PBErrorCodeNoSupportedProtocolsInInfoPlist,\n  PBErrorCodeErrorCreatingSession,\n  PBErrorCodeOutputStreamError,\n  PBErrorCodeInputStreamError,\n  PBErrorCodeSendMessageTimeout,\n  PBErrorCodeEndpointDisallowed,\n  PBErrorCodeVersionInfoTimeout,\n  PBErrorCodeCannotCreateSessionWhileClosing,\n  PBErrorCodeNoAppUUID,\n  PBErrorCodeAppMessageRejected,\n  PBErrorCodeAppMessageAckTimeout,\n  PBErrorCodeDictionaryUnsupportedKeyClass,\n  PBErrorCodeDictionaryUnsupportedValueClass,\n  PBErrorCodeDictionaryInternalConsistency,\n  PBErrorCodeInvalidArguments,\n  PBErrorCodePebbleAppUnreachable,\n  PBErrorCodePebbleAppRequestTimeout,\n  PBErrorCodePebbleAppEmptyResponse,\n  PBErrorCodePebbleAppUnexpectedResponse,\n  PBErrorCodeServerNotAvailable,\n  PBErrorCodeDownloadFailed,\n  PBErrorCodePebbleNotConnected\n} PBErrorCode;\n\n@interface NSError (Pebble)\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode and with an underlying NSError object.\n *  @param code The error code for which to create the error\n *  @param error The underlying error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code underLyingError:(NSError*)error;\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode.\n *  @param code The error code for which to create the error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code;\n\n@end"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBLog.h",
    "content": "//\n//  PBLog.h\n//  PebbleApp\n//\n//  Created by Martijn The on 11/29/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import \"DDLog.h\"\n\n#ifndef PBWSLOG_CONTEXT\n#define PBWSLOG_CONTEXT 1\n#endif\n\nextern int PBLogLevel;\n\n#define LogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define WSLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n\n#define LogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBPebbleCentral.h",
    "content": "//\n//  PBPebbleCentral.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class PBWatch;\n@class PBDataLoggingService;\n@protocol PBPebbleCentralDelegate;\n\n/**\n PebbleCentral plays the central role for client iOS apps (e.g. RunKeeper).\n */\n@interface PBPebbleCentral : NSObject\n\n/**\n @returns The default central singleton instance.\n */\n+ (PBPebbleCentral*)defaultCentral;\n\n/**\n *  Enables debug logs. The logs will be routed to the system log (ASL) and\n *  console. It is advised to call this before making any other calls to PebbleKit.\n */\n+ (void)setDebugLogsEnabled:(BOOL)logsEnabled;\n\n/**\n The watches that are currently connected. Do not cache the array because it can change over time.\n */\n@property (nonatomic, readonly, strong) NSArray *connectedWatches;\n\n/**\n The watches that are stored in the user preferences of the application.\n */\n@property (nonatomic, readonly, strong) NSArray *registeredWatches;\n\n/**\n The central's delegate.\n */\n@property (nonatomic, readwrite, weak) id<PBPebbleCentralDelegate> delegate;\n\n/**\n *  The UUID is used as the identifier of the watch application and is used\n *  to make sure that appMessage and dataLogging communications arrives at its companion app\n *  on the other device (and not in another app).\n *  For most app message methods there is are two variants: one that does not take a UUID parameter and one that does take\n *  a UUID parameter (for example, -appMessagesAddReceiveUpdateHandler: vs appMessagesAddReceiveUpdateHandler:withUUID:).\n *  The methods that do not take a UUID, will use the UUID as set prior to this property.\n *  @param uuid The 16 byte UUID of your app.\n *  @note The UUID needs to be set before using either app message or data logging.\n */\n@property (nonatomic, strong, readwrite) NSData *appUUID;\n\n/**\n *  Verifies the currently set application UUID.\n *  @return YES if the currently set UUID is valid, NO if it is not.\n *  @see -setAppUuid:\n */\n- (BOOL)hasValidAppUUID;\n\n/**\n @returns YES if the Pebble iOS app is installed, NO if it is not installed.\n */\n- (BOOL)isMobileAppInstalled;\n\n/**\n Redirects to Pebble in the App Store, so the user can install the app.\n */\n- (void)installMobileApp;\n\n/**\n Wipes out the data associated with the registered watches, that is stored on the phone.\n */\n- (void)unregisterAllWatches;\n\n/**\n Returns the most recently connected watch from the -registeredWatches array.\n */\n- (PBWatch*)lastConnectedWatch;\n\n@property (nonatomic, readonly) PBDataLoggingService *dataLoggingService;\n\n@end\n\n\n@protocol PBPebbleCentralDelegate <NSObject>\n@optional\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was connected.\n @param isNew YES if the watch has been connected for the first time since the app has been installed or NO if not.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidConnect:(PBWatch*)watch isNew:(BOOL)isNew;\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was disconnected.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidDisconnect:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+AppMessages.h",
    "content": "//\n//  PBWatch+AppMessages.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\ntypedef NS_ENUM(UInt8, PBAppState) {\n  PBAppStateNotRunning = 0x00,\n  PBAppStateRunning = 0x01,\n};\n\n@interface PBWatch (AppMessages)\n\n/**\n *  Queries the watch whether AppMessages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isAppMessagesSupported YES if AppMessages are supported, NO if not.\n */\n- (void)appMessagesGetIsSupported:(void(^)(PBWatch *watch, BOOL isAppMessagesSupported))fetchedBlock;\n\n/**\n *  Pushes an update to the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Pushes an update to the watch application with the specified UUID.\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watchapp to which the update should be sent.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary withUUID:(NSData*)uuid onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with the specified UUID.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @param uuid The UUID of the watchapp for which sent messages should be handled by the onReceive block.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive withUUID:(NSData*)uuid;\n\n/**\n *  Add a handler for lifecycle events of watch applications.\n *  @param onLifecycleUpdate This block will be called when an application starts and\n *  stops running.\n *  @param watch The watch that has sent the event.\n *  @param uuid The uuid of the application that caused the event.\n *  @param newAppState The new state of the app (either PBAppStateNotRunning or PBAppStateRunning).\n */\n- (id)appMessagesAddAppLifecycleUpdateHandler:(void(^)(PBWatch *watch, NSUUID *uuid,\n                                                       PBAppState newAppState))onLifecycleUpdate;\n\n\n// INTERNAL USE ONLY\n- (id)appMessagesAddReceiveAllUpdatesHandler:(BOOL(^)(PBWatch *watch, NSUUID *uuid, NSDictionary *update))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -appMessagesAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -appMessagesAddReceiveUpdateHandler:\n *  @see -appMessagesAddReceiveUpdateHandler:\n */\n- (void)appMessagesRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Fetches the run state of the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]. You can use this method to determine whether the watch\n *  application is running or not.\n *  TODO: Ask Francois how this API works.\n *  @param onSent The block that will be called after the fetch state command has been\n *  sent to the watch.\n */\n- (void)appMessagesFetchAppState:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with the specified UUID.\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n/**\n *  Sends a command to kill the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to kill the watch application with the specified UUID.\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+Golf.h",
    "content": "//\n//  PBWatch+Golf.h\n//  PebbleKit\n//\n//  Created by Martijn The on 4/4/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n@interface PBWatch (Golf)\n\n/**\n *  The UUID of the Golf watch app.\n */\nextern NSData *PBGolfUUID;\n\n/**\n *  The key of the \"Front\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfFrontKey;\n\n/**\n *  The key of the \"Mid\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfMidKey;\n\n/**\n *  The key of the \"Back\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfBackKey;\n\n/**\n *  The key of the \"Hole\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfHoleKey;\n\n/**\n *  The key of the \"Par\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfParKey;\n\n/**\n *  The command IDs that can be sent back by the Golf watch app.\n *  @see -golfAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  GolfAppCommandPrevious = 0x01,\n  GolfAppCommandNext = 0x02,\n  GolfAppCommandSelect = 0x03,\n} GolfAppCommand;\n\n/**\n *  Queries the watch whether Golf Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isGolfSupported YES if Golf Messages are supported, NO if not.\n */\n- (void)golfGetIsSupported:(void(^)(PBWatch *watch, BOOL isGolfSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends an update to the golf app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey, PBGolfParKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n *  @see PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey and PBGolfParKey\n */\n- (void)golfAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Golf updates that are send by the Golf watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param command The command as sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -golfAppRemoveUpdateHandler:\n *  @see GolfAppCommand\n *  @see -golfAppRemoveUpdateHandler:\n */\n- (id)golfAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, GolfAppCommand command))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -golfAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -golfAppAddReceiveUpdateHandler:\n *  @see -golfAppAddReceiveUpdateHandler:\n */\n- (void)golfAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the golf app on the watch.\n *  @discussion It is recommended to perform this as the first call after -golfGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+Ping.h",
    "content": "//\n//  PBWatch+Ping.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/14/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n@interface PBWatch (Ping)\n\n/**\n * Sends a ping to the watch.\n * @param cookie A number identifying the ping.\n * @param onPong The block handler that will be called when the \"pong\" reply from the watch has been received.\n * @param watch The watch that sent the \"pong\" reply, which is \"self\". It is passed in to avoid retain loops.\n * @param cookie The cookie that was initially passed when calling this method.\n * @param onTimeout The block handler that will be called when the watch failed to reply in time.\n */\n- (void)pingWithCookie:(UInt32)cookie onPong:(void(^)(PBWatch *watch, UInt32 cookie))onPong onTimeout:(void(^)(PBWatch *watch, UInt32 cookie))onTimeout;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+PollServices.h",
    "content": "//\n//  PBWatch+PollServices.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n * PollServiceType\n */ \n\n\nenum {\n  PBPollRemoteServiceMail = 0,\n  PBPollRemoteServiceDataLogging = 1,\n  PBNumPollRemoteServices\n};\ntypedef UInt8 PBPollRemoteServiceType;\n\n@interface PBWatch (PollServices)\n// Call this upon connect with the watch to add handlers:\n- (id)addPollServicesHandler:(void(^)(PBWatch *))handler forService:(PBPollRemoteServiceType)service interval:(UInt8)interval;\n- (void)sendPollRequestForService:(PBPollRemoteServiceType)service;\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+Sports.h",
    "content": "//\n//  PBWatch+Sports.h\n//  PebbleKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n/**\n *  The UUID of the Sports watch app.\n */\nextern NSData *PBSportsUUID;\n\n/**\n *  The key of the \"Time\" field.\n *  The accompanying value must be an NSString (max. ~8 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsTimeKey;\n\n/**\n *  The key of the \"Distance\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDistanceKey;\n\n/**\n *  The key of the general purpose \"Data\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDataKey;\n\n/**\n *  The key of the \"Activity State\".\n *  The value must be an NSNumber created using +[NSNumber numberWithUint8:].\n *  @see SportsAppActivityState for valid values to use\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsActivityStateKey;\n\n/**\n *  Instances of this convenience class represent an update of the current time, distance and pace,\n *  and has a method to convert the values into a dictionary that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n@interface PBSportsUpdate : NSObject\n\n/**\n *  The current time in seconds. The possible range is currently limited from -7140. to 7140., inclusive. (±1h 59min 59sec).\n */\n@property (nonatomic, readwrite, assign) NSTimeInterval time;\n\n/**\n *  The current distance in km or mi. The possible range is currently limited from -99.9 to 99.9, inclusive.\n *  The unit of distance is dependent on the current unit setting.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float distance;\n\n/**\n *  General purpose data variable. The possible range is currently limited from -99.99 to 99.99, inclusive.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float data;\n\n/**\n *  Convenience method to create an update object.\n */\n+ (PBSportsUpdate*)updateWithTime:(NSTimeInterval)time distance:(float)distance data:(float)data;\n\n/**\n *  Creates an update dictionary from the receiver, that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n- (NSDictionary*)dictionary;\n\n/**\n *  Creates a formatted time string with from a total seconds value, formatted as \"h:mm:ss\".\n *  For example, supplying the value 3930.0f seconds will return @\"1:05:30\"\n *  @param seconds The number of seconds from which to create the time string.\n *  @return Formatted time as \"h:mm:ss\"\n */\n+ (NSString*)timeStringFromFloat:(float)seconds;\n\n@end\n\n@interface PBWatch (Sports)\n\n/**\n *  The state of the Sports activity.\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  SportsAppActivityStateInit = 0x00,\n  SportsAppActivityStateRunning = 0x01,\n  SportsAppActivityStatePaused = 0x02,\n  SportsAppActivityStateEnd = 0x03,\n} SportsAppActivityState;\n\n/**\n *  Queries the watch whether Sports Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isSportsSupported YES if Sports Messages are supported, NO if not.\n */\n- (void)sportsGetIsSupported:(void(^)(PBWatch *watch, BOOL isSportsSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the preferred\n *  unit system, either metric or imperial.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetMetric:(BOOL)isMetric onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents,\n *  to set the preferred  data label (either PACE or SPEED) and corresponding units.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetLabel:(BOOL)isPace onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the state of the\n *  sports activity. Currently only SportsAppActivityStateRunning and SportsAppActivityStatePaused are\n *  supported.\n *  @param state The new sports activity state\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetActivityState:(SportsAppActivityState)state onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends the update to the sports app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBSportsTimeKey, PBSportsPaceKey, PBSportsDistanceKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Sports updates that are send by the Sports watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param state The new sports activity state as set by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -sportsAppRemoveUpdateHandler:\n *  @see SportsAppActivityState\n *  @see -sportsAppRemoveUpdateHandler:\n */\n- (id)sportsAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, SportsAppActivityState state))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -sportsAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -sportsAppAddReceiveUpdateHandler:\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\n- (void)sportsAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the sports app on the watch.\n *  @discussion It is recommended to perform this as the first call after -sportsGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+Version.h",
    "content": "//\n//  PBWatch+Version.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/17/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  PBFirmwareVersion is a helper class that is able to parse the versionTag string\n *  into its components (os, major, minor, suffix) and facilitate comparisons\n *  between versions.\n *  Valid versions follow the following format:\n *  `vOS(.MAJOR(.MINOR(-SUFFIX)))`\n *  Where the fields OS, MAJOR, MINOR are positive, decimal integer numbers and SUFFIX\n *  an arbitrary string. MAJOR, MINOR and SUFFIX are optional (nested optionality).\n *  Examples of valid versions:\n *  `v1`\n *  `v2.1234.99-alpha-beta-gamma`\n */\n@interface PBFirmwareVersion : NSObject\n/**\n *  The OS version component.\n */\n@property (nonatomic, readonly) NSInteger os;\n\n/**\n *  The major version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger major;\n\n/**\n *  The minor version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger minor;\n\n/**\n *  The release suffix, which is the part following the dash '-'.\n *  @note If a version tag string does not contain a suffix, it will be set to an empty string.\n *  @discussion The release suffix is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *suffix;\n\n/**\n *  The version timestamp.\n *  @note The timestamp is in the final comparison equation, in the -compare: method, after evaluating\n *  os, major and minor components.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The version's git commit hash.\n *  @discussion The commit hash is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *commitHash;\n\n/**\n *  The version's git tag.\n */\n@property (nonatomic, readonly, copy) NSString *tag;\n\n/**\n *  Creates a PBFirmwareVersion object given a tag string and timestamp.\n */\n+ (PBFirmwareVersion*)firmwareVersionWithTag:(NSString*)tag commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Creates a PBFirmwareVersion object given its components.\n *  @discussion The tag string will be set to the canonical format vOS.MINOR.MAJOR(-SUFFIX).\n */\n+ (PBFirmwareVersion*)firmwareVersionWithOS:(NSInteger)os major:(NSInteger)major minor:(NSInteger)minor suffix:(NSString*)suffix commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Compares the receiver to another version object.\n *  @param aVersion The version to compare with the receiver.\n *  @return NSOrderedAscending if the value of aVersion is greater than the receiver’s,\n *  NSOrderedSame if they’re equal, and NSOrderedDescending if the value of aVersion is less than the receiver’s.\n */\n- (NSComparisonResult)compare:(PBFirmwareVersion *)aVersion;\n\n/**\n *  Convenience wrappers around -compare:\n */\n- (BOOL)isEqualOrNewer:(PBFirmwareVersion *)other;\n- (BOOL)isNewer:(PBFirmwareVersion *)other;\n- (BOOL)isEqualVersionOnly:(PBFirmwareVersion *)other;\n\n@end\n\n\n\n/**\n *  Values specifying the Pebble hardware platform variant.\n */\ntypedef enum {\n  FirmwareMetadataPlatformUnknown = 0,\n  FirmwareMetadataPlatformPebbleOneEV1 = 1,\n  FirmwareMetadataPlatformPebbleOneEV2 = 2,\n  FirmwareMetadataPlatformPebbleOneEV2_3 = 3,\n  FirmwareMetadataPlatformPebbleOneEV2_4 = 4,\n  FirmwareMetadataPlatformPebbleOnePointFive = 5,\n  FirmwareMetadataPlatformPebbleTwoPointZero = 6,\n  FirmwareMetadataPlatformPebbleOneBigboard = 0xff,\n  FirmwareMetadataPlatformPebbleOneBigboard2 = 0xfe,\n} FirmwareMetadataPlatform;\n\n/**\n *  Instances of PBFirmwareMetadata describe a firmware in terms of\n *  its version, whether it is a recovery firmware and its intended hardware\n *  platform.\n *  @see PBVersionInfo\n */\n\n@interface PBFirmwareMetadata : NSObject\n\n/**\n *  The version of the firmware.\n *  @see PBFirmwareVersion\n */\n@property (nonatomic, readonly) PBFirmwareVersion *version;\n\n/**\n *  YES if the firmware is a recovery firmware, NO if it is a regular firmware.\n */\n@property (nonatomic, readonly) BOOL isRecoveryFirmware;\n\n/**\n *  The hardware platform variant with which the firmware is compatible.\n */\n@property (nonatomic, readonly) FirmwareMetadataPlatform hardwarePlatform;\n\n/**\n *  Converts a <FirmwareMetadataPlatform> value to a string.\n *  @param hardwarePlatform The hardware platform value to convert\n *  @return A string of the hardware platform\n */\n+ (NSString*)hardwarePlatformToString:(FirmwareMetadataPlatform)hardwarePlatform;\n\n/**\n *  Converts an NSString hardware platform string to the corresponding\n *  FirmwareMetadataPlatform value.\n *  @param hardwarePlatformString The string representing the hardware platform.\n *  @return The hardware platform enum value\n */\n+ (FirmwareMetadataPlatform)stringToHardwarePlatform:(NSString *)hardwarePlatformString;\n\n@end\n\n/**\n *  Instances of PBResourceMetadata describe (system) resources.\n *  @see PBVersionInfo\n */\n\n@interface PBResourceMetadata : NSObject\n\n/**\n *  The version of the resources as the Epoch timestamp of the Git commit.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The checksum of the resources.\n */\n@property (nonatomic, readonly) UInt32 crc;\n\n/**\n *  The human-friendly string version of the resources.\n */\n@property (nonatomic, readonly, strong) NSString *friendlyVersion;\n\n/**\n *  YES if the metadata represents valid resources, NO if it does not.\n */\n- (BOOL)isValid;\n\n@end\n\n/**\n *  An instance of PBVersionInfo describes all the different system software (Pebble OS)\n *  on a Pebble watch and other auxiliary information.\n *  @see PBWatch\n */\n\n@interface PBVersionInfo : NSObject\n\n/**\n *  The metadata of the firmware that is running.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *runningFirmwareMetadata;\n\n/**\n *  The metadata of the recovery firmware that is in storage.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *recoveryFirmwareMetadata;\n\n/**\n *  The metadata of the system resources.\n */\n@property (nonatomic, readonly, strong) PBResourceMetadata *systemResources;\n\n/**\n *  The version of the bootloader.\n */\n@property (nonatomic, readonly) UInt32 bootloaderVersion;\n\n/**\n *  The version of the hardware.\n */\n@property (nonatomic, readonly, strong) NSString *hardwareVersion;\n\n/**\n *  The serial number.\n */\n@property (nonatomic, readonly, strong) NSString *serialNumber;\n\n/**\n *  The current Bluetooth device address.\n */\n@property (nonatomic, readonly, strong) NSData *deviceAddress;\n\n/**\n *  YES if valid recovery firmware is installed, NO if not.\n */\n- (BOOL)hasRecoveryFirmware;\n\n/**\n *  YES if valid system resources are installed, NO if not.\n */\n- (BOOL)hasSystemResources;\n\n@end\n\n@interface PBWatch (Version)\n\n/**\n *  Requests the version info from the receiver.\n *  @param handler The handler that will be called when the version info response has been received.\n *  @param onTimeout The handler that will be called if the watch did not respond within 5 seconds.\n *  @param watch The watch for which the version info was requested.\n *  @param versionInfo The version info response.\n *  @discussion The <PBVersionInfo> response will be cached. The latest version info can be\n *  accessed through the <versionInfo> property of <PBWatch>.\n */\n- (void)getVersionInfo:(void (^)(PBWatch *watch, PBVersionInfo *versionInfo))handler onTimeout:(void (^)(PBWatch *watch))onTimeout;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch.h",
    "content": "//\n//  PBWatch.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@protocol PBWatchDelegate;\n@class PBVersionInfo;\n@class PBDataLoggingService;\n\n/**\n *  Represents a Pebble watch.\n *\n *  On iOS, there is the notion of a \"communication session\" between an app and\n *  the Pebble watch. You can imagine this as a \"data pipe\" directly from the\n *  watch to your app. However, there is only one session for 3rd party apps.\n *  This one session has to be shared among all 3rd party apps that want to\n *  communicate with Pebble (excluding the official Pebble iOS app).\n *\n *  Unfortunately, the session can only be opened from the phone app. This means\n *  that the iOS app has to start talking to the watch first to open the\n *  communications channel; the other way around is not possible.\n *  Most methods in the PBWatch categories (Ping), (Version), (Sports), (Golf)\n *  and (AppMessages) all implicitly open the shared communication session.\n *\n *  Lastly, iOS provides no good way to manage how the one shared session is\n *  accessed or used. Simply, the last iOS app to try to open it, wins and gets\n *  to use it. Therefore, it is important that your iOS app does **not** try\n *  communicate when a Pebble is connected.\n *\n *  When the user has stopped using your app (e.g. when going to the background\n *  or when explicitely stopping a certain activity in the app) your iOS app\n *  should close the communication session using the -closeSession: method.\n */\n@interface PBWatch : NSObject\n\n/**\n *  YES if the receiver is connected and NO if the receiver is disconnected.\n *  @discussion This property is KVO-compliant.\n */\n@property (nonatomic, readonly, getter=isConnected) BOOL connected;\n\n/**\n *  The human-friendly name of the receiver.\n *  This is the same name as the user will see in the iOS Bluetooth Settings.\n */\n@property (nonatomic, readonly) NSString *name;\n\n/**\n *  The serial number of the receiver.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  The versionInfo of the receiver.\n *  @see PBVersionInfo\n */\n@property (nonatomic, readonly) PBVersionInfo *versionInfo;\n\n/**\n *  The delegate of the watch that will be notified of disconnections and errors.\n *  @see PBWatchDelegate\n */\n@property (nonatomic, readwrite, weak) id<PBWatchDelegate> delegate;\n\n/**\n *  The userInfo property can be used to associate application specific data\n *  with the watch. Note that the application itself is responsible for persisting\n *  the information if neccessary.\n */\n@property (nonatomic, readwrite, strong) id userInfo;\n\n/**\n *  The date when the watch was last known to be connected.\n *  This date will be updated automatically when the watch connects and\n *  disconnects. While the watch is being connected, this date will not be updated.\n */\n@property (nonatomic, readonly) NSDate *lastConnectedDate;\n\n/**\n *  Developer-friendly debugging description of the watch.\n *  @return localized, user-friendly summary of the receiver, including\n *  software and hardware version information, if available.\n */\n- (NSString*)friendlyDescription;\n\n/**\n *  Closes the communication session with the watch.\n *  Since there is only one, shared session for all 3rd party iOS apps,\n *  an app should close the session after the user is done using the app/watch-integration,\n *  so it can be used by other apps.\n *  The communication session is implicitely opened automatically when needed.\n *  @param onDone Callback block that will be called after the closing of the session\n *  has completed. If there is no open session, the onDone block will (also) be executed\n *  asynchronously on the calling queue.\n */\n- (void)closeSession:(void(^)(void))onDone;\n\n@end\n\n@protocol PBWatchDelegate <NSObject>\n@optional\n\n/**\n *  Called when the watch got disconnected.\n */\n- (void)watchDidDisconnect:(PBWatch*)watch;\n\n/**\n *  Called when the watch caught an error.\n */\n- (void)watch:(PBWatch*)watch handleError:(NSError*)error;\n\n/**\n *  Called when the internal EASession is about to be reset.\n */\n- (void)watchWillResetSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is opened\n */\n- (void)watchDidOpenSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is closed\n */\n- (void)watchDidCloseSession:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PebbleKit.h",
    "content": "//\n//  PebbleSDK.h\n//  PebbleSDK\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#import <PebbleKit/PBWatch.h>\n#import <PebbleKit/PBPebbleCentral.h>\n#import <PebbleKit/PBWatch+Ping.h>\n#import <PebbleKit/PBWatch+Version.h>\n#import <PebbleKit/PBErrors.h>\n#import <PebbleKit/PBWatch+AppMessages.h>\n#import <PebbleKit/NSNumber+stdint.h>\n#import <PebbleKit/PBWatch+Sports.h>\n#import <PebbleKit/PBWatch+Golf.h>\n#import <PebbleKit/PBBitmap.h>\n#import <PebbleKit/PBDataLoggingService.h>\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/gtypes.h",
    "content": "//\n//  gtypes.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#ifndef PebbleKit_gtypes_h\n#define PebbleKit_gtypes_h\n\ntypedef struct GSize {\n  int16_t w;\n  int16_t h;\n} GSize;\n\ntypedef struct GPoint {\n  int16_t x;\n  int16_t y;\n} GPoint;\n\ntypedef struct GRect {\n  GPoint origin;\n  GSize size;\n} GRect;\n\n#endif\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/NSDictionary+Pebble.h",
    "content": "//\n//  NSDictionary+Pebble.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSDictionary (Pebble)\n\n/**\n *  Serializes the receiver into a Pebble dict.\n *  @note The receiver dictionary must comply to the following constraints:\n *  * The keys must be instances of NSNumber. Their -unsignedLongValue return value will be used as final key.\n *  * The values must be instances of either NSString, NSData or NSNumber. Use the NSNumber (stdint) category\n *  to specify the signedness and width of NSNumbers.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryUnsupportedKeyClass,\n *  PBErrorCodeDictionaryUnsupportedValueClass or PBErrorCodeDictionaryUnsupportedValueClass.\n *  @see -dictionaryFromPebbleDictionaryDataWithError:\n */\n- (NSData*)pebbleDictionaryData:(NSError * __autoreleasing *)error;\n\n@end\n\n@interface NSData (Pebble)\n\n/**\n *  Interprets the receiver as Pebble dict data and deserializes it into an NSDictionary.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryInternalConsistency.\n *  @see -pebbleDictionaryData:\n */\n- (NSDictionary*)dictionaryFromPebbleDictionaryDataWithError:(NSError * __autoreleasing *)error;\n\n@end"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/NSNumber+stdint.h",
    "content": "//\n//  NSNumber+stdint.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/**\n *  This category exposes the capabilities the underlying CFNumber to explicitely\n *  store the signedness and the width of the storage.\n */\n\n@interface NSNumber (stdint)\n\n/**\n *  Interprets the receiver as a 32-bits wide, unsigned integer.\n */\n- (uint32_t)uint32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, unsigned integer.\n */\n- (uint16_t)uint16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, unsigned integer.\n */\n- (uint8_t)uint8Value;\n\n/**\n *  Interprets the receiver as a 32-bits wide, signed integer.\n */\n- (int32_t)int32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, signed integer.\n */\n- (int16_t)int16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, signed integer.\n */\n- (int8_t)int8Value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint32:(uint32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint16:(uint16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint8:(uint8_t)value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt32:(int32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt16:(int16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt8:(int8_t)value;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a floating pointer number or not.\n */\n- (BOOL)isFloat;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a signed integer or not.\n */\n- (BOOL)isSigned;\n\n/**\n *  Gets the width in bytes of the integer that is stored by the receiver.\n */\n- (uint8_t)width;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBBitmap.h",
    "content": "//\n//  PBBitmap.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIImage.h>\n#import <PebbleKit/gtypes.h>\n\n/**\n *  Helper class to convert a UIImage to Pebble bitmap pixel data and GBitmap metadata.\n *  Refer to the documentation of Pebble's native watch app SDK on the GBitmap format.\n */\n\n@interface PBBitmap : NSObject\n\n/**\n *  The pixel data of the bitmap.\n *  This corresponds to the data as pointed to by GBitmap's `addr` field.\n */\n@property (nonatomic, readonly, strong) NSData *pixelData;\n\n/**\n *  The number of bytes per row.\n *  Always a multiple of 4 bytes.\n */\n@property (nonatomic, readonly, assign) uint16_t rowSizeBytes;\n\n/**\n *  Bitfield of metadata flags.\n *  This corresponds to GBitmap's `info_flags` field.\n */\n@property (nonatomic, readonly, assign) uint16_t infoFlags;\n\n/**\n *  The box of bits inside `pixelData`, that contains\n *  the actual image data to use.\n *  This corresponds to GBitmap's `bounds` field.\n */\n@property (nonatomic, readonly, assign) GRect bounds;\n\n/**\n *  Factory method to create a PBBitmap from a UIImage instance.\n *  @param image The UIImage from which to create the PBBitmap\n */\n+ (PBBitmap*)pebbleBitmapWithUIImage:(UIImage*)image;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBDataLoggingService.h",
    "content": "//\n//  PBDataLoggingService.h\n//  PebbleKit\n//\n//  Created by Martijn The on 7/19/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  Data logging datatypes.\n */\nenum {\n  //! Array of bytes\n  PBDataLoggingTypeByteArray = 0,\n  //! unsigned integer\n  PBDataLoggingTypeUInt = 2,\n  //! signed integer\n  PBDataLoggingTypeInt = 3,\n};\ntypedef UInt8 PBDataLoggingType;\n\n/**\n *  The metadata of a data logging session. Used to identify a session.\n */\n@interface PBDataLoggingSessionMetadata : NSObject <NSSecureCoding, NSCopying>\n\n/**\n *  A tag associated with the session.\n */\n@property (nonatomic, readonly) UInt32 tag;\n\n/**\n *  The timestamp of the moment the session was created by the watchapp.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The type of data stored in this session.\n */\n@property (nonatomic, readonly) PBDataLoggingType type;\n\n/**\n *  The size of a data item.\n */\n@property (nonatomic, readonly) UInt16 itemSize;\n\n/**\n *  The serial number of the watch that created the sessions.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  Creates a new data logging session metadata object, given all its property values.\n *  This method is provided to create a metadata object that can be used to\n *  compare it with a metadata object that is passed into one of the\n *  PBDataLoggingServiceDelegate methods.\n *  @param tag The tag associated with the session\n *  @param timestamp The timestamp of the creation of the session\n *  @param type The type of data stored in the session\n *  @param itemSize The size of a data item\n *  @param serialNumber The serial number of the watch that created the session\n *  @return A session metadata object with the specified information\n */\n+ (id)metadataWithTag:(UInt32)tag\n            timestamp:(UInt32)timestamp\n                 type:(PBDataLoggingType)type\n             itemSize:(UInt16)itemSize\n         serialNumber:(NSString *)serialNumber;\n\n/**\n *  Tests the equality of two data logging session metadata objects.\n *  This method can be used to compare two session metadata objects\n *  to check whether they are referring to the same session or not.\n *  @param sessionMetadata\n *  @return YES if all the property values of receiver are equal to the property\n *  values of the given session.\n *  @note Equivalent to -[PBDataLoggingSessionMetadata isEqual:]\n */\n- (BOOL)isEqualToDataLoggingSessionMetadata:(PBDataLoggingSessionMetadata *)sessionMetadata;\n@end\n\n/**\n *  Data logging delegate protocol. The object that implements this protocol\n *  is responsible for handling incoming data.\n */\n@protocol PBDataLoggingServiceDelegate <NSObject>\n@optional\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param bytes Pointer to the array of bytes.\n *  The array contains (numberOfItems * session.itemSize) bytes.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasByteArrays:(const UInt8 * const)bytes numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt8s:(const UInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt16s:(const UInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt32s:(const UInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt8s:(const SInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt16s:(const SInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt32s:(const SInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time a session is finished.\n *  This is guaranteed to be called only after all data has been received and\n *  consumed by the application.\n *  @param service The data logging service.\n *  @param session The metadata of the session.\n */\n- (void)dataLoggingService:(PBDataLoggingService *)service sessionDidFinish:(PBDataLoggingSessionMetadata *)session;\n\n@end\n\n/**\n *  The data logging service. Assign a delegate object in order to receive\n *  data from your watchapp.\n */\n@interface PBDataLoggingService : NSObject\n\n/**\n *  The delegate that has the responsility of handling callbacks from the\n *  data logging service.\n */\n@property (atomic, readwrite, weak) id<PBDataLoggingServiceDelegate> delegate;\n\n/**\n *  Sets the queue on which delegate methods will be executed.\n *  Callbacks are intended to be processed in the order as they come in, so it\n *  you must use a serial queue. If set to nil (default) the main queue is used.\n *  @param delegateQueue The queue on which the delegate methods will be executed.\n */\n- (void)setDelegateQueue:(dispatch_queue_t)delegateQueue;\n\n/**\n * Query the watch for data logging data.\n */\n- (void)pollForData;\n  \n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBErrors.h",
    "content": "//\n//  PBErrors.h\n//  PebbleSDK\n//\n//  Created by Martijn The on 7/26/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nextern NSString *PBErrorDomain;\n\n/**\n *  PebbleKit Error codes.\n *  Inspect the localizedDescription of any NSError objects for a description.\n */\n\ntypedef enum {\n  PBErrorCodeNoSupportedProtocolsInInfoPlist,\n  PBErrorCodeErrorCreatingSession,\n  PBErrorCodeOutputStreamError,\n  PBErrorCodeInputStreamError,\n  PBErrorCodeSendMessageTimeout,\n  PBErrorCodeEndpointDisallowed,\n  PBErrorCodeVersionInfoTimeout,\n  PBErrorCodeCannotCreateSessionWhileClosing,\n  PBErrorCodeNoAppUUID,\n  PBErrorCodeAppMessageRejected,\n  PBErrorCodeAppMessageAckTimeout,\n  PBErrorCodeDictionaryUnsupportedKeyClass,\n  PBErrorCodeDictionaryUnsupportedValueClass,\n  PBErrorCodeDictionaryInternalConsistency,\n  PBErrorCodeInvalidArguments,\n  PBErrorCodePebbleAppUnreachable,\n  PBErrorCodePebbleAppRequestTimeout,\n  PBErrorCodePebbleAppEmptyResponse,\n  PBErrorCodePebbleAppUnexpectedResponse,\n  PBErrorCodeServerNotAvailable,\n  PBErrorCodeDownloadFailed,\n  PBErrorCodePebbleNotConnected\n} PBErrorCode;\n\n@interface NSError (Pebble)\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode and with an underlying NSError object.\n *  @param code The error code for which to create the error\n *  @param error The underlying error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code underLyingError:(NSError*)error;\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode.\n *  @param code The error code for which to create the error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code;\n\n@end"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBLog.h",
    "content": "//\n//  PBLog.h\n//  PebbleApp\n//\n//  Created by Martijn The on 11/29/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import \"DDLog.h\"\n\n#ifndef PBWSLOG_CONTEXT\n#define PBWSLOG_CONTEXT 1\n#endif\n\nextern int PBLogLevel;\n\n#define LogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define WSLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n\n#define LogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBPebbleCentral.h",
    "content": "//\n//  PBPebbleCentral.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class PBWatch;\n@class PBDataLoggingService;\n@protocol PBPebbleCentralDelegate;\n\n/**\n PebbleCentral plays the central role for client iOS apps (e.g. RunKeeper).\n */\n@interface PBPebbleCentral : NSObject\n\n/**\n @returns The default central singleton instance.\n */\n+ (PBPebbleCentral*)defaultCentral;\n\n/**\n *  Enables debug logs. The logs will be routed to the system log (ASL) and\n *  console. It is advised to call this before making any other calls to PebbleKit.\n */\n+ (void)setDebugLogsEnabled:(BOOL)logsEnabled;\n\n/**\n The watches that are currently connected. Do not cache the array because it can change over time.\n */\n@property (nonatomic, readonly, strong) NSArray *connectedWatches;\n\n/**\n The watches that are stored in the user preferences of the application.\n */\n@property (nonatomic, readonly, strong) NSArray *registeredWatches;\n\n/**\n The central's delegate.\n */\n@property (nonatomic, readwrite, weak) id<PBPebbleCentralDelegate> delegate;\n\n/**\n *  The UUID is used as the identifier of the watch application and is used\n *  to make sure that appMessage and dataLogging communications arrives at its companion app\n *  on the other device (and not in another app).\n *  For most app message methods there is are two variants: one that does not take a UUID parameter and one that does take\n *  a UUID parameter (for example, -appMessagesAddReceiveUpdateHandler: vs appMessagesAddReceiveUpdateHandler:withUUID:).\n *  The methods that do not take a UUID, will use the UUID as set prior to this property.\n *  @param uuid The 16 byte UUID of your app.\n *  @note The UUID needs to be set before using either app message or data logging.\n */\n@property (nonatomic, strong, readwrite) NSData *appUUID;\n\n/**\n *  Verifies the currently set application UUID.\n *  @return YES if the currently set UUID is valid, NO if it is not.\n *  @see -setAppUuid:\n */\n- (BOOL)hasValidAppUUID;\n\n/**\n @returns YES if the Pebble iOS app is installed, NO if it is not installed.\n */\n- (BOOL)isMobileAppInstalled;\n\n/**\n Redirects to Pebble in the App Store, so the user can install the app.\n */\n- (void)installMobileApp;\n\n/**\n Wipes out the data associated with the registered watches, that is stored on the phone.\n */\n- (void)unregisterAllWatches;\n\n/**\n Returns the most recently connected watch from the -registeredWatches array.\n */\n- (PBWatch*)lastConnectedWatch;\n\n@property (nonatomic, readonly) PBDataLoggingService *dataLoggingService;\n\n@end\n\n\n@protocol PBPebbleCentralDelegate <NSObject>\n@optional\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was connected.\n @param isNew YES if the watch has been connected for the first time since the app has been installed or NO if not.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidConnect:(PBWatch*)watch isNew:(BOOL)isNew;\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was disconnected.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidDisconnect:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+AppMessages.h",
    "content": "//\n//  PBWatch+AppMessages.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\ntypedef NS_ENUM(UInt8, PBAppState) {\n  PBAppStateNotRunning = 0x00,\n  PBAppStateRunning = 0x01,\n};\n\n@interface PBWatch (AppMessages)\n\n/**\n *  Queries the watch whether AppMessages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isAppMessagesSupported YES if AppMessages are supported, NO if not.\n */\n- (void)appMessagesGetIsSupported:(void(^)(PBWatch *watch, BOOL isAppMessagesSupported))fetchedBlock;\n\n/**\n *  Pushes an update to the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Pushes an update to the watch application with the specified UUID.\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watchapp to which the update should be sent.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary withUUID:(NSData*)uuid onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with the specified UUID.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @param uuid The UUID of the watchapp for which sent messages should be handled by the onReceive block.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive withUUID:(NSData*)uuid;\n\n/**\n *  Add a handler for lifecycle events of watch applications.\n *  @param onLifecycleUpdate This block will be called when an application starts and\n *  stops running.\n *  @param watch The watch that has sent the event.\n *  @param uuid The uuid of the application that caused the event.\n *  @param newAppState The new state of the app (either PBAppStateNotRunning or PBAppStateRunning).\n */\n- (id)appMessagesAddAppLifecycleUpdateHandler:(void(^)(PBWatch *watch, NSUUID *uuid,\n                                                       PBAppState newAppState))onLifecycleUpdate;\n\n\n// INTERNAL USE ONLY\n- (id)appMessagesAddReceiveAllUpdatesHandler:(BOOL(^)(PBWatch *watch, NSUUID *uuid, NSDictionary *update))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -appMessagesAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -appMessagesAddReceiveUpdateHandler:\n *  @see -appMessagesAddReceiveUpdateHandler:\n */\n- (void)appMessagesRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Fetches the run state of the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]. You can use this method to determine whether the watch\n *  application is running or not.\n *  TODO: Ask Francois how this API works.\n *  @param onSent The block that will be called after the fetch state command has been\n *  sent to the watch.\n */\n- (void)appMessagesFetchAppState:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with the specified UUID.\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n/**\n *  Sends a command to kill the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to kill the watch application with the specified UUID.\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+Golf.h",
    "content": "//\n//  PBWatch+Golf.h\n//  PebbleKit\n//\n//  Created by Martijn The on 4/4/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n@interface PBWatch (Golf)\n\n/**\n *  The UUID of the Golf watch app.\n */\nextern NSData *PBGolfUUID;\n\n/**\n *  The key of the \"Front\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfFrontKey;\n\n/**\n *  The key of the \"Mid\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfMidKey;\n\n/**\n *  The key of the \"Back\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfBackKey;\n\n/**\n *  The key of the \"Hole\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfHoleKey;\n\n/**\n *  The key of the \"Par\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfParKey;\n\n/**\n *  The command IDs that can be sent back by the Golf watch app.\n *  @see -golfAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  GolfAppCommandPrevious = 0x01,\n  GolfAppCommandNext = 0x02,\n  GolfAppCommandSelect = 0x03,\n} GolfAppCommand;\n\n/**\n *  Queries the watch whether Golf Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isGolfSupported YES if Golf Messages are supported, NO if not.\n */\n- (void)golfGetIsSupported:(void(^)(PBWatch *watch, BOOL isGolfSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends an update to the golf app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey, PBGolfParKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n *  @see PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey and PBGolfParKey\n */\n- (void)golfAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Golf updates that are send by the Golf watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param command The command as sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -golfAppRemoveUpdateHandler:\n *  @see GolfAppCommand\n *  @see -golfAppRemoveUpdateHandler:\n */\n- (id)golfAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, GolfAppCommand command))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -golfAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -golfAppAddReceiveUpdateHandler:\n *  @see -golfAppAddReceiveUpdateHandler:\n */\n- (void)golfAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the golf app on the watch.\n *  @discussion It is recommended to perform this as the first call after -golfGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+Ping.h",
    "content": "//\n//  PBWatch+Ping.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/14/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n@interface PBWatch (Ping)\n\n/**\n * Sends a ping to the watch.\n * @param cookie A number identifying the ping.\n * @param onPong The block handler that will be called when the \"pong\" reply from the watch has been received.\n * @param watch The watch that sent the \"pong\" reply, which is \"self\". It is passed in to avoid retain loops.\n * @param cookie The cookie that was initially passed when calling this method.\n * @param onTimeout The block handler that will be called when the watch failed to reply in time.\n */\n- (void)pingWithCookie:(UInt32)cookie onPong:(void(^)(PBWatch *watch, UInt32 cookie))onPong onTimeout:(void(^)(PBWatch *watch, UInt32 cookie))onTimeout;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+PollServices.h",
    "content": "//\n//  PBWatch+PollServices.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n * PollServiceType\n */ \n\n\nenum {\n  PBPollRemoteServiceMail = 0,\n  PBPollRemoteServiceDataLogging = 1,\n  PBNumPollRemoteServices\n};\ntypedef UInt8 PBPollRemoteServiceType;\n\n@interface PBWatch (PollServices)\n// Call this upon connect with the watch to add handlers:\n- (id)addPollServicesHandler:(void(^)(PBWatch *))handler forService:(PBPollRemoteServiceType)service interval:(UInt8)interval;\n- (void)sendPollRequestForService:(PBPollRemoteServiceType)service;\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+Sports.h",
    "content": "//\n//  PBWatch+Sports.h\n//  PebbleKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n/**\n *  The UUID of the Sports watch app.\n */\nextern NSData *PBSportsUUID;\n\n/**\n *  The key of the \"Time\" field.\n *  The accompanying value must be an NSString (max. ~8 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsTimeKey;\n\n/**\n *  The key of the \"Distance\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDistanceKey;\n\n/**\n *  The key of the general purpose \"Data\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDataKey;\n\n/**\n *  The key of the \"Activity State\".\n *  The value must be an NSNumber created using +[NSNumber numberWithUint8:].\n *  @see SportsAppActivityState for valid values to use\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsActivityStateKey;\n\n/**\n *  Instances of this convenience class represent an update of the current time, distance and pace,\n *  and has a method to convert the values into a dictionary that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n@interface PBSportsUpdate : NSObject\n\n/**\n *  The current time in seconds. The possible range is currently limited from -7140. to 7140., inclusive. (±1h 59min 59sec).\n */\n@property (nonatomic, readwrite, assign) NSTimeInterval time;\n\n/**\n *  The current distance in km or mi. The possible range is currently limited from -99.9 to 99.9, inclusive.\n *  The unit of distance is dependent on the current unit setting.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float distance;\n\n/**\n *  General purpose data variable. The possible range is currently limited from -99.99 to 99.99, inclusive.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float data;\n\n/**\n *  Convenience method to create an update object.\n */\n+ (PBSportsUpdate*)updateWithTime:(NSTimeInterval)time distance:(float)distance data:(float)data;\n\n/**\n *  Creates an update dictionary from the receiver, that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n- (NSDictionary*)dictionary;\n\n/**\n *  Creates a formatted time string with from a total seconds value, formatted as \"h:mm:ss\".\n *  For example, supplying the value 3930.0f seconds will return @\"1:05:30\"\n *  @param seconds The number of seconds from which to create the time string.\n *  @return Formatted time as \"h:mm:ss\"\n */\n+ (NSString*)timeStringFromFloat:(float)seconds;\n\n@end\n\n@interface PBWatch (Sports)\n\n/**\n *  The state of the Sports activity.\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  SportsAppActivityStateInit = 0x00,\n  SportsAppActivityStateRunning = 0x01,\n  SportsAppActivityStatePaused = 0x02,\n  SportsAppActivityStateEnd = 0x03,\n} SportsAppActivityState;\n\n/**\n *  Queries the watch whether Sports Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isSportsSupported YES if Sports Messages are supported, NO if not.\n */\n- (void)sportsGetIsSupported:(void(^)(PBWatch *watch, BOOL isSportsSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the preferred\n *  unit system, either metric or imperial.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetMetric:(BOOL)isMetric onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents,\n *  to set the preferred  data label (either PACE or SPEED) and corresponding units.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetLabel:(BOOL)isPace onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the state of the\n *  sports activity. Currently only SportsAppActivityStateRunning and SportsAppActivityStatePaused are\n *  supported.\n *  @param state The new sports activity state\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetActivityState:(SportsAppActivityState)state onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends the update to the sports app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBSportsTimeKey, PBSportsPaceKey, PBSportsDistanceKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Sports updates that are send by the Sports watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param state The new sports activity state as set by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -sportsAppRemoveUpdateHandler:\n *  @see SportsAppActivityState\n *  @see -sportsAppRemoveUpdateHandler:\n */\n- (id)sportsAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, SportsAppActivityState state))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -sportsAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -sportsAppAddReceiveUpdateHandler:\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\n- (void)sportsAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the sports app on the watch.\n *  @discussion It is recommended to perform this as the first call after -sportsGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+Version.h",
    "content": "//\n//  PBWatch+Version.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/17/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  PBFirmwareVersion is a helper class that is able to parse the versionTag string\n *  into its components (os, major, minor, suffix) and facilitate comparisons\n *  between versions.\n *  Valid versions follow the following format:\n *  `vOS(.MAJOR(.MINOR(-SUFFIX)))`\n *  Where the fields OS, MAJOR, MINOR are positive, decimal integer numbers and SUFFIX\n *  an arbitrary string. MAJOR, MINOR and SUFFIX are optional (nested optionality).\n *  Examples of valid versions:\n *  `v1`\n *  `v2.1234.99-alpha-beta-gamma`\n */\n@interface PBFirmwareVersion : NSObject\n/**\n *  The OS version component.\n */\n@property (nonatomic, readonly) NSInteger os;\n\n/**\n *  The major version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger major;\n\n/**\n *  The minor version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger minor;\n\n/**\n *  The release suffix, which is the part following the dash '-'.\n *  @note If a version tag string does not contain a suffix, it will be set to an empty string.\n *  @discussion The release suffix is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *suffix;\n\n/**\n *  The version timestamp.\n *  @note The timestamp is in the final comparison equation, in the -compare: method, after evaluating\n *  os, major and minor components.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The version's git commit hash.\n *  @discussion The commit hash is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *commitHash;\n\n/**\n *  The version's git tag.\n */\n@property (nonatomic, readonly, copy) NSString *tag;\n\n/**\n *  Creates a PBFirmwareVersion object given a tag string and timestamp.\n */\n+ (PBFirmwareVersion*)firmwareVersionWithTag:(NSString*)tag commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Creates a PBFirmwareVersion object given its components.\n *  @discussion The tag string will be set to the canonical format vOS.MINOR.MAJOR(-SUFFIX).\n */\n+ (PBFirmwareVersion*)firmwareVersionWithOS:(NSInteger)os major:(NSInteger)major minor:(NSInteger)minor suffix:(NSString*)suffix commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Compares the receiver to another version object.\n *  @param aVersion The version to compare with the receiver.\n *  @return NSOrderedAscending if the value of aVersion is greater than the receiver’s,\n *  NSOrderedSame if they’re equal, and NSOrderedDescending if the value of aVersion is less than the receiver’s.\n */\n- (NSComparisonResult)compare:(PBFirmwareVersion *)aVersion;\n\n/**\n *  Convenience wrappers around -compare:\n */\n- (BOOL)isEqualOrNewer:(PBFirmwareVersion *)other;\n- (BOOL)isNewer:(PBFirmwareVersion *)other;\n- (BOOL)isEqualVersionOnly:(PBFirmwareVersion *)other;\n\n@end\n\n\n\n/**\n *  Values specifying the Pebble hardware platform variant.\n */\ntypedef enum {\n  FirmwareMetadataPlatformUnknown = 0,\n  FirmwareMetadataPlatformPebbleOneEV1 = 1,\n  FirmwareMetadataPlatformPebbleOneEV2 = 2,\n  FirmwareMetadataPlatformPebbleOneEV2_3 = 3,\n  FirmwareMetadataPlatformPebbleOneEV2_4 = 4,\n  FirmwareMetadataPlatformPebbleOnePointFive = 5,\n  FirmwareMetadataPlatformPebbleTwoPointZero = 6,\n  FirmwareMetadataPlatformPebbleOneBigboard = 0xff,\n  FirmwareMetadataPlatformPebbleOneBigboard2 = 0xfe,\n} FirmwareMetadataPlatform;\n\n/**\n *  Instances of PBFirmwareMetadata describe a firmware in terms of\n *  its version, whether it is a recovery firmware and its intended hardware\n *  platform.\n *  @see PBVersionInfo\n */\n\n@interface PBFirmwareMetadata : NSObject\n\n/**\n *  The version of the firmware.\n *  @see PBFirmwareVersion\n */\n@property (nonatomic, readonly) PBFirmwareVersion *version;\n\n/**\n *  YES if the firmware is a recovery firmware, NO if it is a regular firmware.\n */\n@property (nonatomic, readonly) BOOL isRecoveryFirmware;\n\n/**\n *  The hardware platform variant with which the firmware is compatible.\n */\n@property (nonatomic, readonly) FirmwareMetadataPlatform hardwarePlatform;\n\n/**\n *  Converts a <FirmwareMetadataPlatform> value to a string.\n *  @param hardwarePlatform The hardware platform value to convert\n *  @return A string of the hardware platform\n */\n+ (NSString*)hardwarePlatformToString:(FirmwareMetadataPlatform)hardwarePlatform;\n\n/**\n *  Converts an NSString hardware platform string to the corresponding\n *  FirmwareMetadataPlatform value.\n *  @param hardwarePlatformString The string representing the hardware platform.\n *  @return The hardware platform enum value\n */\n+ (FirmwareMetadataPlatform)stringToHardwarePlatform:(NSString *)hardwarePlatformString;\n\n@end\n\n/**\n *  Instances of PBResourceMetadata describe (system) resources.\n *  @see PBVersionInfo\n */\n\n@interface PBResourceMetadata : NSObject\n\n/**\n *  The version of the resources as the Epoch timestamp of the Git commit.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The checksum of the resources.\n */\n@property (nonatomic, readonly) UInt32 crc;\n\n/**\n *  The human-friendly string version of the resources.\n */\n@property (nonatomic, readonly, strong) NSString *friendlyVersion;\n\n/**\n *  YES if the metadata represents valid resources, NO if it does not.\n */\n- (BOOL)isValid;\n\n@end\n\n/**\n *  An instance of PBVersionInfo describes all the different system software (Pebble OS)\n *  on a Pebble watch and other auxiliary information.\n *  @see PBWatch\n */\n\n@interface PBVersionInfo : NSObject\n\n/**\n *  The metadata of the firmware that is running.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *runningFirmwareMetadata;\n\n/**\n *  The metadata of the recovery firmware that is in storage.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *recoveryFirmwareMetadata;\n\n/**\n *  The metadata of the system resources.\n */\n@property (nonatomic, readonly, strong) PBResourceMetadata *systemResources;\n\n/**\n *  The version of the bootloader.\n */\n@property (nonatomic, readonly) UInt32 bootloaderVersion;\n\n/**\n *  The version of the hardware.\n */\n@property (nonatomic, readonly, strong) NSString *hardwareVersion;\n\n/**\n *  The serial number.\n */\n@property (nonatomic, readonly, strong) NSString *serialNumber;\n\n/**\n *  The current Bluetooth device address.\n */\n@property (nonatomic, readonly, strong) NSData *deviceAddress;\n\n/**\n *  YES if valid recovery firmware is installed, NO if not.\n */\n- (BOOL)hasRecoveryFirmware;\n\n/**\n *  YES if valid system resources are installed, NO if not.\n */\n- (BOOL)hasSystemResources;\n\n@end\n\n@interface PBWatch (Version)\n\n/**\n *  Requests the version info from the receiver.\n *  @param handler The handler that will be called when the version info response has been received.\n *  @param onTimeout The handler that will be called if the watch did not respond within 5 seconds.\n *  @param watch The watch for which the version info was requested.\n *  @param versionInfo The version info response.\n *  @discussion The <PBVersionInfo> response will be cached. The latest version info can be\n *  accessed through the <versionInfo> property of <PBWatch>.\n */\n- (void)getVersionInfo:(void (^)(PBWatch *watch, PBVersionInfo *versionInfo))handler onTimeout:(void (^)(PBWatch *watch))onTimeout;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch.h",
    "content": "//\n//  PBWatch.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@protocol PBWatchDelegate;\n@class PBVersionInfo;\n@class PBDataLoggingService;\n\n/**\n *  Represents a Pebble watch.\n *\n *  On iOS, there is the notion of a \"communication session\" between an app and\n *  the Pebble watch. You can imagine this as a \"data pipe\" directly from the\n *  watch to your app. However, there is only one session for 3rd party apps.\n *  This one session has to be shared among all 3rd party apps that want to\n *  communicate with Pebble (excluding the official Pebble iOS app).\n *\n *  Unfortunately, the session can only be opened from the phone app. This means\n *  that the iOS app has to start talking to the watch first to open the\n *  communications channel; the other way around is not possible.\n *  Most methods in the PBWatch categories (Ping), (Version), (Sports), (Golf)\n *  and (AppMessages) all implicitly open the shared communication session.\n *\n *  Lastly, iOS provides no good way to manage how the one shared session is\n *  accessed or used. Simply, the last iOS app to try to open it, wins and gets\n *  to use it. Therefore, it is important that your iOS app does **not** try\n *  communicate when a Pebble is connected.\n *\n *  When the user has stopped using your app (e.g. when going to the background\n *  or when explicitely stopping a certain activity in the app) your iOS app\n *  should close the communication session using the -closeSession: method.\n */\n@interface PBWatch : NSObject\n\n/**\n *  YES if the receiver is connected and NO if the receiver is disconnected.\n *  @discussion This property is KVO-compliant.\n */\n@property (nonatomic, readonly, getter=isConnected) BOOL connected;\n\n/**\n *  The human-friendly name of the receiver.\n *  This is the same name as the user will see in the iOS Bluetooth Settings.\n */\n@property (nonatomic, readonly) NSString *name;\n\n/**\n *  The serial number of the receiver.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  The versionInfo of the receiver.\n *  @see PBVersionInfo\n */\n@property (nonatomic, readonly) PBVersionInfo *versionInfo;\n\n/**\n *  The delegate of the watch that will be notified of disconnections and errors.\n *  @see PBWatchDelegate\n */\n@property (nonatomic, readwrite, weak) id<PBWatchDelegate> delegate;\n\n/**\n *  The userInfo property can be used to associate application specific data\n *  with the watch. Note that the application itself is responsible for persisting\n *  the information if neccessary.\n */\n@property (nonatomic, readwrite, strong) id userInfo;\n\n/**\n *  The date when the watch was last known to be connected.\n *  This date will be updated automatically when the watch connects and\n *  disconnects. While the watch is being connected, this date will not be updated.\n */\n@property (nonatomic, readonly) NSDate *lastConnectedDate;\n\n/**\n *  Developer-friendly debugging description of the watch.\n *  @return localized, user-friendly summary of the receiver, including\n *  software and hardware version information, if available.\n */\n- (NSString*)friendlyDescription;\n\n/**\n *  Closes the communication session with the watch.\n *  Since there is only one, shared session for all 3rd party iOS apps,\n *  an app should close the session after the user is done using the app/watch-integration,\n *  so it can be used by other apps.\n *  The communication session is implicitely opened automatically when needed.\n *  @param onDone Callback block that will be called after the closing of the session\n *  has completed. If there is no open session, the onDone block will (also) be executed\n *  asynchronously on the calling queue.\n */\n- (void)closeSession:(void(^)(void))onDone;\n\n@end\n\n@protocol PBWatchDelegate <NSObject>\n@optional\n\n/**\n *  Called when the watch got disconnected.\n */\n- (void)watchDidDisconnect:(PBWatch*)watch;\n\n/**\n *  Called when the watch caught an error.\n */\n- (void)watch:(PBWatch*)watch handleError:(NSError*)error;\n\n/**\n *  Called when the internal EASession is about to be reset.\n */\n- (void)watchWillResetSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is opened\n */\n- (void)watchDidOpenSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is closed\n */\n- (void)watchDidCloseSession:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PebbleKit.h",
    "content": "//\n//  PebbleSDK.h\n//  PebbleSDK\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#import <PebbleKit/PBWatch.h>\n#import <PebbleKit/PBPebbleCentral.h>\n#import <PebbleKit/PBWatch+Ping.h>\n#import <PebbleKit/PBWatch+Version.h>\n#import <PebbleKit/PBErrors.h>\n#import <PebbleKit/PBWatch+AppMessages.h>\n#import <PebbleKit/NSNumber+stdint.h>\n#import <PebbleKit/PBWatch+Sports.h>\n#import <PebbleKit/PBWatch+Golf.h>\n#import <PebbleKit/PBBitmap.h>\n#import <PebbleKit/PBDataLoggingService.h>\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/gtypes.h",
    "content": "//\n//  gtypes.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#ifndef PebbleKit_gtypes_h\n#define PebbleKit_gtypes_h\n\ntypedef struct GSize {\n  int16_t w;\n  int16_t h;\n} GSize;\n\ntypedef struct GPoint {\n  int16_t x;\n  int16_t y;\n} GPoint;\n\ntypedef struct GRect {\n  GPoint origin;\n  GSize size;\n} GRect;\n\n#endif\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/NSDictionary+Pebble.h",
    "content": "//\n//  NSDictionary+Pebble.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSDictionary (Pebble)\n\n/**\n *  Serializes the receiver into a Pebble dict.\n *  @note The receiver dictionary must comply to the following constraints:\n *  * The keys must be instances of NSNumber. Their -unsignedLongValue return value will be used as final key.\n *  * The values must be instances of either NSString, NSData or NSNumber. Use the NSNumber (stdint) category\n *  to specify the signedness and width of NSNumbers.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryUnsupportedKeyClass,\n *  PBErrorCodeDictionaryUnsupportedValueClass or PBErrorCodeDictionaryUnsupportedValueClass.\n *  @see -dictionaryFromPebbleDictionaryDataWithError:\n */\n- (NSData*)pebbleDictionaryData:(NSError * __autoreleasing *)error;\n\n@end\n\n@interface NSData (Pebble)\n\n/**\n *  Interprets the receiver as Pebble dict data and deserializes it into an NSDictionary.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryInternalConsistency.\n *  @see -pebbleDictionaryData:\n */\n- (NSDictionary*)dictionaryFromPebbleDictionaryDataWithError:(NSError * __autoreleasing *)error;\n\n@end"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/NSNumber+stdint.h",
    "content": "//\n//  NSNumber+stdint.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/**\n *  This category exposes the capabilities the underlying CFNumber to explicitely\n *  store the signedness and the width of the storage.\n */\n\n@interface NSNumber (stdint)\n\n/**\n *  Interprets the receiver as a 32-bits wide, unsigned integer.\n */\n- (uint32_t)uint32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, unsigned integer.\n */\n- (uint16_t)uint16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, unsigned integer.\n */\n- (uint8_t)uint8Value;\n\n/**\n *  Interprets the receiver as a 32-bits wide, signed integer.\n */\n- (int32_t)int32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, signed integer.\n */\n- (int16_t)int16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, signed integer.\n */\n- (int8_t)int8Value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint32:(uint32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint16:(uint16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint8:(uint8_t)value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt32:(int32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt16:(int16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt8:(int8_t)value;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a floating pointer number or not.\n */\n- (BOOL)isFloat;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a signed integer or not.\n */\n- (BOOL)isSigned;\n\n/**\n *  Gets the width in bytes of the integer that is stored by the receiver.\n */\n- (uint8_t)width;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBBitmap.h",
    "content": "//\n//  PBBitmap.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIImage.h>\n#import <PebbleKit/gtypes.h>\n\n/**\n *  Helper class to convert a UIImage to Pebble bitmap pixel data and GBitmap metadata.\n *  Refer to the documentation of Pebble's native watch app SDK on the GBitmap format.\n */\n\n@interface PBBitmap : NSObject\n\n/**\n *  The pixel data of the bitmap.\n *  This corresponds to the data as pointed to by GBitmap's `addr` field.\n */\n@property (nonatomic, readonly, strong) NSData *pixelData;\n\n/**\n *  The number of bytes per row.\n *  Always a multiple of 4 bytes.\n */\n@property (nonatomic, readonly, assign) uint16_t rowSizeBytes;\n\n/**\n *  Bitfield of metadata flags.\n *  This corresponds to GBitmap's `info_flags` field.\n */\n@property (nonatomic, readonly, assign) uint16_t infoFlags;\n\n/**\n *  The box of bits inside `pixelData`, that contains\n *  the actual image data to use.\n *  This corresponds to GBitmap's `bounds` field.\n */\n@property (nonatomic, readonly, assign) GRect bounds;\n\n/**\n *  Factory method to create a PBBitmap from a UIImage instance.\n *  @param image The UIImage from which to create the PBBitmap\n */\n+ (PBBitmap*)pebbleBitmapWithUIImage:(UIImage*)image;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBDataLoggingService.h",
    "content": "//\n//  PBDataLoggingService.h\n//  PebbleKit\n//\n//  Created by Martijn The on 7/19/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  Data logging datatypes.\n */\nenum {\n  //! Array of bytes\n  PBDataLoggingTypeByteArray = 0,\n  //! unsigned integer\n  PBDataLoggingTypeUInt = 2,\n  //! signed integer\n  PBDataLoggingTypeInt = 3,\n};\ntypedef UInt8 PBDataLoggingType;\n\n/**\n *  The metadata of a data logging session. Used to identify a session.\n */\n@interface PBDataLoggingSessionMetadata : NSObject <NSSecureCoding, NSCopying>\n\n/**\n *  A tag associated with the session.\n */\n@property (nonatomic, readonly) UInt32 tag;\n\n/**\n *  The timestamp of the moment the session was created by the watchapp.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The type of data stored in this session.\n */\n@property (nonatomic, readonly) PBDataLoggingType type;\n\n/**\n *  The size of a data item.\n */\n@property (nonatomic, readonly) UInt16 itemSize;\n\n/**\n *  The serial number of the watch that created the sessions.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  Creates a new data logging session metadata object, given all its property values.\n *  This method is provided to create a metadata object that can be used to\n *  compare it with a metadata object that is passed into one of the\n *  PBDataLoggingServiceDelegate methods.\n *  @param tag The tag associated with the session\n *  @param timestamp The timestamp of the creation of the session\n *  @param type The type of data stored in the session\n *  @param itemSize The size of a data item\n *  @param serialNumber The serial number of the watch that created the session\n *  @return A session metadata object with the specified information\n */\n+ (id)metadataWithTag:(UInt32)tag\n            timestamp:(UInt32)timestamp\n                 type:(PBDataLoggingType)type\n             itemSize:(UInt16)itemSize\n         serialNumber:(NSString *)serialNumber;\n\n/**\n *  Tests the equality of two data logging session metadata objects.\n *  This method can be used to compare two session metadata objects\n *  to check whether they are referring to the same session or not.\n *  @param sessionMetadata\n *  @return YES if all the property values of receiver are equal to the property\n *  values of the given session.\n *  @note Equivalent to -[PBDataLoggingSessionMetadata isEqual:]\n */\n- (BOOL)isEqualToDataLoggingSessionMetadata:(PBDataLoggingSessionMetadata *)sessionMetadata;\n@end\n\n/**\n *  Data logging delegate protocol. The object that implements this protocol\n *  is responsible for handling incoming data.\n */\n@protocol PBDataLoggingServiceDelegate <NSObject>\n@optional\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param bytes Pointer to the array of bytes.\n *  The array contains (numberOfItems * session.itemSize) bytes.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasByteArrays:(const UInt8 * const)bytes numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt8s:(const UInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt16s:(const UInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt32s:(const UInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt8s:(const SInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt16s:(const SInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt32s:(const SInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time a session is finished.\n *  This is guaranteed to be called only after all data has been received and\n *  consumed by the application.\n *  @param service The data logging service.\n *  @param session The metadata of the session.\n */\n- (void)dataLoggingService:(PBDataLoggingService *)service sessionDidFinish:(PBDataLoggingSessionMetadata *)session;\n\n@end\n\n/**\n *  The data logging service. Assign a delegate object in order to receive\n *  data from your watchapp.\n */\n@interface PBDataLoggingService : NSObject\n\n/**\n *  The delegate that has the responsility of handling callbacks from the\n *  data logging service.\n */\n@property (atomic, readwrite, weak) id<PBDataLoggingServiceDelegate> delegate;\n\n/**\n *  Sets the queue on which delegate methods will be executed.\n *  Callbacks are intended to be processed in the order as they come in, so it\n *  you must use a serial queue. If set to nil (default) the main queue is used.\n *  @param delegateQueue The queue on which the delegate methods will be executed.\n */\n- (void)setDelegateQueue:(dispatch_queue_t)delegateQueue;\n\n/**\n * Query the watch for data logging data.\n */\n- (void)pollForData;\n  \n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBErrors.h",
    "content": "//\n//  PBErrors.h\n//  PebbleSDK\n//\n//  Created by Martijn The on 7/26/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nextern NSString *PBErrorDomain;\n\n/**\n *  PebbleKit Error codes.\n *  Inspect the localizedDescription of any NSError objects for a description.\n */\n\ntypedef enum {\n  PBErrorCodeNoSupportedProtocolsInInfoPlist,\n  PBErrorCodeErrorCreatingSession,\n  PBErrorCodeOutputStreamError,\n  PBErrorCodeInputStreamError,\n  PBErrorCodeSendMessageTimeout,\n  PBErrorCodeEndpointDisallowed,\n  PBErrorCodeVersionInfoTimeout,\n  PBErrorCodeCannotCreateSessionWhileClosing,\n  PBErrorCodeNoAppUUID,\n  PBErrorCodeAppMessageRejected,\n  PBErrorCodeAppMessageAckTimeout,\n  PBErrorCodeDictionaryUnsupportedKeyClass,\n  PBErrorCodeDictionaryUnsupportedValueClass,\n  PBErrorCodeDictionaryInternalConsistency,\n  PBErrorCodeInvalidArguments,\n  PBErrorCodePebbleAppUnreachable,\n  PBErrorCodePebbleAppRequestTimeout,\n  PBErrorCodePebbleAppEmptyResponse,\n  PBErrorCodePebbleAppUnexpectedResponse,\n  PBErrorCodeServerNotAvailable,\n  PBErrorCodeDownloadFailed,\n  PBErrorCodePebbleNotConnected\n} PBErrorCode;\n\n@interface NSError (Pebble)\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode and with an underlying NSError object.\n *  @param code The error code for which to create the error\n *  @param error The underlying error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code underLyingError:(NSError*)error;\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode.\n *  @param code The error code for which to create the error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code;\n\n@end"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBLog.h",
    "content": "//\n//  PBLog.h\n//  PebbleApp\n//\n//  Created by Martijn The on 11/29/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import \"DDLog.h\"\n\n#ifndef PBWSLOG_CONTEXT\n#define PBWSLOG_CONTEXT 1\n#endif\n\nextern int PBLogLevel;\n\n#define LogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define WSLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n\n#define LogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBPebbleCentral.h",
    "content": "//\n//  PBPebbleCentral.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class PBWatch;\n@class PBDataLoggingService;\n@protocol PBPebbleCentralDelegate;\n\n/**\n PebbleCentral plays the central role for client iOS apps (e.g. RunKeeper).\n */\n@interface PBPebbleCentral : NSObject\n\n/**\n @returns The default central singleton instance.\n */\n+ (PBPebbleCentral*)defaultCentral;\n\n/**\n *  Enables debug logs. The logs will be routed to the system log (ASL) and\n *  console. It is advised to call this before making any other calls to PebbleKit.\n */\n+ (void)setDebugLogsEnabled:(BOOL)logsEnabled;\n\n/**\n The watches that are currently connected. Do not cache the array because it can change over time.\n */\n@property (nonatomic, readonly, strong) NSArray *connectedWatches;\n\n/**\n The watches that are stored in the user preferences of the application.\n */\n@property (nonatomic, readonly, strong) NSArray *registeredWatches;\n\n/**\n The central's delegate.\n */\n@property (nonatomic, readwrite, weak) id<PBPebbleCentralDelegate> delegate;\n\n/**\n *  The UUID is used as the identifier of the watch application and is used\n *  to make sure that appMessage and dataLogging communications arrives at its companion app\n *  on the other device (and not in another app).\n *  For most app message methods there is are two variants: one that does not take a UUID parameter and one that does take\n *  a UUID parameter (for example, -appMessagesAddReceiveUpdateHandler: vs appMessagesAddReceiveUpdateHandler:withUUID:).\n *  The methods that do not take a UUID, will use the UUID as set prior to this property.\n *  @param uuid The 16 byte UUID of your app.\n *  @note The UUID needs to be set before using either app message or data logging.\n */\n@property (nonatomic, strong, readwrite) NSData *appUUID;\n\n/**\n *  Verifies the currently set application UUID.\n *  @return YES if the currently set UUID is valid, NO if it is not.\n *  @see -setAppUuid:\n */\n- (BOOL)hasValidAppUUID;\n\n/**\n @returns YES if the Pebble iOS app is installed, NO if it is not installed.\n */\n- (BOOL)isMobileAppInstalled;\n\n/**\n Redirects to Pebble in the App Store, so the user can install the app.\n */\n- (void)installMobileApp;\n\n/**\n Wipes out the data associated with the registered watches, that is stored on the phone.\n */\n- (void)unregisterAllWatches;\n\n/**\n Returns the most recently connected watch from the -registeredWatches array.\n */\n- (PBWatch*)lastConnectedWatch;\n\n@property (nonatomic, readonly) PBDataLoggingService *dataLoggingService;\n\n@end\n\n\n@protocol PBPebbleCentralDelegate <NSObject>\n@optional\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was connected.\n @param isNew YES if the watch has been connected for the first time since the app has been installed or NO if not.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidConnect:(PBWatch*)watch isNew:(BOOL)isNew;\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was disconnected.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidDisconnect:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+AppMessages.h",
    "content": "//\n//  PBWatch+AppMessages.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\ntypedef NS_ENUM(UInt8, PBAppState) {\n  PBAppStateNotRunning = 0x00,\n  PBAppStateRunning = 0x01,\n};\n\n@interface PBWatch (AppMessages)\n\n/**\n *  Queries the watch whether AppMessages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isAppMessagesSupported YES if AppMessages are supported, NO if not.\n */\n- (void)appMessagesGetIsSupported:(void(^)(PBWatch *watch, BOOL isAppMessagesSupported))fetchedBlock;\n\n/**\n *  Pushes an update to the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Pushes an update to the watch application with the specified UUID.\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watchapp to which the update should be sent.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary withUUID:(NSData*)uuid onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with the specified UUID.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @param uuid The UUID of the watchapp for which sent messages should be handled by the onReceive block.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive withUUID:(NSData*)uuid;\n\n/**\n *  Add a handler for lifecycle events of watch applications.\n *  @param onLifecycleUpdate This block will be called when an application starts and\n *  stops running.\n *  @param watch The watch that has sent the event.\n *  @param uuid The uuid of the application that caused the event.\n *  @param newAppState The new state of the app (either PBAppStateNotRunning or PBAppStateRunning).\n */\n- (id)appMessagesAddAppLifecycleUpdateHandler:(void(^)(PBWatch *watch, NSUUID *uuid,\n                                                       PBAppState newAppState))onLifecycleUpdate;\n\n\n// INTERNAL USE ONLY\n- (id)appMessagesAddReceiveAllUpdatesHandler:(BOOL(^)(PBWatch *watch, NSUUID *uuid, NSDictionary *update))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -appMessagesAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -appMessagesAddReceiveUpdateHandler:\n *  @see -appMessagesAddReceiveUpdateHandler:\n */\n- (void)appMessagesRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Fetches the run state of the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]. You can use this method to determine whether the watch\n *  application is running or not.\n *  TODO: Ask Francois how this API works.\n *  @param onSent The block that will be called after the fetch state command has been\n *  sent to the watch.\n */\n- (void)appMessagesFetchAppState:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with the specified UUID.\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n/**\n *  Sends a command to kill the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to kill the watch application with the specified UUID.\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+Golf.h",
    "content": "//\n//  PBWatch+Golf.h\n//  PebbleKit\n//\n//  Created by Martijn The on 4/4/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n@interface PBWatch (Golf)\n\n/**\n *  The UUID of the Golf watch app.\n */\nextern NSData *PBGolfUUID;\n\n/**\n *  The key of the \"Front\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfFrontKey;\n\n/**\n *  The key of the \"Mid\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfMidKey;\n\n/**\n *  The key of the \"Back\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfBackKey;\n\n/**\n *  The key of the \"Hole\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfHoleKey;\n\n/**\n *  The key of the \"Par\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfParKey;\n\n/**\n *  The command IDs that can be sent back by the Golf watch app.\n *  @see -golfAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  GolfAppCommandPrevious = 0x01,\n  GolfAppCommandNext = 0x02,\n  GolfAppCommandSelect = 0x03,\n} GolfAppCommand;\n\n/**\n *  Queries the watch whether Golf Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isGolfSupported YES if Golf Messages are supported, NO if not.\n */\n- (void)golfGetIsSupported:(void(^)(PBWatch *watch, BOOL isGolfSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends an update to the golf app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey, PBGolfParKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n *  @see PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey and PBGolfParKey\n */\n- (void)golfAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Golf updates that are send by the Golf watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param command The command as sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -golfAppRemoveUpdateHandler:\n *  @see GolfAppCommand\n *  @see -golfAppRemoveUpdateHandler:\n */\n- (id)golfAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, GolfAppCommand command))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -golfAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -golfAppAddReceiveUpdateHandler:\n *  @see -golfAppAddReceiveUpdateHandler:\n */\n- (void)golfAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the golf app on the watch.\n *  @discussion It is recommended to perform this as the first call after -golfGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+Ping.h",
    "content": "//\n//  PBWatch+Ping.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/14/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n@interface PBWatch (Ping)\n\n/**\n * Sends a ping to the watch.\n * @param cookie A number identifying the ping.\n * @param onPong The block handler that will be called when the \"pong\" reply from the watch has been received.\n * @param watch The watch that sent the \"pong\" reply, which is \"self\". It is passed in to avoid retain loops.\n * @param cookie The cookie that was initially passed when calling this method.\n * @param onTimeout The block handler that will be called when the watch failed to reply in time.\n */\n- (void)pingWithCookie:(UInt32)cookie onPong:(void(^)(PBWatch *watch, UInt32 cookie))onPong onTimeout:(void(^)(PBWatch *watch, UInt32 cookie))onTimeout;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+PollServices.h",
    "content": "//\n//  PBWatch+PollServices.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n * PollServiceType\n */ \n\n\nenum {\n  PBPollRemoteServiceMail = 0,\n  PBPollRemoteServiceDataLogging = 1,\n  PBNumPollRemoteServices\n};\ntypedef UInt8 PBPollRemoteServiceType;\n\n@interface PBWatch (PollServices)\n// Call this upon connect with the watch to add handlers:\n- (id)addPollServicesHandler:(void(^)(PBWatch *))handler forService:(PBPollRemoteServiceType)service interval:(UInt8)interval;\n- (void)sendPollRequestForService:(PBPollRemoteServiceType)service;\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+Sports.h",
    "content": "//\n//  PBWatch+Sports.h\n//  PebbleKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n/**\n *  The UUID of the Sports watch app.\n */\nextern NSData *PBSportsUUID;\n\n/**\n *  The key of the \"Time\" field.\n *  The accompanying value must be an NSString (max. ~8 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsTimeKey;\n\n/**\n *  The key of the \"Distance\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDistanceKey;\n\n/**\n *  The key of the general purpose \"Data\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDataKey;\n\n/**\n *  The key of the \"Activity State\".\n *  The value must be an NSNumber created using +[NSNumber numberWithUint8:].\n *  @see SportsAppActivityState for valid values to use\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsActivityStateKey;\n\n/**\n *  Instances of this convenience class represent an update of the current time, distance and pace,\n *  and has a method to convert the values into a dictionary that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n@interface PBSportsUpdate : NSObject\n\n/**\n *  The current time in seconds. The possible range is currently limited from -7140. to 7140., inclusive. (±1h 59min 59sec).\n */\n@property (nonatomic, readwrite, assign) NSTimeInterval time;\n\n/**\n *  The current distance in km or mi. The possible range is currently limited from -99.9 to 99.9, inclusive.\n *  The unit of distance is dependent on the current unit setting.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float distance;\n\n/**\n *  General purpose data variable. The possible range is currently limited from -99.99 to 99.99, inclusive.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float data;\n\n/**\n *  Convenience method to create an update object.\n */\n+ (PBSportsUpdate*)updateWithTime:(NSTimeInterval)time distance:(float)distance data:(float)data;\n\n/**\n *  Creates an update dictionary from the receiver, that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n- (NSDictionary*)dictionary;\n\n/**\n *  Creates a formatted time string with from a total seconds value, formatted as \"h:mm:ss\".\n *  For example, supplying the value 3930.0f seconds will return @\"1:05:30\"\n *  @param seconds The number of seconds from which to create the time string.\n *  @return Formatted time as \"h:mm:ss\"\n */\n+ (NSString*)timeStringFromFloat:(float)seconds;\n\n@end\n\n@interface PBWatch (Sports)\n\n/**\n *  The state of the Sports activity.\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  SportsAppActivityStateInit = 0x00,\n  SportsAppActivityStateRunning = 0x01,\n  SportsAppActivityStatePaused = 0x02,\n  SportsAppActivityStateEnd = 0x03,\n} SportsAppActivityState;\n\n/**\n *  Queries the watch whether Sports Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isSportsSupported YES if Sports Messages are supported, NO if not.\n */\n- (void)sportsGetIsSupported:(void(^)(PBWatch *watch, BOOL isSportsSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the preferred\n *  unit system, either metric or imperial.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetMetric:(BOOL)isMetric onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents,\n *  to set the preferred  data label (either PACE or SPEED) and corresponding units.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetLabel:(BOOL)isPace onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the state of the\n *  sports activity. Currently only SportsAppActivityStateRunning and SportsAppActivityStatePaused are\n *  supported.\n *  @param state The new sports activity state\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetActivityState:(SportsAppActivityState)state onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends the update to the sports app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBSportsTimeKey, PBSportsPaceKey, PBSportsDistanceKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Sports updates that are send by the Sports watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param state The new sports activity state as set by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -sportsAppRemoveUpdateHandler:\n *  @see SportsAppActivityState\n *  @see -sportsAppRemoveUpdateHandler:\n */\n- (id)sportsAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, SportsAppActivityState state))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -sportsAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -sportsAppAddReceiveUpdateHandler:\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\n- (void)sportsAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the sports app on the watch.\n *  @discussion It is recommended to perform this as the first call after -sportsGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+Version.h",
    "content": "//\n//  PBWatch+Version.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/17/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  PBFirmwareVersion is a helper class that is able to parse the versionTag string\n *  into its components (os, major, minor, suffix) and facilitate comparisons\n *  between versions.\n *  Valid versions follow the following format:\n *  `vOS(.MAJOR(.MINOR(-SUFFIX)))`\n *  Where the fields OS, MAJOR, MINOR are positive, decimal integer numbers and SUFFIX\n *  an arbitrary string. MAJOR, MINOR and SUFFIX are optional (nested optionality).\n *  Examples of valid versions:\n *  `v1`\n *  `v2.1234.99-alpha-beta-gamma`\n */\n@interface PBFirmwareVersion : NSObject\n/**\n *  The OS version component.\n */\n@property (nonatomic, readonly) NSInteger os;\n\n/**\n *  The major version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger major;\n\n/**\n *  The minor version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger minor;\n\n/**\n *  The release suffix, which is the part following the dash '-'.\n *  @note If a version tag string does not contain a suffix, it will be set to an empty string.\n *  @discussion The release suffix is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *suffix;\n\n/**\n *  The version timestamp.\n *  @note The timestamp is in the final comparison equation, in the -compare: method, after evaluating\n *  os, major and minor components.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The version's git commit hash.\n *  @discussion The commit hash is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *commitHash;\n\n/**\n *  The version's git tag.\n */\n@property (nonatomic, readonly, copy) NSString *tag;\n\n/**\n *  Creates a PBFirmwareVersion object given a tag string and timestamp.\n */\n+ (PBFirmwareVersion*)firmwareVersionWithTag:(NSString*)tag commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Creates a PBFirmwareVersion object given its components.\n *  @discussion The tag string will be set to the canonical format vOS.MINOR.MAJOR(-SUFFIX).\n */\n+ (PBFirmwareVersion*)firmwareVersionWithOS:(NSInteger)os major:(NSInteger)major minor:(NSInteger)minor suffix:(NSString*)suffix commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Compares the receiver to another version object.\n *  @param aVersion The version to compare with the receiver.\n *  @return NSOrderedAscending if the value of aVersion is greater than the receiver’s,\n *  NSOrderedSame if they’re equal, and NSOrderedDescending if the value of aVersion is less than the receiver’s.\n */\n- (NSComparisonResult)compare:(PBFirmwareVersion *)aVersion;\n\n/**\n *  Convenience wrappers around -compare:\n */\n- (BOOL)isEqualOrNewer:(PBFirmwareVersion *)other;\n- (BOOL)isNewer:(PBFirmwareVersion *)other;\n- (BOOL)isEqualVersionOnly:(PBFirmwareVersion *)other;\n\n@end\n\n\n\n/**\n *  Values specifying the Pebble hardware platform variant.\n */\ntypedef enum {\n  FirmwareMetadataPlatformUnknown = 0,\n  FirmwareMetadataPlatformPebbleOneEV1 = 1,\n  FirmwareMetadataPlatformPebbleOneEV2 = 2,\n  FirmwareMetadataPlatformPebbleOneEV2_3 = 3,\n  FirmwareMetadataPlatformPebbleOneEV2_4 = 4,\n  FirmwareMetadataPlatformPebbleOnePointFive = 5,\n  FirmwareMetadataPlatformPebbleTwoPointZero = 6,\n  FirmwareMetadataPlatformPebbleOneBigboard = 0xff,\n  FirmwareMetadataPlatformPebbleOneBigboard2 = 0xfe,\n} FirmwareMetadataPlatform;\n\n/**\n *  Instances of PBFirmwareMetadata describe a firmware in terms of\n *  its version, whether it is a recovery firmware and its intended hardware\n *  platform.\n *  @see PBVersionInfo\n */\n\n@interface PBFirmwareMetadata : NSObject\n\n/**\n *  The version of the firmware.\n *  @see PBFirmwareVersion\n */\n@property (nonatomic, readonly) PBFirmwareVersion *version;\n\n/**\n *  YES if the firmware is a recovery firmware, NO if it is a regular firmware.\n */\n@property (nonatomic, readonly) BOOL isRecoveryFirmware;\n\n/**\n *  The hardware platform variant with which the firmware is compatible.\n */\n@property (nonatomic, readonly) FirmwareMetadataPlatform hardwarePlatform;\n\n/**\n *  Converts a <FirmwareMetadataPlatform> value to a string.\n *  @param hardwarePlatform The hardware platform value to convert\n *  @return A string of the hardware platform\n */\n+ (NSString*)hardwarePlatformToString:(FirmwareMetadataPlatform)hardwarePlatform;\n\n/**\n *  Converts an NSString hardware platform string to the corresponding\n *  FirmwareMetadataPlatform value.\n *  @param hardwarePlatformString The string representing the hardware platform.\n *  @return The hardware platform enum value\n */\n+ (FirmwareMetadataPlatform)stringToHardwarePlatform:(NSString *)hardwarePlatformString;\n\n@end\n\n/**\n *  Instances of PBResourceMetadata describe (system) resources.\n *  @see PBVersionInfo\n */\n\n@interface PBResourceMetadata : NSObject\n\n/**\n *  The version of the resources as the Epoch timestamp of the Git commit.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The checksum of the resources.\n */\n@property (nonatomic, readonly) UInt32 crc;\n\n/**\n *  The human-friendly string version of the resources.\n */\n@property (nonatomic, readonly, strong) NSString *friendlyVersion;\n\n/**\n *  YES if the metadata represents valid resources, NO if it does not.\n */\n- (BOOL)isValid;\n\n@end\n\n/**\n *  An instance of PBVersionInfo describes all the different system software (Pebble OS)\n *  on a Pebble watch and other auxiliary information.\n *  @see PBWatch\n */\n\n@interface PBVersionInfo : NSObject\n\n/**\n *  The metadata of the firmware that is running.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *runningFirmwareMetadata;\n\n/**\n *  The metadata of the recovery firmware that is in storage.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *recoveryFirmwareMetadata;\n\n/**\n *  The metadata of the system resources.\n */\n@property (nonatomic, readonly, strong) PBResourceMetadata *systemResources;\n\n/**\n *  The version of the bootloader.\n */\n@property (nonatomic, readonly) UInt32 bootloaderVersion;\n\n/**\n *  The version of the hardware.\n */\n@property (nonatomic, readonly, strong) NSString *hardwareVersion;\n\n/**\n *  The serial number.\n */\n@property (nonatomic, readonly, strong) NSString *serialNumber;\n\n/**\n *  The current Bluetooth device address.\n */\n@property (nonatomic, readonly, strong) NSData *deviceAddress;\n\n/**\n *  YES if valid recovery firmware is installed, NO if not.\n */\n- (BOOL)hasRecoveryFirmware;\n\n/**\n *  YES if valid system resources are installed, NO if not.\n */\n- (BOOL)hasSystemResources;\n\n@end\n\n@interface PBWatch (Version)\n\n/**\n *  Requests the version info from the receiver.\n *  @param handler The handler that will be called when the version info response has been received.\n *  @param onTimeout The handler that will be called if the watch did not respond within 5 seconds.\n *  @param watch The watch for which the version info was requested.\n *  @param versionInfo The version info response.\n *  @discussion The <PBVersionInfo> response will be cached. The latest version info can be\n *  accessed through the <versionInfo> property of <PBWatch>.\n */\n- (void)getVersionInfo:(void (^)(PBWatch *watch, PBVersionInfo *versionInfo))handler onTimeout:(void (^)(PBWatch *watch))onTimeout;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch.h",
    "content": "//\n//  PBWatch.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@protocol PBWatchDelegate;\n@class PBVersionInfo;\n@class PBDataLoggingService;\n\n/**\n *  Represents a Pebble watch.\n *\n *  On iOS, there is the notion of a \"communication session\" between an app and\n *  the Pebble watch. You can imagine this as a \"data pipe\" directly from the\n *  watch to your app. However, there is only one session for 3rd party apps.\n *  This one session has to be shared among all 3rd party apps that want to\n *  communicate with Pebble (excluding the official Pebble iOS app).\n *\n *  Unfortunately, the session can only be opened from the phone app. This means\n *  that the iOS app has to start talking to the watch first to open the\n *  communications channel; the other way around is not possible.\n *  Most methods in the PBWatch categories (Ping), (Version), (Sports), (Golf)\n *  and (AppMessages) all implicitly open the shared communication session.\n *\n *  Lastly, iOS provides no good way to manage how the one shared session is\n *  accessed or used. Simply, the last iOS app to try to open it, wins and gets\n *  to use it. Therefore, it is important that your iOS app does **not** try\n *  communicate when a Pebble is connected.\n *\n *  When the user has stopped using your app (e.g. when going to the background\n *  or when explicitely stopping a certain activity in the app) your iOS app\n *  should close the communication session using the -closeSession: method.\n */\n@interface PBWatch : NSObject\n\n/**\n *  YES if the receiver is connected and NO if the receiver is disconnected.\n *  @discussion This property is KVO-compliant.\n */\n@property (nonatomic, readonly, getter=isConnected) BOOL connected;\n\n/**\n *  The human-friendly name of the receiver.\n *  This is the same name as the user will see in the iOS Bluetooth Settings.\n */\n@property (nonatomic, readonly) NSString *name;\n\n/**\n *  The serial number of the receiver.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  The versionInfo of the receiver.\n *  @see PBVersionInfo\n */\n@property (nonatomic, readonly) PBVersionInfo *versionInfo;\n\n/**\n *  The delegate of the watch that will be notified of disconnections and errors.\n *  @see PBWatchDelegate\n */\n@property (nonatomic, readwrite, weak) id<PBWatchDelegate> delegate;\n\n/**\n *  The userInfo property can be used to associate application specific data\n *  with the watch. Note that the application itself is responsible for persisting\n *  the information if neccessary.\n */\n@property (nonatomic, readwrite, strong) id userInfo;\n\n/**\n *  The date when the watch was last known to be connected.\n *  This date will be updated automatically when the watch connects and\n *  disconnects. While the watch is being connected, this date will not be updated.\n */\n@property (nonatomic, readonly) NSDate *lastConnectedDate;\n\n/**\n *  Developer-friendly debugging description of the watch.\n *  @return localized, user-friendly summary of the receiver, including\n *  software and hardware version information, if available.\n */\n- (NSString*)friendlyDescription;\n\n/**\n *  Closes the communication session with the watch.\n *  Since there is only one, shared session for all 3rd party iOS apps,\n *  an app should close the session after the user is done using the app/watch-integration,\n *  so it can be used by other apps.\n *  The communication session is implicitely opened automatically when needed.\n *  @param onDone Callback block that will be called after the closing of the session\n *  has completed. If there is no open session, the onDone block will (also) be executed\n *  asynchronously on the calling queue.\n */\n- (void)closeSession:(void(^)(void))onDone;\n\n@end\n\n@protocol PBWatchDelegate <NSObject>\n@optional\n\n/**\n *  Called when the watch got disconnected.\n */\n- (void)watchDidDisconnect:(PBWatch*)watch;\n\n/**\n *  Called when the watch caught an error.\n */\n- (void)watch:(PBWatch*)watch handleError:(NSError*)error;\n\n/**\n *  Called when the internal EASession is about to be reset.\n */\n- (void)watchWillResetSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is opened\n */\n- (void)watchDidOpenSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is closed\n */\n- (void)watchDidCloseSession:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PebbleKit.h",
    "content": "//\n//  PebbleSDK.h\n//  PebbleSDK\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#import <PebbleKit/PBWatch.h>\n#import <PebbleKit/PBPebbleCentral.h>\n#import <PebbleKit/PBWatch+Ping.h>\n#import <PebbleKit/PBWatch+Version.h>\n#import <PebbleKit/PBErrors.h>\n#import <PebbleKit/PBWatch+AppMessages.h>\n#import <PebbleKit/NSNumber+stdint.h>\n#import <PebbleKit/PBWatch+Sports.h>\n#import <PebbleKit/PBWatch+Golf.h>\n#import <PebbleKit/PBBitmap.h>\n#import <PebbleKit/PBDataLoggingService.h>\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/gtypes.h",
    "content": "//\n//  gtypes.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#ifndef PebbleKit_gtypes_h\n#define PebbleKit_gtypes_h\n\ntypedef struct GSize {\n  int16_t w;\n  int16_t h;\n} GSize;\n\ntypedef struct GPoint {\n  int16_t x;\n  int16_t y;\n} GPoint;\n\ntypedef struct GRect {\n  GPoint origin;\n  GSize size;\n} GRect;\n\n#endif\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/CHMultiDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMultiDictionary.h\n \n Copyright (c) 2008-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n#import \"CHMutableDictionary.h\"\n\n/**\n @file CHMultiDictionary.h\n \n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> in which multiple values may be associated with a given key.\n */\n\n/**\n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> implementation, in which multiple values may be associated with a given key.\n \n A map is the same as a \"dictionary\", \"associative array\", etc. and consists of a unique set of keys and a collection of values. In a standard map, each key is associated with one value; in a multimap, more than one value may be associated with a given key. A multimap is appropriate for any situation in which one item may correspond to (map to) multiple values, such as a term in an book index and occurrences of that term, courses for which a student is registered, etc.\n \n The values for a key may or may not be ordered. This implementation does not maintain an ordering for objects associated with a key, nor does it allow for multiple occurrences of an object associated with the same key. Internally, this class uses an NSMutableDictionary, and the associated values for each key are stored in distinct NSMutableSet instances. (Just as with NSDictionary, each key added to a CHMultiDictionary is copied using \\link NSCopying#copyWithZone: -copyWithZone:\\endlink and all keys must conform to the NSCopying protocol.) Objects are retained on insertion and released on removal or deallocation.\n \n Since NSDictionary and NSSet conform to the NSCoding protocol, any internal data can be serialized. However, NSSet cannot automatically be written to or read from a property list, since it has no specified order. Thus, instances of CHMultiDictionary must be encoded as an NSData object before saving to disk.\n \n Currently, this implementation does not support key-value coding, observing, or binding like NSDictionary does. Consequently, the distinction between \"object\" and \"value\" is blurrier, although hopefully consistent with the Cocoa APIs in general....\n \n Unlike NSDictionary and other Cocoa collections, CHMultiDictionary has not been designed with mutable and immutable variants. A multimap is not that much more useful if it is immutable, so any copies made of this class are mutable by definition.\n */\n@interface CHMultiDictionary : CHMutableDictionary {\n\tNSUInteger objectCount; // Number of objects currently in the dictionary.\n}\n\n#pragma mark Querying Contents\n\n/**\n Returns the number of objects in the receiver, associated with any key.\n \n @return The number of objects in the receiver. This is the sum total of objects associated with each key in the dictonary.\n \n @see allObjects\n */\n- (NSUInteger) countForAllKeys;\n\n/**\n Returns the number of objects associated with a given key.\n \n @param aKey The key for which to return the object count.\n @return The number of objects associated with a given key in the dictionary.\n \n @see objectsForKey:\n */\n- (NSUInteger) countForKey:(id)aKey;\n\n/**\n Returns an array of objects associated with a given key.\n \n @param aKey The key for which to return the corresponding objects.\n @return An NSSet of objects associated with a given key, or nil if the key is not in the receiver.\n \n @see countForKey:\n @see removeObjectsForKey:\n */\n- (NSSet*) objectsForKey:(id)aKey;\n\n#pragma mark Modifying Contents\n\n/**\n Adds a given object to an entry for a given key in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param anObject An object to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#addObject: -[NSMutableSet addObject:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObject:(id)anObject forKey:(id)aKey;\n\n/**\n Adds the given object(s) to a key entry in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param objectSet A set of objects to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#unionSet: -[NSMutableSet unionSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n/**\n Remove @b all occurrences of @a anObject associated with a given key.\n \n @param aKey The key for which to remove an entry.\n @param anObject An object (possibly) associated with @a aKey in the receiver. Objects are considered to be equal if -compare: returns NSOrderedSame.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n If @a aKey does not exist in the receiver, or if @a anObject is not associated with @a aKey, the contents of the receiver are not modified.\n \n @see containsObject\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) removeObject:(id)anObject forKey:(id)aKey;\n\n/**\n Remove a given key and its associated value(s) from the receiver.\n \n @param aKey The key for which to remove an entry.\n \n If @a aKey does not exist in the receiver, there is no effect on the receiver.\n \n @see objectsForKey:\n @see removeObject:forKey:\n */\n- (void) removeObjectsForKey:(id)aKey;\n\n/**\n Sets the object(s) associated with a key entry in the receiver.\n \n @param aKey The key with which to associate the objects in @a objectSet.\n @param objectSet A set of objects to associate with @a key. If @a objectSet is empty, the contents of the receiver are not modified. If an entry for @a key already exists in the receiver, @a objectSet is added using \\link NSMutableSet#setSet: -[NSMutableSet setSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) setObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/CHMutableDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMutableDictionary.h\n \n Copyright (c) 2009-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n__attribute__((visibility(\"hidden\"))) void createCollectableCFMutableDictionary(CFMutableDictionaryRef* dictionary, NSUInteger initialCapacity);\n\n/**\n @file CHMutableDictionary.h\n \n A mutable dictionary class.\n */\n\n/**\n A mutable dictionary class.\n \n A CFMutableDictionaryRef is used internally to store the key-value pairs. Subclasses may choose to add other instance variables to enable a specific ordering of keys, override methods to modify behavior, and add methods to extend existing behaviors. However, all subclasses should behave like a standard Cocoa dictionary as much as possible, and document clearly when they do not.\n \n @note Any method inherited from NSDictionary or NSMutableDictionary is supported by this class and its children. Please see the documentation for those classes for details.\n \n @todo Implement @c -copy and @c -mutableCopy differently (so users can actually obtain an immutable copy) and make mutation methods aware of immutability?\n */\n@interface CHMutableDictionary : NSMutableDictionary {\n  CFMutableDictionaryRef dictionary; // A Core Foundation dictionary.\n}\n\n- (id) initWithCapacity:(NSUInteger)numItems;\n\n- (NSUInteger) count;\n- (NSEnumerator*) keyEnumerator;\n- (id) objectForKey:(id)aKey;\n- (void) removeAllObjects;\n- (void) removeObjectForKey:(id)aKey;\n- (void) setObject:(id)anObject forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/DDASLLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import <asl.h>\n\n#import \"DDLog.h\"\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for the Apple System Log facility.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log\n * - StdErr (if stderr is a TTY) so log statements show up in Xcode console\n * \n * To duplicate NSLog() functionality you can simply add this logger and a tty logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use a file logger and a tty logger.\n**/\n\n@interface DDASLLogger : DDAbstractLogger <DDLogger>\n{\n    aslclient client;\n}\n\n+ (instancetype)sharedInstance;\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/DDFileLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"DDLog.h\"\n\n@class DDLogFileInfo;\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger to write log statements to a file.\n**/\n\n\n// Default configuration and safety/sanity values.\n// \n// maximumFileSize         -> DEFAULT_LOG_MAX_FILE_SIZE\n// rollingFrequency        -> DEFAULT_LOG_ROLLING_FREQUENCY\n// maximumNumberOfLogFiles -> DEFAULT_LOG_MAX_NUM_LOG_FILES\n// \n// You should carefully consider the proper configuration values for your application.\n\n#define DEFAULT_LOG_MAX_FILE_SIZE     (1024 * 1024)   //  1 MB\n#define DEFAULT_LOG_ROLLING_FREQUENCY (60 * 60 * 24)  // 24 Hours\n#define DEFAULT_LOG_MAX_NUM_LOG_FILES (5)             //  5 Files\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// The LogFileManager protocol is designed to allow you to control all aspects of your log files.\n// \n// The primary purpose of this is to allow you to do something with the log files after they have been rolled.\n// Perhaps you want to compress them to save disk space.\n// Perhaps you want to upload them to an FTP server.\n// Perhaps you want to run some analytics on the file.\n// \n// A default LogFileManager is, of course, provided.\n// The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property.\n// \n// This protocol provides various methods to fetch the list of log files.\n// \n// There are two variants: sorted and unsorted.\n// If sorting is not necessary, the unsorted variant is obviously faster.\n// The sorted variant will return an array sorted by when the log files were created,\n// with the most recently created log file at index 0, and the oldest log file at the end of the array.\n// \n// You can fetch only the log file paths (full path including name), log file names (name only),\n// or an array of DDLogFileInfo objects.\n// The DDLogFileInfo class is documented below, and provides a handy wrapper that\n// gives you easy access to various file attributes such as the creation date or the file size.\n\n@protocol DDLogFileManager <NSObject>\n@required\n\n// Public properties\n\n/**\n * The maximum number of archived log files to keep on disk.\n * For example, if this property is set to 3,\n * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk.\n * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted.\n * \n * You may optionally disable deleting old/rolled/archived log files by setting this property to zero.\n**/\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n// Public methods\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n// Private methods (only to be used by DDFileLogger)\n\n- (NSString *)createNewLogFile;\n\n@optional\n\n// Notifications from DDFileLogger\n\n- (void)didArchiveLogFile:(NSString *)logFilePath;\n- (void)didRollAndArchiveLogFile:(NSString *)logFilePath;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Default log file manager.\n * \n * All log files are placed inside the logsDirectory.\n * If a specific logsDirectory isn't specified, the default directory is used.\n * On Mac, this is in ~/Library/Logs/<Application Name>.\n * On iPhone, this is in ~/Library/Caches/Logs.\n * \n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n * \n * Archived log files are automatically deleted according to the maximumNumberOfLogFiles property.\n**/\n@interface DDLogFileManagerDefault : NSObject <DDLogFileManager>\n{\n    NSUInteger maximumNumberOfLogFiles;\n    NSString *_logsDirectory;\n}\n\n- (id)init;\n- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory;\n\n/*\n * Methods to override.\n *\n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n *\n * If you wish to change default filename, you can override following two methods.\n * - newLogFileName method would be called on new logfile creation.\n * - isLogFile: method would be called to filter logfiles from all other files in logsDirectory.\n *   You have to parse given filename and return YES if it is logFile.\n *\n * **NOTE**\n * newLogFileName returns filename. If appropriate file already exists, number would be added\n * to filename before extension. You have to handle this case in isLogFile: method.\n *\n * Example:\n * - newLogFileName returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 2.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03 1.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 3.log\" would be created.\n**/\n- (NSString *)newLogFileName;\n- (BOOL)isLogFile:(NSString *)fileName;\n\n/* Inherited from DDLogFileManager protocol:\n\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n*/\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Most users will want file log messages to be prepended with the date and time.\n * Rather than forcing the majority of users to write their own formatter,\n * we will supply a logical default formatter.\n * Users can easily replace this formatter with their own by invoking the setLogFormatter method.\n * It can also be removed by calling setLogFormatter, and passing a nil parameter.\n * \n * In addition to the convenience of having a logical default formatter,\n * it will also provide a template that makes it easy for developers to copy and change.\n**/\n@interface DDLogFileFormatterDefault : NSObject <DDLogFormatter>\n{\n    NSDateFormatter *dateFormatter;\n}\n\n- (id)init;\n- (instancetype)initWithDateFormatter:(NSDateFormatter *)dateFormatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDFileLogger : DDAbstractLogger <DDLogger>\n{\n    __strong id <DDLogFileManager> logFileManager;\n    \n    DDLogFileInfo *currentLogFileInfo;\n    NSFileHandle *currentLogFileHandle;\n    \n    dispatch_source_t currentLogFileVnode;\n    dispatch_source_t rollingTimer;\n    \n    unsigned long long maximumFileSize;\n    NSTimeInterval rollingFrequency;\n}\n\n- (id)init;\n- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)logFileManager;\n\n/**\n * Log File Rolling:\n * \n * maximumFileSize:\n *   The approximate maximum size to allow log files to grow.\n *   If a log file is larger than this value after a log statement is appended,\n *   then the log file is rolled.\n * \n * rollingFrequency\n *   How often to roll the log file.\n *   The frequency is given as an NSTimeInterval, which is a double that specifies the interval in seconds.\n *   Once the log file gets to be this old, it is rolled.\n * \n * Both the maximumFileSize and the rollingFrequency are used to manage rolling.\n * Whichever occurs first will cause the log file to be rolled.\n * \n * For example:\n * The rollingFrequency is 24 hours,\n * but the log file surpasses the maximumFileSize after only 20 hours.\n * The log file will be rolled at that 20 hour mark.\n * A new log file will be created, and the 24 hour timer will be restarted.\n * \n * You may optionally disable rolling due to filesize by setting maximumFileSize to zero.\n * If you do so, rolling is based solely on rollingFrequency.\n * \n * You may optionally disable rolling due to time by setting rollingFrequency to zero (or any non-positive number).\n * If you do so, rolling is based solely on maximumFileSize.\n * \n * If you disable both maximumFileSize and rollingFrequency, then the log file won't ever be rolled.\n * This is strongly discouraged.\n**/\n@property (readwrite, assign) unsigned long long maximumFileSize;\n@property (readwrite, assign) NSTimeInterval rollingFrequency;\n\n/**\n * The DDLogFileManager instance can be used to retrieve the list of log files,\n * and configure the maximum number of archived log files to keep.\n * \n * @see DDLogFileManager.maximumNumberOfLogFiles\n**/\n@property (strong, nonatomic, readonly) id <DDLogFileManager> logFileManager;\n\n\n// You can optionally force the current log file to be rolled with this method.\n// CompletionBlock will be called on main queue.\n\n- (void)rollLogFileWithCompletionBlock:(void (^)())completionBlock;\n\n// Method is deprecated. Use rollLogFileWithCompletionBlock: method instead.\n\n- (void)rollLogFile __attribute((deprecated));\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * DDLogFileInfo is a simple class that provides access to various file attributes.\n * It provides good performance as it only fetches the information if requested,\n * and it caches the information to prevent duplicate fetches.\n * \n * It was designed to provide quick snapshots of the current state of log files,\n * and to help sort log files in an array.\n * \n * This class does not monitor the files, or update it's cached attribute values if the file changes on disk.\n * This is not what the class was designed for.\n * \n * If you absolutely must get updated values,\n * you can invoke the reset method which will clear the cache.\n**/\n@interface DDLogFileInfo : NSObject\n{\n    __strong NSString *filePath;\n    __strong NSString *fileName;\n    \n    __strong NSDictionary *fileAttributes;\n    \n    __strong NSDate *creationDate;\n    __strong NSDate *modificationDate;\n    \n    unsigned long long fileSize;\n}\n\n@property (strong, nonatomic, readonly) NSString *filePath;\n@property (strong, nonatomic, readonly) NSString *fileName;\n\n@property (strong, nonatomic, readonly) NSDictionary *fileAttributes;\n\n@property (strong, nonatomic, readonly) NSDate *creationDate;\n@property (strong, nonatomic, readonly) NSDate *modificationDate;\n\n@property (nonatomic, readonly) unsigned long long fileSize;\n\n@property (nonatomic, readonly) NSTimeInterval age;\n\n@property (nonatomic, readwrite) BOOL isArchived;\n\n+ (instancetype)logFileWithPath:(NSString *)filePath;\n\n- (instancetype)initWithFilePath:(NSString *)filePath;\n\n- (void)reset;\n- (void)renameFile:(NSString *)newFileName;\n\n#if TARGET_IPHONE_SIMULATOR\n\n// So here's the situation.\n// Extended attributes are perfect for what we're trying to do here (marking files as archived).\n// This is exactly what extended attributes were designed for.\n// \n// But Apple screws us over on the simulator.\n// Everytime you build-and-go, they copy the application into a new folder on the hard drive,\n// and as part of the process they strip extended attributes from our log files.\n// Normally, a copy of a file preserves extended attributes.\n// So obviously Apple has gone to great lengths to piss us off.\n// \n// Thus we use a slightly different tactic for marking log files as archived in the simulator.\n// That way it \"just works\" and there's no confusion when testing.\n// \n// The difference in method names is indicative of the difference in functionality.\n// On the simulator we add an attribute by appending a filename extension.\n// \n// For example:\n// log-ABC123.txt -> log-ABC123.archived.txt\n\n- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName;\n\n- (void)addExtensionAttributeWithName:(NSString *)attrName;\n- (void)removeExtensionAttributeWithName:(NSString *)attrName;\n\n#else\n\n// Normal use of extended attributes used everywhere else,\n// such as on Macs and on iPhone devices.\n\n- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName;\n\n- (void)addExtendedAttributeWithName:(NSString *)attrName;\n- (void)removeExtendedAttributeWithName:(NSString *)attrName;\n\n#endif\n\n- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another;\n- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/DDLog.h",
    "content": "#import <Foundation/Foundation.h>\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * Otherwise, here is a quick refresher.\n * There are three steps to using the macros:\n * \n * Step 1:\n * Import the header in your implementation file:\n * \n * #import \"DDLog.h\"\n * \n * Step 2:\n * Define your logging level in your implementation file:\n * \n * // Log levels: off, error, warn, info, verbose\n * static const int ddLogLevel = LOG_LEVEL_VERBOSE;\n * \n * Step 2 [3rd party frameworks]:\n *\n * Define your LOG_LEVEL_DEF to a different variable/function than ddLogLevel:\n *\n * // #undef LOG_LEVEL_DEF // Undefine first only if needed\n * #define LOG_LEVEL_DEF myLibLogLevel\n *\n * Define your logging level in your implementation file:\n *\n * // Log levels: off, error, warn, info, verbose\n * static const int myLibLogLevel = LOG_LEVEL_VERBOSE;\n *\n * Step 3:\n * Replace your NSLog statements with DDLog statements according to the severity of the message.\n * \n * NSLog(@\"Fatal error, no dohickey found!\"); -> DDLogError(@\"Fatal error, no dohickey found!\");\n * \n * DDLog works exactly the same as NSLog.\n * This means you can pass it multiple variables just like NSLog.\n**/\n\n#ifndef LOG_LEVEL_DEF\n    #define LOG_LEVEL_DEF ddLogLevel\n#endif\n\n@class DDLogMessage;\n\n@protocol DDLogger;\n@protocol DDLogFormatter;\n\n/**\n * This is the single macro that all other macros below compile into.\n * This big multiline macro makes all the other macros easier to read.\n**/\n\n#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \\\n  [DDLog log:isAsynchronous                                             \\\n       level:lvl                                                        \\\n        flag:flg                                                        \\\n     context:ctx                                                        \\\n        file:__FILE__                                                   \\\n    function:fnct                                                       \\\n        line:__LINE__                                                   \\\n         tag:atag                                                       \\\n      format:(frmt), ##__VA_ARGS__]\n\n/**\n * Define the Objective-C and C versions of the macro.\n * These automatically inject the proper function name for either an objective-c method or c function.\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_OBJC_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MACRO(async, lvl, flg, ctx, nil, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MACRO(async, lvl, flg, ctx, nil, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define version of the macro that only execute if the logLevel is above the threshold.\n * The compiled versions essentially look like this:\n * \n * if (logFlagForThisLogMsg & ddLogLevel) { execute log message }\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels.\n * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques.\n * \n * Note that when compiler optimizations are enabled (as they are for your release builds),\n * the log messages above your logging threshold will automatically be compiled out.\n * \n * (If the compiler sees ddLogLevel declared as a constant, the compiler simply checks to see if the 'if' statement\n *  would execute, and if not it strips it from the binary.)\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define versions of the macros that also accept tags.\n * \n * The DDLogMessage object includes a 'tag' ivar that may be used for a variety of purposes.\n * It may be used to pass custom information to loggers or formatters.\n * Or it may be used by 3rd party extensions to the framework.\n * \n * Thes macros just make it a little easier to extend logging functionality.\n**/\n\n#define LOG_OBJC_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n                 LOG_MACRO(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n              LOG_MACRO(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n             LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n          LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n/**\n * Define the standard options.\n * \n * We default to only 4 levels because it makes it easier for beginners\n * to make the transition to a logging framework.\n * \n * More advanced users may choose to completely customize the levels (and level names) to suite their needs.\n * For more information on this see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n * \n * Advanced users may also notice that we're using a bitmask.\n * This is to allow for custom fine grained logging:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/FineGrainedLogging\n * \n * -- Flags --\n * \n * Typically you will use the LOG_LEVELS (see below), but the flags may be used directly in certain situations.\n * For example, say you have a lot of warning log messages, and you wanted to disable them.\n * However, you still needed to see your error and info log messages.\n * You could accomplish that with the following:\n * \n * static const int ddLogLevel = LOG_FLAG_ERROR | LOG_FLAG_INFO;\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * Flags may also be consulted when writing custom log formatters,\n * as the DDLogMessage class captures the individual flag that caused the log message to fire.\n * \n * -- Levels --\n * \n * Log levels are simply the proper bitmask of the flags.\n * \n * -- Booleans --\n * \n * The booleans may be used when your logging code involves more than one line.\n * For example:\n * \n * if (LOG_VERBOSE) {\n *     for (id sprocket in sprockets)\n *         DDLogVerbose(@\"sprocket: %@\", [sprocket description])\n * }\n * \n * -- Async --\n * \n * Defines the default asynchronous options.\n * The default philosophy for asynchronous logging is very simple:\n * \n * Log messages with errors should be executed synchronously.\n *     After all, an error just occurred. The application could be unstable.\n * \n * All other log messages, such as debug output, are executed asynchronously.\n *     After all, if it wasn't an error, then it was just informational output,\n *     or something the application was easily able to recover from.\n * \n * -- Changes --\n * \n * You are strongly discouraged from modifying this file.\n * If you do, you make it more difficult on yourself to merge future bug fixes and improvements from the project.\n * Instead, create your own MyLogging.h or ApplicationNameLogging.h or CompanyLogging.h\n * \n * For an example of customizing your logging experience, see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n**/\n\n#define LOG_FLAG_ERROR    (1 << 0)  // 0...00001\n#define LOG_FLAG_WARN     (1 << 1)  // 0...00010\n#define LOG_FLAG_INFO     (1 << 2)  // 0...00100\n#define LOG_FLAG_DEBUG    (1 << 3)  // 0...01000\n#define LOG_FLAG_VERBOSE  (1 << 4)  // 0...10000\n\n#define LOG_LEVEL_OFF     0\n#define LOG_LEVEL_ERROR   (LOG_FLAG_ERROR)                                                                          // 0...00001\n#define LOG_LEVEL_WARN    (LOG_FLAG_ERROR | LOG_FLAG_WARN)                                                          // 0...00011\n#define LOG_LEVEL_INFO    (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO)                                          // 0...00111\n#define LOG_LEVEL_DEBUG   (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG)                         // 0...01111\n#define LOG_LEVEL_VERBOSE (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG | LOG_FLAG_VERBOSE)      // 0...11111\n\n#define LOG_ERROR    (LOG_LEVEL_DEF & LOG_FLAG_ERROR)\n#define LOG_WARN     (LOG_LEVEL_DEF & LOG_FLAG_WARN)\n#define LOG_INFO     (LOG_LEVEL_DEF & LOG_FLAG_INFO)\n#define LOG_DEBUG    (LOG_LEVEL_DEF & LOG_FLAG_DEBUG)\n#define LOG_VERBOSE  (LOG_LEVEL_DEF & LOG_FLAG_VERBOSE)\n\n#define LOG_ASYNC_ENABLED YES\n\n#define LOG_ASYNC_ERROR    ( NO && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_WARN     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_INFO     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_DEBUG    (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_VERBOSE  (YES && LOG_ASYNC_ENABLED)\n\n#define DDLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogDebug(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define DDLogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogCDebug(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n/**\n * The THIS_FILE macro gives you an NSString of the file name.\n * For simplicity and clarity, the file name does not include the full path or file extension.\n * \n * For example: DDLogWarn(@\"%@: Unable to find thingy\", THIS_FILE) -> @\"MyViewController: Unable to find thingy\"\n**/\n\nNSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy);\n\n#define THIS_FILE (DDExtractFileNameWithoutExtension(__FILE__, NO))\n\n/**\n * The THIS_METHOD macro gives you the name of the current objective-c method.\n * \n * For example: DDLogWarn(@\"%@ - Requires non-nil strings\", THIS_METHOD) -> @\"setMake:model: requires non-nil strings\"\n * \n * Note: This does NOT work in straight C functions (non objective-c).\n * Instead you should use the predefined __FUNCTION__ macro.\n**/\n\n#define THIS_METHOD NSStringFromSelector(_cmd)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDLog : NSObject\n\n/**\n * Provides access to the underlying logging queue.\n * This may be helpful to Logger classes for things like thread synchronization.\n**/\n\n+ (dispatch_queue_t)loggingQueue;\n\n/**\n * Logging Primitive.\n * \n * This method is used by the macros above.\n * It is suggested you stick with the macros as they're easier to use.\n**/\n\n+ (void)log:(BOOL)synchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format, ... __attribute__ ((format (__NSString__, 9, 10)));\n\n/**\n * Logging Primitive.\n * \n * This method can be used if you have a prepared va_list.\n**/\n\n+ (void)log:(BOOL)asynchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format\n       args:(va_list)argList;\n\n\n/**\n * Since logging can be asynchronous, there may be times when you want to flush the logs.\n * The framework invokes this automatically when the application quits.\n**/\n\n+ (void)flushLog;\n\n/** \n * Loggers\n * \n * If you want your log statements to go somewhere,\n * you should create and add a logger.\n**/\n\n+ (void)addLogger:(id <DDLogger>)logger;    // adds the logger using maximum log level (LOG_LEVEL_VERBOSE)\n\n/**\n * Please use as logLevels the LOG_LEVEL_* macros\n *\n**/\n+ (void)addLogger:(id <DDLogger>)logger withLogLevel:(int)logLevel;\n\n+ (void)removeLogger:(id <DDLogger>)logger;\n+ (void)removeAllLoggers;\n\n/**\n * Registered Dynamic Logging\n * \n * These methods allow you to obtain a list of classes that are using registered dynamic logging,\n * and also provides methods to get and set their log level during run time.\n**/\n\n+ (NSArray *)registeredClasses;\n+ (NSArray *)registeredClassNames;\n\n+ (int)logLevelForClass:(Class)aClass;\n+ (int)logLevelForClassWithName:(NSString *)aClassName;\n\n+ (void)setLogLevel:(int)logLevel forClass:(Class)aClass;\n+ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogger <NSObject>\n@required\n\n- (void)logMessage:(DDLogMessage *)logMessage;\n\n/**\n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n**/\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@optional\n\n/**\n * Since logging is asynchronous, adding and removing loggers is also asynchronous.\n * In other words, the loggers are added and removed at appropriate times with regards to log messages.\n * \n * - Loggers will not receive log messages that were executed prior to when they were added.\n * - Loggers will not receive log messages that were executed after they were removed.\n * \n * These methods are executed in the logging thread/queue.\n * This is the same thread/queue that will execute every logMessage: invocation.\n * Loggers may use these methods for thread synchronization or other setup/teardown tasks.\n**/\n- (void)didAddLogger;\n- (void)willRemoveLogger;\n\n/**\n * Some loggers may buffer IO for optimization purposes.\n * For example, a database logger may only save occasionaly as the disk IO is slow.\n * In such loggers, this method should be implemented to flush any pending IO.\n * \n * This allows invocations of DDLog's flushLog method to be propogated to loggers that need it.\n * \n * Note that DDLog's flushLog method is invoked automatically when the application quits,\n * and it may be also invoked manually by the developer prior to application crashes, or other such reasons.\n**/\n- (void)flush;\n\n/**\n * Each logger is executed concurrently with respect to the other loggers.\n * Thus, a dedicated dispatch queue is used for each logger.\n * Logger implementations may optionally choose to provide their own dispatch queue.\n**/\n- (dispatch_queue_t)loggerQueue;\n\n/**\n * If the logger implementation does not choose to provide its own queue,\n * one will automatically be created for it.\n * The created queue will receive its name from this method.\n * This may be helpful for debugging or profiling reasons.\n**/\n- (NSString *)loggerName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogFormatter <NSObject>\n@required\n\n/**\n * Formatters may optionally be added to any logger.\n * This allows for increased flexibility in the logging environment.\n * For example, log messages for log files may be formatted differently than log messages for the console.\n * \n * For more information about formatters, see the \"Custom Formatters\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The formatter may also optionally filter the log message by returning nil,\n * in which case the logger will not log the message.\n**/\n- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;\n\n@optional\n\n/**\n * A single formatter instance can be added to multiple loggers.\n * These methods provides hooks to notify the formatter of when it's added/removed.\n *\n * This is primarily for thread-safety.\n * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers.\n * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter),\n * it could possibly use these hooks to switch to thread-safe versions of the code.\n**/\n- (void)didAddToLogger:(id <DDLogger>)logger;\n- (void)willRemoveFromLogger:(id <DDLogger>)logger;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDRegisteredDynamicLogging\n\n/**\n * Implement these methods to allow a file's log level to be managed from a central location.\n * \n * This is useful if you'd like to be able to change log levels for various parts\n * of your code from within the running application.\n * \n * Imagine pulling up the settings for your application,\n * and being able to configure the logging level on a per file basis.\n * \n * The implementation can be very straight-forward:\n * \n * + (int)ddLogLevel\n * {\n *     return ddLogLevel;\n * }\n *  \n * + (void)ddSetLogLevel:(int)logLevel\n * {\n *     ddLogLevel = logLevel;\n * }\n**/\n\n+ (int)ddLogLevel;\n+ (void)ddSetLogLevel:(int)logLevel;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogMessage class encapsulates information about the log message.\n * If you write custom loggers or formatters, you will be dealing with objects of this class.\n**/\n\nenum {\n    DDLogMessageCopyFile     = 1 << 0,\n    DDLogMessageCopyFunction = 1 << 1\n};\ntypedef int DDLogMessageOptions;\n\n@interface DDLogMessage : NSObject <NSCopying>\n{\n\n// The public variables below can be accessed directly (for speed).\n// For example: logMessage->logLevel\n    \n@public\n    int logLevel;\n    int logFlag;\n    int logContext;\n    NSString *logMsg;\n    NSDate *timestamp;\n    char *file;\n    char *function;\n    int lineNumber;\n    mach_port_t machThreadID;\n    char *queueLabel;\n    NSString *threadName;\n    \n    // For 3rd party extensions to the framework, where flags and contexts aren't enough.\n    id tag;\n    \n    // For 3rd party extensions that manually create DDLogMessage instances.\n    DDLogMessageOptions options;\n}\n\n/**\n * Standard init method for a log message object.\n * Used by the logging primitives. (And the macros use the logging primitives.)\n * \n * If you find need to manually create logMessage objects, there is one thing you should be aware of:\n * \n * If no flags are passed, the method expects the file and function parameters to be string literals.\n * That is, it expects the given strings to exist for the duration of the object's lifetime,\n * and it expects the given strings to be immutable.\n * In other words, it does not copy these strings, it simply points to them.\n * This is due to the fact that __FILE__ and __FUNCTION__ are usually used to specify these parameters,\n * so it makes sense to optimize and skip the unnecessary allocations.\n * However, if you need them to be copied you may use the options parameter to specify this.\n * Options is a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction.\n**/\n- (instancetype)initWithLogMsg:(NSString *)logMsg\n                         level:(int)logLevel\n                          flag:(int)logFlag\n                       context:(int)logContext\n                          file:(const char *)file\n                      function:(const char *)function\n                          line:(int)line\n                           tag:(id)tag\n                       options:(DDLogMessageOptions)optionsMask;\n\n/**\n * Returns the threadID as it appears in NSLog.\n * That is, it is a hexadecimal value which is calculated from the machThreadID.\n**/\n- (NSString *)threadID;\n\n/**\n * Convenience property to get just the file name, as the file variable is generally the full file path.\n * This method does not include the file extension, which is generally unwanted for logging purposes.\n**/\n- (NSString *)fileName;\n\n/**\n * Returns the function variable in NSString form.\n**/\n- (NSString *)methodName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogger protocol specifies that an optional formatter can be added to a logger.\n * Most (but not all) loggers will want to support formatters.\n * \n * However, writting getters and setters in a thread safe manner,\n * while still maintaining maximum speed for the logging process, is a difficult task.\n * \n * To do it right, the implementation of the getter/setter has strict requiremenets:\n * - Must NOT require the logMessage method to acquire a lock.\n * - Must NOT require the logMessage method to access an atomic property (also a lock of sorts).\n * \n * To simplify things, an abstract logger is provided that implements the getter and setter.\n * \n * Logger implementations may simply extend this class,\n * and they can ACCESS THE FORMATTER VARIABLE DIRECTLY from within their logMessage method!\n**/\n\n@interface DDAbstractLogger : NSObject <DDLogger>\n{\n    id <DDLogFormatter> formatter;\n    \n    dispatch_queue_t loggerQueue;\n}\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n// For thread-safety assertions\n- (BOOL)isOnGlobalLoggingQueue;\n- (BOOL)isOnInternalLoggerQueue;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/DDTTYLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#if TARGET_OS_IPHONE\n#import <UIKit/UIColor.h>   // iOS\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n#import <AppKit/NSColor.h>  // OS X with AppKit\n#else\n#import \"CLIColor.h\"        // OS X without AppKit\n#endif\n\n#import \"DDLog.h\"\n\n#define LOG_CONTEXT_ALL INT_MAX\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for Terminal output or Xcode console output,\n * depending on where you are running your code.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log (so it shows up in Console.app)\n * - StdErr (if stderr is a TTY, so log statements show up in Xcode console)\n * \n * To duplicate NSLog() functionality you can simply add this logger and an asl logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use only a file logger and a tty logger.\n**/\n\n@interface DDTTYLogger : DDAbstractLogger <DDLogger>\n{\n    NSCalendar *calendar;\n    NSUInteger calendarUnitFlags;\n    \n    NSString *appName;\n    char *app;\n    size_t appLen;\n    \n    NSString *processID;\n    char *pid;\n    size_t pidLen;\n    \n    BOOL colorsEnabled;\n    NSMutableArray *colorProfilesArray;\n    NSMutableDictionary *colorProfilesDict;\n}\n\n+ (instancetype)sharedInstance;\n\n/* Inherited from the DDLogger protocol:\n * \n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n * \n * More information about formatters can be found here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The actual implementation of these methods is inherited from DDAbstractLogger.\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n \n*/\n\n/**\n * Want to use different colors for different log levels?\n * Enable this property.\n * \n * If you run the application via the Terminal (not Xcode),\n * the logger will map colors to xterm-256color or xterm-color (if available).\n * \n * Xcode does NOT natively support colors in the Xcode debugging console.\n * You'll need to install the XcodeColors plugin to see colors in the Xcode console.\n * https://github.com/robbiehanson/XcodeColors\n * \n * The default value if NO.\n**/\n@property (readwrite, assign) BOOL colorsEnabled;\n\n/**\n * The default color set (foregroundColor, backgroundColor) is:\n * \n * - LOG_FLAG_ERROR = (red, nil)\n * - LOG_FLAG_WARN  = (orange, nil)\n * \n * You can customize the colors however you see fit.\n * Please note that you are passing a flag, NOT a level.\n * \n * GOOD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_FLAG_INFO];  // <- Good :)\n *  BAD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_LEVEL_INFO]; // <- BAD! :(\n * \n * LOG_FLAG_INFO  = 0...00100\n * LOG_LEVEL_INFO = 0...00111 <- Would match LOG_FLAG_INFO and LOG_FLAG_WARN and LOG_FLAG_ERROR\n * \n * If you run the application within Xcode, then the XcodeColors plugin is required.\n * \n * If you run the application from a shell, then DDTTYLogger will automatically map the given color to\n * the closest available color. (xterm-256color or xterm-color which have 256 and 16 supported colors respectively.)\n * \n * This method invokes setForegroundColor:backgroundColor:forFlag:context: and applies it to `LOG_CONTEXT_ALL`.\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask;\n#endif\n\n/**\n * Just like setForegroundColor:backgroundColor:flag, but allows you to specify a particular logging context.\n * \n * A logging context is often used to identify log messages coming from a 3rd party framework,\n * although logging context's can be used for many different functions.\n * \n * Use LOG_CONTEXT_ALL to set the deafult color for all contexts that have no specific color set defined.\n * \n * Logging context's are explained in further detail here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomContext\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#endif\n\n/**\n * Similar to the methods above, but allows you to map DDLogMessage->tag to a particular color profile.\n * For example, you could do something like this:\n * \n * static NSString *const PurpleTag = @\"PurpleTag\";\n * \n * #define DDLogPurple(frmt, ...) LOG_OBJC_TAG_MACRO(NO, 0, 0, 0, PurpleTag, frmt, ##__VA_ARGS__)\n * \n * And then in your applicationDidFinishLaunching, or wherever you configure Lumberjack:\n * \n * #if TARGET_OS_IPHONE\n *   UIColor *purple = [UIColor colorWithRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n * #else\n *   NSColor *purple = [NSColor colorWithCalibratedRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n *\n * Note: For CLI OS X projects that don't link with AppKit use CLIColor objects instead\n * \n * [[DDTTYLogger sharedInstance] setForegroundColor:purple backgroundColor:nil forTag:PurpleTag];\n * [DDLog addLogger:[DDTTYLogger sharedInstance]];\n * \n * This would essentially give you a straight NSLog replacement that prints in purple:\n * \n * DDLogPurple(@\"I'm a purple log message!\");\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forTag:(id <NSCopying>)tag;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forTag:(id <NSCopying>)tag;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forTag:(id <NSCopying>)tag;\n#endif\n\n/**\n * Clearing color profiles.\n**/\n- (void)clearColorsForFlag:(int)mask;\n- (void)clearColorsForFlag:(int)mask context:(int)context;\n- (void)clearColorsForTag:(id <NSCopying>)tag;\n- (void)clearColorsForAllFlags;\n- (void)clearColorsForAllTags;\n- (void)clearAllColors;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/NSJSONSerialization+ObjectWithNString.h",
    "content": "//\n//  NSJSONSerialization+ObjectWithNString.h\n//  Ejecta\n//\n//  Created by matth on 7/19/13.\n//\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (ObjectWithNString)\n+ (id)JSONObjectWithString:(NSString *)string options:(NSJSONReadingOptions)opt error:(NSError **)error;\n+ (NSString*)stringWithNSDictionary:(NSDictionary*)dictionary;\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/NSJSONSerialization+PBJSONHelpers.h",
    "content": "//\n//  NSJSONSerialization+PBJSONHelpers.h\n//  PebbleVendor\n//\n//  Created by matth on 9/17/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (PBJSONHelpers)\n\n/** @name Reflection helpers */\n\n/**\n * Derived from the Box SDK (MIT license) NSJSONSerialization+BoxAdditions...\n * https://github.com/box/box-ios-sdk-v2/tree/master/BoxSDK/Categories\n \n * Ensure that the object at `key` in `dictionary` is a member of the expected class.\n * `NSNull` may be specified as an allowable value. This method may return nil if `key`\n * is not present in `dictionary`.\n *\n * @param key The key to lookup in `dictionary`.\n * @param dictionary A dictionary resulting from deserializing a JSON object.\n * @param cls The expected class of the value at key.\n * @param nullAllowed If true, `NSNull` will be returned. If not, NSNull will be converted to nil. Property getters that pass `YES` for this parameter should have the return type of `id`.\n *\n * @return The object at `key` in `dictionary` if expectations are satisfied; `nil` otherwise.\n */\n+ (id)ensureObjectForKey:(NSString *)key inDictionary:(NSDictionary *)dictionary hasExpectedType:(Class)cls nullAllowed:(BOOL)nullAllowed;\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/NSString+HexData.h",
    "content": "//\n//  NSString+HexData.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 11/19/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSString (HexData)\n\n- (NSData*)hexData;\n\n@end\n\n\n@interface NSData (HexString)\n\n- (NSString*)hexString;\n\n@end"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/UIDevice-Hardware.h",
    "content": "/*\n Erica Sadun, http://ericasadun.com\n iPhone Developer's Cookbook, 6.x Edition\n BSD License, Use at your own risk\n */\n\n#import <UIKit/UIKit.h>\n\ntypedef enum {\n    UIDeviceFamilyiPhone,\n    UIDeviceFamilyiPod,\n    UIDeviceFamilyiPad,\n    UIDeviceFamilyAppleTV,\n    UIDeviceFamilyUnknown,\n    \n} UIDeviceFamily;\n\n@interface UIDevice (Hardware)\n- (NSString *) platform;\n- (NSString *) hwmodel;\n- (NSString *) platformString;\n\n- (NSUInteger) cpuFrequency;\n- (NSUInteger) busFrequency;\n- (NSUInteger) cpuCount;\n- (NSUInteger) totalMemory;\n- (NSUInteger) userMemory;\n\n- (NSNumber *) totalDiskSpace;\n- (NSNumber *) freeDiskSpace;\n\n- (NSString *) macaddress;\n\n- (BOOL) hasRetinaDisplay;\n- (BOOL) hasBluetoothMAP;\n- (UIDeviceFamily) deviceFamily;\n@end"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/CHMultiDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMultiDictionary.h\n \n Copyright (c) 2008-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n#import \"CHMutableDictionary.h\"\n\n/**\n @file CHMultiDictionary.h\n \n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> in which multiple values may be associated with a given key.\n */\n\n/**\n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> implementation, in which multiple values may be associated with a given key.\n \n A map is the same as a \"dictionary\", \"associative array\", etc. and consists of a unique set of keys and a collection of values. In a standard map, each key is associated with one value; in a multimap, more than one value may be associated with a given key. A multimap is appropriate for any situation in which one item may correspond to (map to) multiple values, such as a term in an book index and occurrences of that term, courses for which a student is registered, etc.\n \n The values for a key may or may not be ordered. This implementation does not maintain an ordering for objects associated with a key, nor does it allow for multiple occurrences of an object associated with the same key. Internally, this class uses an NSMutableDictionary, and the associated values for each key are stored in distinct NSMutableSet instances. (Just as with NSDictionary, each key added to a CHMultiDictionary is copied using \\link NSCopying#copyWithZone: -copyWithZone:\\endlink and all keys must conform to the NSCopying protocol.) Objects are retained on insertion and released on removal or deallocation.\n \n Since NSDictionary and NSSet conform to the NSCoding protocol, any internal data can be serialized. However, NSSet cannot automatically be written to or read from a property list, since it has no specified order. Thus, instances of CHMultiDictionary must be encoded as an NSData object before saving to disk.\n \n Currently, this implementation does not support key-value coding, observing, or binding like NSDictionary does. Consequently, the distinction between \"object\" and \"value\" is blurrier, although hopefully consistent with the Cocoa APIs in general....\n \n Unlike NSDictionary and other Cocoa collections, CHMultiDictionary has not been designed with mutable and immutable variants. A multimap is not that much more useful if it is immutable, so any copies made of this class are mutable by definition.\n */\n@interface CHMultiDictionary : CHMutableDictionary {\n\tNSUInteger objectCount; // Number of objects currently in the dictionary.\n}\n\n#pragma mark Querying Contents\n\n/**\n Returns the number of objects in the receiver, associated with any key.\n \n @return The number of objects in the receiver. This is the sum total of objects associated with each key in the dictonary.\n \n @see allObjects\n */\n- (NSUInteger) countForAllKeys;\n\n/**\n Returns the number of objects associated with a given key.\n \n @param aKey The key for which to return the object count.\n @return The number of objects associated with a given key in the dictionary.\n \n @see objectsForKey:\n */\n- (NSUInteger) countForKey:(id)aKey;\n\n/**\n Returns an array of objects associated with a given key.\n \n @param aKey The key for which to return the corresponding objects.\n @return An NSSet of objects associated with a given key, or nil if the key is not in the receiver.\n \n @see countForKey:\n @see removeObjectsForKey:\n */\n- (NSSet*) objectsForKey:(id)aKey;\n\n#pragma mark Modifying Contents\n\n/**\n Adds a given object to an entry for a given key in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param anObject An object to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#addObject: -[NSMutableSet addObject:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObject:(id)anObject forKey:(id)aKey;\n\n/**\n Adds the given object(s) to a key entry in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param objectSet A set of objects to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#unionSet: -[NSMutableSet unionSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n/**\n Remove @b all occurrences of @a anObject associated with a given key.\n \n @param aKey The key for which to remove an entry.\n @param anObject An object (possibly) associated with @a aKey in the receiver. Objects are considered to be equal if -compare: returns NSOrderedSame.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n If @a aKey does not exist in the receiver, or if @a anObject is not associated with @a aKey, the contents of the receiver are not modified.\n \n @see containsObject\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) removeObject:(id)anObject forKey:(id)aKey;\n\n/**\n Remove a given key and its associated value(s) from the receiver.\n \n @param aKey The key for which to remove an entry.\n \n If @a aKey does not exist in the receiver, there is no effect on the receiver.\n \n @see objectsForKey:\n @see removeObject:forKey:\n */\n- (void) removeObjectsForKey:(id)aKey;\n\n/**\n Sets the object(s) associated with a key entry in the receiver.\n \n @param aKey The key with which to associate the objects in @a objectSet.\n @param objectSet A set of objects to associate with @a key. If @a objectSet is empty, the contents of the receiver are not modified. If an entry for @a key already exists in the receiver, @a objectSet is added using \\link NSMutableSet#setSet: -[NSMutableSet setSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) setObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/CHMutableDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMutableDictionary.h\n \n Copyright (c) 2009-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n__attribute__((visibility(\"hidden\"))) void createCollectableCFMutableDictionary(CFMutableDictionaryRef* dictionary, NSUInteger initialCapacity);\n\n/**\n @file CHMutableDictionary.h\n \n A mutable dictionary class.\n */\n\n/**\n A mutable dictionary class.\n \n A CFMutableDictionaryRef is used internally to store the key-value pairs. Subclasses may choose to add other instance variables to enable a specific ordering of keys, override methods to modify behavior, and add methods to extend existing behaviors. However, all subclasses should behave like a standard Cocoa dictionary as much as possible, and document clearly when they do not.\n \n @note Any method inherited from NSDictionary or NSMutableDictionary is supported by this class and its children. Please see the documentation for those classes for details.\n \n @todo Implement @c -copy and @c -mutableCopy differently (so users can actually obtain an immutable copy) and make mutation methods aware of immutability?\n */\n@interface CHMutableDictionary : NSMutableDictionary {\n  CFMutableDictionaryRef dictionary; // A Core Foundation dictionary.\n}\n\n- (id) initWithCapacity:(NSUInteger)numItems;\n\n- (NSUInteger) count;\n- (NSEnumerator*) keyEnumerator;\n- (id) objectForKey:(id)aKey;\n- (void) removeAllObjects;\n- (void) removeObjectForKey:(id)aKey;\n- (void) setObject:(id)anObject forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/DDASLLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import <asl.h>\n\n#import \"DDLog.h\"\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for the Apple System Log facility.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log\n * - StdErr (if stderr is a TTY) so log statements show up in Xcode console\n * \n * To duplicate NSLog() functionality you can simply add this logger and a tty logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use a file logger and a tty logger.\n**/\n\n@interface DDASLLogger : DDAbstractLogger <DDLogger>\n{\n    aslclient client;\n}\n\n+ (instancetype)sharedInstance;\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/DDFileLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"DDLog.h\"\n\n@class DDLogFileInfo;\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger to write log statements to a file.\n**/\n\n\n// Default configuration and safety/sanity values.\n// \n// maximumFileSize         -> DEFAULT_LOG_MAX_FILE_SIZE\n// rollingFrequency        -> DEFAULT_LOG_ROLLING_FREQUENCY\n// maximumNumberOfLogFiles -> DEFAULT_LOG_MAX_NUM_LOG_FILES\n// \n// You should carefully consider the proper configuration values for your application.\n\n#define DEFAULT_LOG_MAX_FILE_SIZE     (1024 * 1024)   //  1 MB\n#define DEFAULT_LOG_ROLLING_FREQUENCY (60 * 60 * 24)  // 24 Hours\n#define DEFAULT_LOG_MAX_NUM_LOG_FILES (5)             //  5 Files\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// The LogFileManager protocol is designed to allow you to control all aspects of your log files.\n// \n// The primary purpose of this is to allow you to do something with the log files after they have been rolled.\n// Perhaps you want to compress them to save disk space.\n// Perhaps you want to upload them to an FTP server.\n// Perhaps you want to run some analytics on the file.\n// \n// A default LogFileManager is, of course, provided.\n// The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property.\n// \n// This protocol provides various methods to fetch the list of log files.\n// \n// There are two variants: sorted and unsorted.\n// If sorting is not necessary, the unsorted variant is obviously faster.\n// The sorted variant will return an array sorted by when the log files were created,\n// with the most recently created log file at index 0, and the oldest log file at the end of the array.\n// \n// You can fetch only the log file paths (full path including name), log file names (name only),\n// or an array of DDLogFileInfo objects.\n// The DDLogFileInfo class is documented below, and provides a handy wrapper that\n// gives you easy access to various file attributes such as the creation date or the file size.\n\n@protocol DDLogFileManager <NSObject>\n@required\n\n// Public properties\n\n/**\n * The maximum number of archived log files to keep on disk.\n * For example, if this property is set to 3,\n * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk.\n * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted.\n * \n * You may optionally disable deleting old/rolled/archived log files by setting this property to zero.\n**/\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n// Public methods\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n// Private methods (only to be used by DDFileLogger)\n\n- (NSString *)createNewLogFile;\n\n@optional\n\n// Notifications from DDFileLogger\n\n- (void)didArchiveLogFile:(NSString *)logFilePath;\n- (void)didRollAndArchiveLogFile:(NSString *)logFilePath;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Default log file manager.\n * \n * All log files are placed inside the logsDirectory.\n * If a specific logsDirectory isn't specified, the default directory is used.\n * On Mac, this is in ~/Library/Logs/<Application Name>.\n * On iPhone, this is in ~/Library/Caches/Logs.\n * \n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n * \n * Archived log files are automatically deleted according to the maximumNumberOfLogFiles property.\n**/\n@interface DDLogFileManagerDefault : NSObject <DDLogFileManager>\n{\n    NSUInteger maximumNumberOfLogFiles;\n    NSString *_logsDirectory;\n}\n\n- (id)init;\n- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory;\n\n/*\n * Methods to override.\n *\n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n *\n * If you wish to change default filename, you can override following two methods.\n * - newLogFileName method would be called on new logfile creation.\n * - isLogFile: method would be called to filter logfiles from all other files in logsDirectory.\n *   You have to parse given filename and return YES if it is logFile.\n *\n * **NOTE**\n * newLogFileName returns filename. If appropriate file already exists, number would be added\n * to filename before extension. You have to handle this case in isLogFile: method.\n *\n * Example:\n * - newLogFileName returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 2.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03 1.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 3.log\" would be created.\n**/\n- (NSString *)newLogFileName;\n- (BOOL)isLogFile:(NSString *)fileName;\n\n/* Inherited from DDLogFileManager protocol:\n\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n*/\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Most users will want file log messages to be prepended with the date and time.\n * Rather than forcing the majority of users to write their own formatter,\n * we will supply a logical default formatter.\n * Users can easily replace this formatter with their own by invoking the setLogFormatter method.\n * It can also be removed by calling setLogFormatter, and passing a nil parameter.\n * \n * In addition to the convenience of having a logical default formatter,\n * it will also provide a template that makes it easy for developers to copy and change.\n**/\n@interface DDLogFileFormatterDefault : NSObject <DDLogFormatter>\n{\n    NSDateFormatter *dateFormatter;\n}\n\n- (id)init;\n- (instancetype)initWithDateFormatter:(NSDateFormatter *)dateFormatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDFileLogger : DDAbstractLogger <DDLogger>\n{\n    __strong id <DDLogFileManager> logFileManager;\n    \n    DDLogFileInfo *currentLogFileInfo;\n    NSFileHandle *currentLogFileHandle;\n    \n    dispatch_source_t currentLogFileVnode;\n    dispatch_source_t rollingTimer;\n    \n    unsigned long long maximumFileSize;\n    NSTimeInterval rollingFrequency;\n}\n\n- (id)init;\n- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)logFileManager;\n\n/**\n * Log File Rolling:\n * \n * maximumFileSize:\n *   The approximate maximum size to allow log files to grow.\n *   If a log file is larger than this value after a log statement is appended,\n *   then the log file is rolled.\n * \n * rollingFrequency\n *   How often to roll the log file.\n *   The frequency is given as an NSTimeInterval, which is a double that specifies the interval in seconds.\n *   Once the log file gets to be this old, it is rolled.\n * \n * Both the maximumFileSize and the rollingFrequency are used to manage rolling.\n * Whichever occurs first will cause the log file to be rolled.\n * \n * For example:\n * The rollingFrequency is 24 hours,\n * but the log file surpasses the maximumFileSize after only 20 hours.\n * The log file will be rolled at that 20 hour mark.\n * A new log file will be created, and the 24 hour timer will be restarted.\n * \n * You may optionally disable rolling due to filesize by setting maximumFileSize to zero.\n * If you do so, rolling is based solely on rollingFrequency.\n * \n * You may optionally disable rolling due to time by setting rollingFrequency to zero (or any non-positive number).\n * If you do so, rolling is based solely on maximumFileSize.\n * \n * If you disable both maximumFileSize and rollingFrequency, then the log file won't ever be rolled.\n * This is strongly discouraged.\n**/\n@property (readwrite, assign) unsigned long long maximumFileSize;\n@property (readwrite, assign) NSTimeInterval rollingFrequency;\n\n/**\n * The DDLogFileManager instance can be used to retrieve the list of log files,\n * and configure the maximum number of archived log files to keep.\n * \n * @see DDLogFileManager.maximumNumberOfLogFiles\n**/\n@property (strong, nonatomic, readonly) id <DDLogFileManager> logFileManager;\n\n\n// You can optionally force the current log file to be rolled with this method.\n// CompletionBlock will be called on main queue.\n\n- (void)rollLogFileWithCompletionBlock:(void (^)())completionBlock;\n\n// Method is deprecated. Use rollLogFileWithCompletionBlock: method instead.\n\n- (void)rollLogFile __attribute((deprecated));\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * DDLogFileInfo is a simple class that provides access to various file attributes.\n * It provides good performance as it only fetches the information if requested,\n * and it caches the information to prevent duplicate fetches.\n * \n * It was designed to provide quick snapshots of the current state of log files,\n * and to help sort log files in an array.\n * \n * This class does not monitor the files, or update it's cached attribute values if the file changes on disk.\n * This is not what the class was designed for.\n * \n * If you absolutely must get updated values,\n * you can invoke the reset method which will clear the cache.\n**/\n@interface DDLogFileInfo : NSObject\n{\n    __strong NSString *filePath;\n    __strong NSString *fileName;\n    \n    __strong NSDictionary *fileAttributes;\n    \n    __strong NSDate *creationDate;\n    __strong NSDate *modificationDate;\n    \n    unsigned long long fileSize;\n}\n\n@property (strong, nonatomic, readonly) NSString *filePath;\n@property (strong, nonatomic, readonly) NSString *fileName;\n\n@property (strong, nonatomic, readonly) NSDictionary *fileAttributes;\n\n@property (strong, nonatomic, readonly) NSDate *creationDate;\n@property (strong, nonatomic, readonly) NSDate *modificationDate;\n\n@property (nonatomic, readonly) unsigned long long fileSize;\n\n@property (nonatomic, readonly) NSTimeInterval age;\n\n@property (nonatomic, readwrite) BOOL isArchived;\n\n+ (instancetype)logFileWithPath:(NSString *)filePath;\n\n- (instancetype)initWithFilePath:(NSString *)filePath;\n\n- (void)reset;\n- (void)renameFile:(NSString *)newFileName;\n\n#if TARGET_IPHONE_SIMULATOR\n\n// So here's the situation.\n// Extended attributes are perfect for what we're trying to do here (marking files as archived).\n// This is exactly what extended attributes were designed for.\n// \n// But Apple screws us over on the simulator.\n// Everytime you build-and-go, they copy the application into a new folder on the hard drive,\n// and as part of the process they strip extended attributes from our log files.\n// Normally, a copy of a file preserves extended attributes.\n// So obviously Apple has gone to great lengths to piss us off.\n// \n// Thus we use a slightly different tactic for marking log files as archived in the simulator.\n// That way it \"just works\" and there's no confusion when testing.\n// \n// The difference in method names is indicative of the difference in functionality.\n// On the simulator we add an attribute by appending a filename extension.\n// \n// For example:\n// log-ABC123.txt -> log-ABC123.archived.txt\n\n- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName;\n\n- (void)addExtensionAttributeWithName:(NSString *)attrName;\n- (void)removeExtensionAttributeWithName:(NSString *)attrName;\n\n#else\n\n// Normal use of extended attributes used everywhere else,\n// such as on Macs and on iPhone devices.\n\n- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName;\n\n- (void)addExtendedAttributeWithName:(NSString *)attrName;\n- (void)removeExtendedAttributeWithName:(NSString *)attrName;\n\n#endif\n\n- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another;\n- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/DDLog.h",
    "content": "#import <Foundation/Foundation.h>\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * Otherwise, here is a quick refresher.\n * There are three steps to using the macros:\n * \n * Step 1:\n * Import the header in your implementation file:\n * \n * #import \"DDLog.h\"\n * \n * Step 2:\n * Define your logging level in your implementation file:\n * \n * // Log levels: off, error, warn, info, verbose\n * static const int ddLogLevel = LOG_LEVEL_VERBOSE;\n * \n * Step 2 [3rd party frameworks]:\n *\n * Define your LOG_LEVEL_DEF to a different variable/function than ddLogLevel:\n *\n * // #undef LOG_LEVEL_DEF // Undefine first only if needed\n * #define LOG_LEVEL_DEF myLibLogLevel\n *\n * Define your logging level in your implementation file:\n *\n * // Log levels: off, error, warn, info, verbose\n * static const int myLibLogLevel = LOG_LEVEL_VERBOSE;\n *\n * Step 3:\n * Replace your NSLog statements with DDLog statements according to the severity of the message.\n * \n * NSLog(@\"Fatal error, no dohickey found!\"); -> DDLogError(@\"Fatal error, no dohickey found!\");\n * \n * DDLog works exactly the same as NSLog.\n * This means you can pass it multiple variables just like NSLog.\n**/\n\n#ifndef LOG_LEVEL_DEF\n    #define LOG_LEVEL_DEF ddLogLevel\n#endif\n\n@class DDLogMessage;\n\n@protocol DDLogger;\n@protocol DDLogFormatter;\n\n/**\n * This is the single macro that all other macros below compile into.\n * This big multiline macro makes all the other macros easier to read.\n**/\n\n#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \\\n  [DDLog log:isAsynchronous                                             \\\n       level:lvl                                                        \\\n        flag:flg                                                        \\\n     context:ctx                                                        \\\n        file:__FILE__                                                   \\\n    function:fnct                                                       \\\n        line:__LINE__                                                   \\\n         tag:atag                                                       \\\n      format:(frmt), ##__VA_ARGS__]\n\n/**\n * Define the Objective-C and C versions of the macro.\n * These automatically inject the proper function name for either an objective-c method or c function.\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_OBJC_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MACRO(async, lvl, flg, ctx, nil, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MACRO(async, lvl, flg, ctx, nil, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define version of the macro that only execute if the logLevel is above the threshold.\n * The compiled versions essentially look like this:\n * \n * if (logFlagForThisLogMsg & ddLogLevel) { execute log message }\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels.\n * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques.\n * \n * Note that when compiler optimizations are enabled (as they are for your release builds),\n * the log messages above your logging threshold will automatically be compiled out.\n * \n * (If the compiler sees ddLogLevel declared as a constant, the compiler simply checks to see if the 'if' statement\n *  would execute, and if not it strips it from the binary.)\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define versions of the macros that also accept tags.\n * \n * The DDLogMessage object includes a 'tag' ivar that may be used for a variety of purposes.\n * It may be used to pass custom information to loggers or formatters.\n * Or it may be used by 3rd party extensions to the framework.\n * \n * Thes macros just make it a little easier to extend logging functionality.\n**/\n\n#define LOG_OBJC_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n                 LOG_MACRO(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n              LOG_MACRO(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n             LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n          LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n/**\n * Define the standard options.\n * \n * We default to only 4 levels because it makes it easier for beginners\n * to make the transition to a logging framework.\n * \n * More advanced users may choose to completely customize the levels (and level names) to suite their needs.\n * For more information on this see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n * \n * Advanced users may also notice that we're using a bitmask.\n * This is to allow for custom fine grained logging:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/FineGrainedLogging\n * \n * -- Flags --\n * \n * Typically you will use the LOG_LEVELS (see below), but the flags may be used directly in certain situations.\n * For example, say you have a lot of warning log messages, and you wanted to disable them.\n * However, you still needed to see your error and info log messages.\n * You could accomplish that with the following:\n * \n * static const int ddLogLevel = LOG_FLAG_ERROR | LOG_FLAG_INFO;\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * Flags may also be consulted when writing custom log formatters,\n * as the DDLogMessage class captures the individual flag that caused the log message to fire.\n * \n * -- Levels --\n * \n * Log levels are simply the proper bitmask of the flags.\n * \n * -- Booleans --\n * \n * The booleans may be used when your logging code involves more than one line.\n * For example:\n * \n * if (LOG_VERBOSE) {\n *     for (id sprocket in sprockets)\n *         DDLogVerbose(@\"sprocket: %@\", [sprocket description])\n * }\n * \n * -- Async --\n * \n * Defines the default asynchronous options.\n * The default philosophy for asynchronous logging is very simple:\n * \n * Log messages with errors should be executed synchronously.\n *     After all, an error just occurred. The application could be unstable.\n * \n * All other log messages, such as debug output, are executed asynchronously.\n *     After all, if it wasn't an error, then it was just informational output,\n *     or something the application was easily able to recover from.\n * \n * -- Changes --\n * \n * You are strongly discouraged from modifying this file.\n * If you do, you make it more difficult on yourself to merge future bug fixes and improvements from the project.\n * Instead, create your own MyLogging.h or ApplicationNameLogging.h or CompanyLogging.h\n * \n * For an example of customizing your logging experience, see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n**/\n\n#define LOG_FLAG_ERROR    (1 << 0)  // 0...00001\n#define LOG_FLAG_WARN     (1 << 1)  // 0...00010\n#define LOG_FLAG_INFO     (1 << 2)  // 0...00100\n#define LOG_FLAG_DEBUG    (1 << 3)  // 0...01000\n#define LOG_FLAG_VERBOSE  (1 << 4)  // 0...10000\n\n#define LOG_LEVEL_OFF     0\n#define LOG_LEVEL_ERROR   (LOG_FLAG_ERROR)                                                                          // 0...00001\n#define LOG_LEVEL_WARN    (LOG_FLAG_ERROR | LOG_FLAG_WARN)                                                          // 0...00011\n#define LOG_LEVEL_INFO    (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO)                                          // 0...00111\n#define LOG_LEVEL_DEBUG   (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG)                         // 0...01111\n#define LOG_LEVEL_VERBOSE (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG | LOG_FLAG_VERBOSE)      // 0...11111\n\n#define LOG_ERROR    (LOG_LEVEL_DEF & LOG_FLAG_ERROR)\n#define LOG_WARN     (LOG_LEVEL_DEF & LOG_FLAG_WARN)\n#define LOG_INFO     (LOG_LEVEL_DEF & LOG_FLAG_INFO)\n#define LOG_DEBUG    (LOG_LEVEL_DEF & LOG_FLAG_DEBUG)\n#define LOG_VERBOSE  (LOG_LEVEL_DEF & LOG_FLAG_VERBOSE)\n\n#define LOG_ASYNC_ENABLED YES\n\n#define LOG_ASYNC_ERROR    ( NO && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_WARN     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_INFO     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_DEBUG    (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_VERBOSE  (YES && LOG_ASYNC_ENABLED)\n\n#define DDLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogDebug(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define DDLogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogCDebug(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n/**\n * The THIS_FILE macro gives you an NSString of the file name.\n * For simplicity and clarity, the file name does not include the full path or file extension.\n * \n * For example: DDLogWarn(@\"%@: Unable to find thingy\", THIS_FILE) -> @\"MyViewController: Unable to find thingy\"\n**/\n\nNSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy);\n\n#define THIS_FILE (DDExtractFileNameWithoutExtension(__FILE__, NO))\n\n/**\n * The THIS_METHOD macro gives you the name of the current objective-c method.\n * \n * For example: DDLogWarn(@\"%@ - Requires non-nil strings\", THIS_METHOD) -> @\"setMake:model: requires non-nil strings\"\n * \n * Note: This does NOT work in straight C functions (non objective-c).\n * Instead you should use the predefined __FUNCTION__ macro.\n**/\n\n#define THIS_METHOD NSStringFromSelector(_cmd)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDLog : NSObject\n\n/**\n * Provides access to the underlying logging queue.\n * This may be helpful to Logger classes for things like thread synchronization.\n**/\n\n+ (dispatch_queue_t)loggingQueue;\n\n/**\n * Logging Primitive.\n * \n * This method is used by the macros above.\n * It is suggested you stick with the macros as they're easier to use.\n**/\n\n+ (void)log:(BOOL)synchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format, ... __attribute__ ((format (__NSString__, 9, 10)));\n\n/**\n * Logging Primitive.\n * \n * This method can be used if you have a prepared va_list.\n**/\n\n+ (void)log:(BOOL)asynchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format\n       args:(va_list)argList;\n\n\n/**\n * Since logging can be asynchronous, there may be times when you want to flush the logs.\n * The framework invokes this automatically when the application quits.\n**/\n\n+ (void)flushLog;\n\n/** \n * Loggers\n * \n * If you want your log statements to go somewhere,\n * you should create and add a logger.\n**/\n\n+ (void)addLogger:(id <DDLogger>)logger;    // adds the logger using maximum log level (LOG_LEVEL_VERBOSE)\n\n/**\n * Please use as logLevels the LOG_LEVEL_* macros\n *\n**/\n+ (void)addLogger:(id <DDLogger>)logger withLogLevel:(int)logLevel;\n\n+ (void)removeLogger:(id <DDLogger>)logger;\n+ (void)removeAllLoggers;\n\n/**\n * Registered Dynamic Logging\n * \n * These methods allow you to obtain a list of classes that are using registered dynamic logging,\n * and also provides methods to get and set their log level during run time.\n**/\n\n+ (NSArray *)registeredClasses;\n+ (NSArray *)registeredClassNames;\n\n+ (int)logLevelForClass:(Class)aClass;\n+ (int)logLevelForClassWithName:(NSString *)aClassName;\n\n+ (void)setLogLevel:(int)logLevel forClass:(Class)aClass;\n+ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogger <NSObject>\n@required\n\n- (void)logMessage:(DDLogMessage *)logMessage;\n\n/**\n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n**/\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@optional\n\n/**\n * Since logging is asynchronous, adding and removing loggers is also asynchronous.\n * In other words, the loggers are added and removed at appropriate times with regards to log messages.\n * \n * - Loggers will not receive log messages that were executed prior to when they were added.\n * - Loggers will not receive log messages that were executed after they were removed.\n * \n * These methods are executed in the logging thread/queue.\n * This is the same thread/queue that will execute every logMessage: invocation.\n * Loggers may use these methods for thread synchronization or other setup/teardown tasks.\n**/\n- (void)didAddLogger;\n- (void)willRemoveLogger;\n\n/**\n * Some loggers may buffer IO for optimization purposes.\n * For example, a database logger may only save occasionaly as the disk IO is slow.\n * In such loggers, this method should be implemented to flush any pending IO.\n * \n * This allows invocations of DDLog's flushLog method to be propogated to loggers that need it.\n * \n * Note that DDLog's flushLog method is invoked automatically when the application quits,\n * and it may be also invoked manually by the developer prior to application crashes, or other such reasons.\n**/\n- (void)flush;\n\n/**\n * Each logger is executed concurrently with respect to the other loggers.\n * Thus, a dedicated dispatch queue is used for each logger.\n * Logger implementations may optionally choose to provide their own dispatch queue.\n**/\n- (dispatch_queue_t)loggerQueue;\n\n/**\n * If the logger implementation does not choose to provide its own queue,\n * one will automatically be created for it.\n * The created queue will receive its name from this method.\n * This may be helpful for debugging or profiling reasons.\n**/\n- (NSString *)loggerName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogFormatter <NSObject>\n@required\n\n/**\n * Formatters may optionally be added to any logger.\n * This allows for increased flexibility in the logging environment.\n * For example, log messages for log files may be formatted differently than log messages for the console.\n * \n * For more information about formatters, see the \"Custom Formatters\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The formatter may also optionally filter the log message by returning nil,\n * in which case the logger will not log the message.\n**/\n- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;\n\n@optional\n\n/**\n * A single formatter instance can be added to multiple loggers.\n * These methods provides hooks to notify the formatter of when it's added/removed.\n *\n * This is primarily for thread-safety.\n * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers.\n * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter),\n * it could possibly use these hooks to switch to thread-safe versions of the code.\n**/\n- (void)didAddToLogger:(id <DDLogger>)logger;\n- (void)willRemoveFromLogger:(id <DDLogger>)logger;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDRegisteredDynamicLogging\n\n/**\n * Implement these methods to allow a file's log level to be managed from a central location.\n * \n * This is useful if you'd like to be able to change log levels for various parts\n * of your code from within the running application.\n * \n * Imagine pulling up the settings for your application,\n * and being able to configure the logging level on a per file basis.\n * \n * The implementation can be very straight-forward:\n * \n * + (int)ddLogLevel\n * {\n *     return ddLogLevel;\n * }\n *  \n * + (void)ddSetLogLevel:(int)logLevel\n * {\n *     ddLogLevel = logLevel;\n * }\n**/\n\n+ (int)ddLogLevel;\n+ (void)ddSetLogLevel:(int)logLevel;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogMessage class encapsulates information about the log message.\n * If you write custom loggers or formatters, you will be dealing with objects of this class.\n**/\n\nenum {\n    DDLogMessageCopyFile     = 1 << 0,\n    DDLogMessageCopyFunction = 1 << 1\n};\ntypedef int DDLogMessageOptions;\n\n@interface DDLogMessage : NSObject <NSCopying>\n{\n\n// The public variables below can be accessed directly (for speed).\n// For example: logMessage->logLevel\n    \n@public\n    int logLevel;\n    int logFlag;\n    int logContext;\n    NSString *logMsg;\n    NSDate *timestamp;\n    char *file;\n    char *function;\n    int lineNumber;\n    mach_port_t machThreadID;\n    char *queueLabel;\n    NSString *threadName;\n    \n    // For 3rd party extensions to the framework, where flags and contexts aren't enough.\n    id tag;\n    \n    // For 3rd party extensions that manually create DDLogMessage instances.\n    DDLogMessageOptions options;\n}\n\n/**\n * Standard init method for a log message object.\n * Used by the logging primitives. (And the macros use the logging primitives.)\n * \n * If you find need to manually create logMessage objects, there is one thing you should be aware of:\n * \n * If no flags are passed, the method expects the file and function parameters to be string literals.\n * That is, it expects the given strings to exist for the duration of the object's lifetime,\n * and it expects the given strings to be immutable.\n * In other words, it does not copy these strings, it simply points to them.\n * This is due to the fact that __FILE__ and __FUNCTION__ are usually used to specify these parameters,\n * so it makes sense to optimize and skip the unnecessary allocations.\n * However, if you need them to be copied you may use the options parameter to specify this.\n * Options is a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction.\n**/\n- (instancetype)initWithLogMsg:(NSString *)logMsg\n                         level:(int)logLevel\n                          flag:(int)logFlag\n                       context:(int)logContext\n                          file:(const char *)file\n                      function:(const char *)function\n                          line:(int)line\n                           tag:(id)tag\n                       options:(DDLogMessageOptions)optionsMask;\n\n/**\n * Returns the threadID as it appears in NSLog.\n * That is, it is a hexadecimal value which is calculated from the machThreadID.\n**/\n- (NSString *)threadID;\n\n/**\n * Convenience property to get just the file name, as the file variable is generally the full file path.\n * This method does not include the file extension, which is generally unwanted for logging purposes.\n**/\n- (NSString *)fileName;\n\n/**\n * Returns the function variable in NSString form.\n**/\n- (NSString *)methodName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogger protocol specifies that an optional formatter can be added to a logger.\n * Most (but not all) loggers will want to support formatters.\n * \n * However, writting getters and setters in a thread safe manner,\n * while still maintaining maximum speed for the logging process, is a difficult task.\n * \n * To do it right, the implementation of the getter/setter has strict requiremenets:\n * - Must NOT require the logMessage method to acquire a lock.\n * - Must NOT require the logMessage method to access an atomic property (also a lock of sorts).\n * \n * To simplify things, an abstract logger is provided that implements the getter and setter.\n * \n * Logger implementations may simply extend this class,\n * and they can ACCESS THE FORMATTER VARIABLE DIRECTLY from within their logMessage method!\n**/\n\n@interface DDAbstractLogger : NSObject <DDLogger>\n{\n    id <DDLogFormatter> formatter;\n    \n    dispatch_queue_t loggerQueue;\n}\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n// For thread-safety assertions\n- (BOOL)isOnGlobalLoggingQueue;\n- (BOOL)isOnInternalLoggerQueue;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/DDTTYLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#if TARGET_OS_IPHONE\n#import <UIKit/UIColor.h>   // iOS\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n#import <AppKit/NSColor.h>  // OS X with AppKit\n#else\n#import \"CLIColor.h\"        // OS X without AppKit\n#endif\n\n#import \"DDLog.h\"\n\n#define LOG_CONTEXT_ALL INT_MAX\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for Terminal output or Xcode console output,\n * depending on where you are running your code.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log (so it shows up in Console.app)\n * - StdErr (if stderr is a TTY, so log statements show up in Xcode console)\n * \n * To duplicate NSLog() functionality you can simply add this logger and an asl logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use only a file logger and a tty logger.\n**/\n\n@interface DDTTYLogger : DDAbstractLogger <DDLogger>\n{\n    NSCalendar *calendar;\n    NSUInteger calendarUnitFlags;\n    \n    NSString *appName;\n    char *app;\n    size_t appLen;\n    \n    NSString *processID;\n    char *pid;\n    size_t pidLen;\n    \n    BOOL colorsEnabled;\n    NSMutableArray *colorProfilesArray;\n    NSMutableDictionary *colorProfilesDict;\n}\n\n+ (instancetype)sharedInstance;\n\n/* Inherited from the DDLogger protocol:\n * \n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n * \n * More information about formatters can be found here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The actual implementation of these methods is inherited from DDAbstractLogger.\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n \n*/\n\n/**\n * Want to use different colors for different log levels?\n * Enable this property.\n * \n * If you run the application via the Terminal (not Xcode),\n * the logger will map colors to xterm-256color or xterm-color (if available).\n * \n * Xcode does NOT natively support colors in the Xcode debugging console.\n * You'll need to install the XcodeColors plugin to see colors in the Xcode console.\n * https://github.com/robbiehanson/XcodeColors\n * \n * The default value if NO.\n**/\n@property (readwrite, assign) BOOL colorsEnabled;\n\n/**\n * The default color set (foregroundColor, backgroundColor) is:\n * \n * - LOG_FLAG_ERROR = (red, nil)\n * - LOG_FLAG_WARN  = (orange, nil)\n * \n * You can customize the colors however you see fit.\n * Please note that you are passing a flag, NOT a level.\n * \n * GOOD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_FLAG_INFO];  // <- Good :)\n *  BAD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_LEVEL_INFO]; // <- BAD! :(\n * \n * LOG_FLAG_INFO  = 0...00100\n * LOG_LEVEL_INFO = 0...00111 <- Would match LOG_FLAG_INFO and LOG_FLAG_WARN and LOG_FLAG_ERROR\n * \n * If you run the application within Xcode, then the XcodeColors plugin is required.\n * \n * If you run the application from a shell, then DDTTYLogger will automatically map the given color to\n * the closest available color. (xterm-256color or xterm-color which have 256 and 16 supported colors respectively.)\n * \n * This method invokes setForegroundColor:backgroundColor:forFlag:context: and applies it to `LOG_CONTEXT_ALL`.\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask;\n#endif\n\n/**\n * Just like setForegroundColor:backgroundColor:flag, but allows you to specify a particular logging context.\n * \n * A logging context is often used to identify log messages coming from a 3rd party framework,\n * although logging context's can be used for many different functions.\n * \n * Use LOG_CONTEXT_ALL to set the deafult color for all contexts that have no specific color set defined.\n * \n * Logging context's are explained in further detail here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomContext\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#endif\n\n/**\n * Similar to the methods above, but allows you to map DDLogMessage->tag to a particular color profile.\n * For example, you could do something like this:\n * \n * static NSString *const PurpleTag = @\"PurpleTag\";\n * \n * #define DDLogPurple(frmt, ...) LOG_OBJC_TAG_MACRO(NO, 0, 0, 0, PurpleTag, frmt, ##__VA_ARGS__)\n * \n * And then in your applicationDidFinishLaunching, or wherever you configure Lumberjack:\n * \n * #if TARGET_OS_IPHONE\n *   UIColor *purple = [UIColor colorWithRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n * #else\n *   NSColor *purple = [NSColor colorWithCalibratedRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n *\n * Note: For CLI OS X projects that don't link with AppKit use CLIColor objects instead\n * \n * [[DDTTYLogger sharedInstance] setForegroundColor:purple backgroundColor:nil forTag:PurpleTag];\n * [DDLog addLogger:[DDTTYLogger sharedInstance]];\n * \n * This would essentially give you a straight NSLog replacement that prints in purple:\n * \n * DDLogPurple(@\"I'm a purple log message!\");\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forTag:(id <NSCopying>)tag;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forTag:(id <NSCopying>)tag;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forTag:(id <NSCopying>)tag;\n#endif\n\n/**\n * Clearing color profiles.\n**/\n- (void)clearColorsForFlag:(int)mask;\n- (void)clearColorsForFlag:(int)mask context:(int)context;\n- (void)clearColorsForTag:(id <NSCopying>)tag;\n- (void)clearColorsForAllFlags;\n- (void)clearColorsForAllTags;\n- (void)clearAllColors;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/NSJSONSerialization+ObjectWithNString.h",
    "content": "//\n//  NSJSONSerialization+ObjectWithNString.h\n//  Ejecta\n//\n//  Created by matth on 7/19/13.\n//\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (ObjectWithNString)\n+ (id)JSONObjectWithString:(NSString *)string options:(NSJSONReadingOptions)opt error:(NSError **)error;\n+ (NSString*)stringWithNSDictionary:(NSDictionary*)dictionary;\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/NSJSONSerialization+PBJSONHelpers.h",
    "content": "//\n//  NSJSONSerialization+PBJSONHelpers.h\n//  PebbleVendor\n//\n//  Created by matth on 9/17/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (PBJSONHelpers)\n\n/** @name Reflection helpers */\n\n/**\n * Derived from the Box SDK (MIT license) NSJSONSerialization+BoxAdditions...\n * https://github.com/box/box-ios-sdk-v2/tree/master/BoxSDK/Categories\n \n * Ensure that the object at `key` in `dictionary` is a member of the expected class.\n * `NSNull` may be specified as an allowable value. This method may return nil if `key`\n * is not present in `dictionary`.\n *\n * @param key The key to lookup in `dictionary`.\n * @param dictionary A dictionary resulting from deserializing a JSON object.\n * @param cls The expected class of the value at key.\n * @param nullAllowed If true, `NSNull` will be returned. If not, NSNull will be converted to nil. Property getters that pass `YES` for this parameter should have the return type of `id`.\n *\n * @return The object at `key` in `dictionary` if expectations are satisfied; `nil` otherwise.\n */\n+ (id)ensureObjectForKey:(NSString *)key inDictionary:(NSDictionary *)dictionary hasExpectedType:(Class)cls nullAllowed:(BOOL)nullAllowed;\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/NSString+HexData.h",
    "content": "//\n//  NSString+HexData.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 11/19/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSString (HexData)\n\n- (NSData*)hexData;\n\n@end\n\n\n@interface NSData (HexString)\n\n- (NSString*)hexString;\n\n@end"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/UIDevice-Hardware.h",
    "content": "/*\n Erica Sadun, http://ericasadun.com\n iPhone Developer's Cookbook, 6.x Edition\n BSD License, Use at your own risk\n */\n\n#import <UIKit/UIKit.h>\n\ntypedef enum {\n    UIDeviceFamilyiPhone,\n    UIDeviceFamilyiPod,\n    UIDeviceFamilyiPad,\n    UIDeviceFamilyAppleTV,\n    UIDeviceFamilyUnknown,\n    \n} UIDeviceFamily;\n\n@interface UIDevice (Hardware)\n- (NSString *) platform;\n- (NSString *) hwmodel;\n- (NSString *) platformString;\n\n- (NSUInteger) cpuFrequency;\n- (NSUInteger) busFrequency;\n- (NSUInteger) cpuCount;\n- (NSUInteger) totalMemory;\n- (NSUInteger) userMemory;\n\n- (NSNumber *) totalDiskSpace;\n- (NSNumber *) freeDiskSpace;\n\n- (NSString *) macaddress;\n\n- (BOOL) hasRetinaDisplay;\n- (BOOL) hasBluetoothMAP;\n- (UIDeviceFamily) deviceFamily;\n@end"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/CHMultiDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMultiDictionary.h\n \n Copyright (c) 2008-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n#import \"CHMutableDictionary.h\"\n\n/**\n @file CHMultiDictionary.h\n \n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> in which multiple values may be associated with a given key.\n */\n\n/**\n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> implementation, in which multiple values may be associated with a given key.\n \n A map is the same as a \"dictionary\", \"associative array\", etc. and consists of a unique set of keys and a collection of values. In a standard map, each key is associated with one value; in a multimap, more than one value may be associated with a given key. A multimap is appropriate for any situation in which one item may correspond to (map to) multiple values, such as a term in an book index and occurrences of that term, courses for which a student is registered, etc.\n \n The values for a key may or may not be ordered. This implementation does not maintain an ordering for objects associated with a key, nor does it allow for multiple occurrences of an object associated with the same key. Internally, this class uses an NSMutableDictionary, and the associated values for each key are stored in distinct NSMutableSet instances. (Just as with NSDictionary, each key added to a CHMultiDictionary is copied using \\link NSCopying#copyWithZone: -copyWithZone:\\endlink and all keys must conform to the NSCopying protocol.) Objects are retained on insertion and released on removal or deallocation.\n \n Since NSDictionary and NSSet conform to the NSCoding protocol, any internal data can be serialized. However, NSSet cannot automatically be written to or read from a property list, since it has no specified order. Thus, instances of CHMultiDictionary must be encoded as an NSData object before saving to disk.\n \n Currently, this implementation does not support key-value coding, observing, or binding like NSDictionary does. Consequently, the distinction between \"object\" and \"value\" is blurrier, although hopefully consistent with the Cocoa APIs in general....\n \n Unlike NSDictionary and other Cocoa collections, CHMultiDictionary has not been designed with mutable and immutable variants. A multimap is not that much more useful if it is immutable, so any copies made of this class are mutable by definition.\n */\n@interface CHMultiDictionary : CHMutableDictionary {\n\tNSUInteger objectCount; // Number of objects currently in the dictionary.\n}\n\n#pragma mark Querying Contents\n\n/**\n Returns the number of objects in the receiver, associated with any key.\n \n @return The number of objects in the receiver. This is the sum total of objects associated with each key in the dictonary.\n \n @see allObjects\n */\n- (NSUInteger) countForAllKeys;\n\n/**\n Returns the number of objects associated with a given key.\n \n @param aKey The key for which to return the object count.\n @return The number of objects associated with a given key in the dictionary.\n \n @see objectsForKey:\n */\n- (NSUInteger) countForKey:(id)aKey;\n\n/**\n Returns an array of objects associated with a given key.\n \n @param aKey The key for which to return the corresponding objects.\n @return An NSSet of objects associated with a given key, or nil if the key is not in the receiver.\n \n @see countForKey:\n @see removeObjectsForKey:\n */\n- (NSSet*) objectsForKey:(id)aKey;\n\n#pragma mark Modifying Contents\n\n/**\n Adds a given object to an entry for a given key in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param anObject An object to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#addObject: -[NSMutableSet addObject:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObject:(id)anObject forKey:(id)aKey;\n\n/**\n Adds the given object(s) to a key entry in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param objectSet A set of objects to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#unionSet: -[NSMutableSet unionSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n/**\n Remove @b all occurrences of @a anObject associated with a given key.\n \n @param aKey The key for which to remove an entry.\n @param anObject An object (possibly) associated with @a aKey in the receiver. Objects are considered to be equal if -compare: returns NSOrderedSame.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n If @a aKey does not exist in the receiver, or if @a anObject is not associated with @a aKey, the contents of the receiver are not modified.\n \n @see containsObject\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) removeObject:(id)anObject forKey:(id)aKey;\n\n/**\n Remove a given key and its associated value(s) from the receiver.\n \n @param aKey The key for which to remove an entry.\n \n If @a aKey does not exist in the receiver, there is no effect on the receiver.\n \n @see objectsForKey:\n @see removeObject:forKey:\n */\n- (void) removeObjectsForKey:(id)aKey;\n\n/**\n Sets the object(s) associated with a key entry in the receiver.\n \n @param aKey The key with which to associate the objects in @a objectSet.\n @param objectSet A set of objects to associate with @a key. If @a objectSet is empty, the contents of the receiver are not modified. If an entry for @a key already exists in the receiver, @a objectSet is added using \\link NSMutableSet#setSet: -[NSMutableSet setSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) setObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/CHMutableDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMutableDictionary.h\n \n Copyright (c) 2009-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n__attribute__((visibility(\"hidden\"))) void createCollectableCFMutableDictionary(CFMutableDictionaryRef* dictionary, NSUInteger initialCapacity);\n\n/**\n @file CHMutableDictionary.h\n \n A mutable dictionary class.\n */\n\n/**\n A mutable dictionary class.\n \n A CFMutableDictionaryRef is used internally to store the key-value pairs. Subclasses may choose to add other instance variables to enable a specific ordering of keys, override methods to modify behavior, and add methods to extend existing behaviors. However, all subclasses should behave like a standard Cocoa dictionary as much as possible, and document clearly when they do not.\n \n @note Any method inherited from NSDictionary or NSMutableDictionary is supported by this class and its children. Please see the documentation for those classes for details.\n \n @todo Implement @c -copy and @c -mutableCopy differently (so users can actually obtain an immutable copy) and make mutation methods aware of immutability?\n */\n@interface CHMutableDictionary : NSMutableDictionary {\n  CFMutableDictionaryRef dictionary; // A Core Foundation dictionary.\n}\n\n- (id) initWithCapacity:(NSUInteger)numItems;\n\n- (NSUInteger) count;\n- (NSEnumerator*) keyEnumerator;\n- (id) objectForKey:(id)aKey;\n- (void) removeAllObjects;\n- (void) removeObjectForKey:(id)aKey;\n- (void) setObject:(id)anObject forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/DDASLLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import <asl.h>\n\n#import \"DDLog.h\"\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for the Apple System Log facility.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log\n * - StdErr (if stderr is a TTY) so log statements show up in Xcode console\n * \n * To duplicate NSLog() functionality you can simply add this logger and a tty logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use a file logger and a tty logger.\n**/\n\n@interface DDASLLogger : DDAbstractLogger <DDLogger>\n{\n    aslclient client;\n}\n\n+ (instancetype)sharedInstance;\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/DDFileLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"DDLog.h\"\n\n@class DDLogFileInfo;\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger to write log statements to a file.\n**/\n\n\n// Default configuration and safety/sanity values.\n// \n// maximumFileSize         -> DEFAULT_LOG_MAX_FILE_SIZE\n// rollingFrequency        -> DEFAULT_LOG_ROLLING_FREQUENCY\n// maximumNumberOfLogFiles -> DEFAULT_LOG_MAX_NUM_LOG_FILES\n// \n// You should carefully consider the proper configuration values for your application.\n\n#define DEFAULT_LOG_MAX_FILE_SIZE     (1024 * 1024)   //  1 MB\n#define DEFAULT_LOG_ROLLING_FREQUENCY (60 * 60 * 24)  // 24 Hours\n#define DEFAULT_LOG_MAX_NUM_LOG_FILES (5)             //  5 Files\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// The LogFileManager protocol is designed to allow you to control all aspects of your log files.\n// \n// The primary purpose of this is to allow you to do something with the log files after they have been rolled.\n// Perhaps you want to compress them to save disk space.\n// Perhaps you want to upload them to an FTP server.\n// Perhaps you want to run some analytics on the file.\n// \n// A default LogFileManager is, of course, provided.\n// The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property.\n// \n// This protocol provides various methods to fetch the list of log files.\n// \n// There are two variants: sorted and unsorted.\n// If sorting is not necessary, the unsorted variant is obviously faster.\n// The sorted variant will return an array sorted by when the log files were created,\n// with the most recently created log file at index 0, and the oldest log file at the end of the array.\n// \n// You can fetch only the log file paths (full path including name), log file names (name only),\n// or an array of DDLogFileInfo objects.\n// The DDLogFileInfo class is documented below, and provides a handy wrapper that\n// gives you easy access to various file attributes such as the creation date or the file size.\n\n@protocol DDLogFileManager <NSObject>\n@required\n\n// Public properties\n\n/**\n * The maximum number of archived log files to keep on disk.\n * For example, if this property is set to 3,\n * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk.\n * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted.\n * \n * You may optionally disable deleting old/rolled/archived log files by setting this property to zero.\n**/\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n// Public methods\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n// Private methods (only to be used by DDFileLogger)\n\n- (NSString *)createNewLogFile;\n\n@optional\n\n// Notifications from DDFileLogger\n\n- (void)didArchiveLogFile:(NSString *)logFilePath;\n- (void)didRollAndArchiveLogFile:(NSString *)logFilePath;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Default log file manager.\n * \n * All log files are placed inside the logsDirectory.\n * If a specific logsDirectory isn't specified, the default directory is used.\n * On Mac, this is in ~/Library/Logs/<Application Name>.\n * On iPhone, this is in ~/Library/Caches/Logs.\n * \n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n * \n * Archived log files are automatically deleted according to the maximumNumberOfLogFiles property.\n**/\n@interface DDLogFileManagerDefault : NSObject <DDLogFileManager>\n{\n    NSUInteger maximumNumberOfLogFiles;\n    NSString *_logsDirectory;\n}\n\n- (id)init;\n- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory;\n\n/*\n * Methods to override.\n *\n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n *\n * If you wish to change default filename, you can override following two methods.\n * - newLogFileName method would be called on new logfile creation.\n * - isLogFile: method would be called to filter logfiles from all other files in logsDirectory.\n *   You have to parse given filename and return YES if it is logFile.\n *\n * **NOTE**\n * newLogFileName returns filename. If appropriate file already exists, number would be added\n * to filename before extension. You have to handle this case in isLogFile: method.\n *\n * Example:\n * - newLogFileName returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 2.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03 1.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 3.log\" would be created.\n**/\n- (NSString *)newLogFileName;\n- (BOOL)isLogFile:(NSString *)fileName;\n\n/* Inherited from DDLogFileManager protocol:\n\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n*/\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Most users will want file log messages to be prepended with the date and time.\n * Rather than forcing the majority of users to write their own formatter,\n * we will supply a logical default formatter.\n * Users can easily replace this formatter with their own by invoking the setLogFormatter method.\n * It can also be removed by calling setLogFormatter, and passing a nil parameter.\n * \n * In addition to the convenience of having a logical default formatter,\n * it will also provide a template that makes it easy for developers to copy and change.\n**/\n@interface DDLogFileFormatterDefault : NSObject <DDLogFormatter>\n{\n    NSDateFormatter *dateFormatter;\n}\n\n- (id)init;\n- (instancetype)initWithDateFormatter:(NSDateFormatter *)dateFormatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDFileLogger : DDAbstractLogger <DDLogger>\n{\n    __strong id <DDLogFileManager> logFileManager;\n    \n    DDLogFileInfo *currentLogFileInfo;\n    NSFileHandle *currentLogFileHandle;\n    \n    dispatch_source_t currentLogFileVnode;\n    dispatch_source_t rollingTimer;\n    \n    unsigned long long maximumFileSize;\n    NSTimeInterval rollingFrequency;\n}\n\n- (id)init;\n- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)logFileManager;\n\n/**\n * Log File Rolling:\n * \n * maximumFileSize:\n *   The approximate maximum size to allow log files to grow.\n *   If a log file is larger than this value after a log statement is appended,\n *   then the log file is rolled.\n * \n * rollingFrequency\n *   How often to roll the log file.\n *   The frequency is given as an NSTimeInterval, which is a double that specifies the interval in seconds.\n *   Once the log file gets to be this old, it is rolled.\n * \n * Both the maximumFileSize and the rollingFrequency are used to manage rolling.\n * Whichever occurs first will cause the log file to be rolled.\n * \n * For example:\n * The rollingFrequency is 24 hours,\n * but the log file surpasses the maximumFileSize after only 20 hours.\n * The log file will be rolled at that 20 hour mark.\n * A new log file will be created, and the 24 hour timer will be restarted.\n * \n * You may optionally disable rolling due to filesize by setting maximumFileSize to zero.\n * If you do so, rolling is based solely on rollingFrequency.\n * \n * You may optionally disable rolling due to time by setting rollingFrequency to zero (or any non-positive number).\n * If you do so, rolling is based solely on maximumFileSize.\n * \n * If you disable both maximumFileSize and rollingFrequency, then the log file won't ever be rolled.\n * This is strongly discouraged.\n**/\n@property (readwrite, assign) unsigned long long maximumFileSize;\n@property (readwrite, assign) NSTimeInterval rollingFrequency;\n\n/**\n * The DDLogFileManager instance can be used to retrieve the list of log files,\n * and configure the maximum number of archived log files to keep.\n * \n * @see DDLogFileManager.maximumNumberOfLogFiles\n**/\n@property (strong, nonatomic, readonly) id <DDLogFileManager> logFileManager;\n\n\n// You can optionally force the current log file to be rolled with this method.\n// CompletionBlock will be called on main queue.\n\n- (void)rollLogFileWithCompletionBlock:(void (^)())completionBlock;\n\n// Method is deprecated. Use rollLogFileWithCompletionBlock: method instead.\n\n- (void)rollLogFile __attribute((deprecated));\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * DDLogFileInfo is a simple class that provides access to various file attributes.\n * It provides good performance as it only fetches the information if requested,\n * and it caches the information to prevent duplicate fetches.\n * \n * It was designed to provide quick snapshots of the current state of log files,\n * and to help sort log files in an array.\n * \n * This class does not monitor the files, or update it's cached attribute values if the file changes on disk.\n * This is not what the class was designed for.\n * \n * If you absolutely must get updated values,\n * you can invoke the reset method which will clear the cache.\n**/\n@interface DDLogFileInfo : NSObject\n{\n    __strong NSString *filePath;\n    __strong NSString *fileName;\n    \n    __strong NSDictionary *fileAttributes;\n    \n    __strong NSDate *creationDate;\n    __strong NSDate *modificationDate;\n    \n    unsigned long long fileSize;\n}\n\n@property (strong, nonatomic, readonly) NSString *filePath;\n@property (strong, nonatomic, readonly) NSString *fileName;\n\n@property (strong, nonatomic, readonly) NSDictionary *fileAttributes;\n\n@property (strong, nonatomic, readonly) NSDate *creationDate;\n@property (strong, nonatomic, readonly) NSDate *modificationDate;\n\n@property (nonatomic, readonly) unsigned long long fileSize;\n\n@property (nonatomic, readonly) NSTimeInterval age;\n\n@property (nonatomic, readwrite) BOOL isArchived;\n\n+ (instancetype)logFileWithPath:(NSString *)filePath;\n\n- (instancetype)initWithFilePath:(NSString *)filePath;\n\n- (void)reset;\n- (void)renameFile:(NSString *)newFileName;\n\n#if TARGET_IPHONE_SIMULATOR\n\n// So here's the situation.\n// Extended attributes are perfect for what we're trying to do here (marking files as archived).\n// This is exactly what extended attributes were designed for.\n// \n// But Apple screws us over on the simulator.\n// Everytime you build-and-go, they copy the application into a new folder on the hard drive,\n// and as part of the process they strip extended attributes from our log files.\n// Normally, a copy of a file preserves extended attributes.\n// So obviously Apple has gone to great lengths to piss us off.\n// \n// Thus we use a slightly different tactic for marking log files as archived in the simulator.\n// That way it \"just works\" and there's no confusion when testing.\n// \n// The difference in method names is indicative of the difference in functionality.\n// On the simulator we add an attribute by appending a filename extension.\n// \n// For example:\n// log-ABC123.txt -> log-ABC123.archived.txt\n\n- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName;\n\n- (void)addExtensionAttributeWithName:(NSString *)attrName;\n- (void)removeExtensionAttributeWithName:(NSString *)attrName;\n\n#else\n\n// Normal use of extended attributes used everywhere else,\n// such as on Macs and on iPhone devices.\n\n- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName;\n\n- (void)addExtendedAttributeWithName:(NSString *)attrName;\n- (void)removeExtendedAttributeWithName:(NSString *)attrName;\n\n#endif\n\n- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another;\n- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/DDLog.h",
    "content": "#import <Foundation/Foundation.h>\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * Otherwise, here is a quick refresher.\n * There are three steps to using the macros:\n * \n * Step 1:\n * Import the header in your implementation file:\n * \n * #import \"DDLog.h\"\n * \n * Step 2:\n * Define your logging level in your implementation file:\n * \n * // Log levels: off, error, warn, info, verbose\n * static const int ddLogLevel = LOG_LEVEL_VERBOSE;\n * \n * Step 2 [3rd party frameworks]:\n *\n * Define your LOG_LEVEL_DEF to a different variable/function than ddLogLevel:\n *\n * // #undef LOG_LEVEL_DEF // Undefine first only if needed\n * #define LOG_LEVEL_DEF myLibLogLevel\n *\n * Define your logging level in your implementation file:\n *\n * // Log levels: off, error, warn, info, verbose\n * static const int myLibLogLevel = LOG_LEVEL_VERBOSE;\n *\n * Step 3:\n * Replace your NSLog statements with DDLog statements according to the severity of the message.\n * \n * NSLog(@\"Fatal error, no dohickey found!\"); -> DDLogError(@\"Fatal error, no dohickey found!\");\n * \n * DDLog works exactly the same as NSLog.\n * This means you can pass it multiple variables just like NSLog.\n**/\n\n#ifndef LOG_LEVEL_DEF\n    #define LOG_LEVEL_DEF ddLogLevel\n#endif\n\n@class DDLogMessage;\n\n@protocol DDLogger;\n@protocol DDLogFormatter;\n\n/**\n * This is the single macro that all other macros below compile into.\n * This big multiline macro makes all the other macros easier to read.\n**/\n\n#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \\\n  [DDLog log:isAsynchronous                                             \\\n       level:lvl                                                        \\\n        flag:flg                                                        \\\n     context:ctx                                                        \\\n        file:__FILE__                                                   \\\n    function:fnct                                                       \\\n        line:__LINE__                                                   \\\n         tag:atag                                                       \\\n      format:(frmt), ##__VA_ARGS__]\n\n/**\n * Define the Objective-C and C versions of the macro.\n * These automatically inject the proper function name for either an objective-c method or c function.\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_OBJC_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MACRO(async, lvl, flg, ctx, nil, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MACRO(async, lvl, flg, ctx, nil, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define version of the macro that only execute if the logLevel is above the threshold.\n * The compiled versions essentially look like this:\n * \n * if (logFlagForThisLogMsg & ddLogLevel) { execute log message }\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels.\n * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques.\n * \n * Note that when compiler optimizations are enabled (as they are for your release builds),\n * the log messages above your logging threshold will automatically be compiled out.\n * \n * (If the compiler sees ddLogLevel declared as a constant, the compiler simply checks to see if the 'if' statement\n *  would execute, and if not it strips it from the binary.)\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define versions of the macros that also accept tags.\n * \n * The DDLogMessage object includes a 'tag' ivar that may be used for a variety of purposes.\n * It may be used to pass custom information to loggers or formatters.\n * Or it may be used by 3rd party extensions to the framework.\n * \n * Thes macros just make it a little easier to extend logging functionality.\n**/\n\n#define LOG_OBJC_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n                 LOG_MACRO(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n              LOG_MACRO(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n             LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n          LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n/**\n * Define the standard options.\n * \n * We default to only 4 levels because it makes it easier for beginners\n * to make the transition to a logging framework.\n * \n * More advanced users may choose to completely customize the levels (and level names) to suite their needs.\n * For more information on this see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n * \n * Advanced users may also notice that we're using a bitmask.\n * This is to allow for custom fine grained logging:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/FineGrainedLogging\n * \n * -- Flags --\n * \n * Typically you will use the LOG_LEVELS (see below), but the flags may be used directly in certain situations.\n * For example, say you have a lot of warning log messages, and you wanted to disable them.\n * However, you still needed to see your error and info log messages.\n * You could accomplish that with the following:\n * \n * static const int ddLogLevel = LOG_FLAG_ERROR | LOG_FLAG_INFO;\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * Flags may also be consulted when writing custom log formatters,\n * as the DDLogMessage class captures the individual flag that caused the log message to fire.\n * \n * -- Levels --\n * \n * Log levels are simply the proper bitmask of the flags.\n * \n * -- Booleans --\n * \n * The booleans may be used when your logging code involves more than one line.\n * For example:\n * \n * if (LOG_VERBOSE) {\n *     for (id sprocket in sprockets)\n *         DDLogVerbose(@\"sprocket: %@\", [sprocket description])\n * }\n * \n * -- Async --\n * \n * Defines the default asynchronous options.\n * The default philosophy for asynchronous logging is very simple:\n * \n * Log messages with errors should be executed synchronously.\n *     After all, an error just occurred. The application could be unstable.\n * \n * All other log messages, such as debug output, are executed asynchronously.\n *     After all, if it wasn't an error, then it was just informational output,\n *     or something the application was easily able to recover from.\n * \n * -- Changes --\n * \n * You are strongly discouraged from modifying this file.\n * If you do, you make it more difficult on yourself to merge future bug fixes and improvements from the project.\n * Instead, create your own MyLogging.h or ApplicationNameLogging.h or CompanyLogging.h\n * \n * For an example of customizing your logging experience, see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n**/\n\n#define LOG_FLAG_ERROR    (1 << 0)  // 0...00001\n#define LOG_FLAG_WARN     (1 << 1)  // 0...00010\n#define LOG_FLAG_INFO     (1 << 2)  // 0...00100\n#define LOG_FLAG_DEBUG    (1 << 3)  // 0...01000\n#define LOG_FLAG_VERBOSE  (1 << 4)  // 0...10000\n\n#define LOG_LEVEL_OFF     0\n#define LOG_LEVEL_ERROR   (LOG_FLAG_ERROR)                                                                          // 0...00001\n#define LOG_LEVEL_WARN    (LOG_FLAG_ERROR | LOG_FLAG_WARN)                                                          // 0...00011\n#define LOG_LEVEL_INFO    (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO)                                          // 0...00111\n#define LOG_LEVEL_DEBUG   (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG)                         // 0...01111\n#define LOG_LEVEL_VERBOSE (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG | LOG_FLAG_VERBOSE)      // 0...11111\n\n#define LOG_ERROR    (LOG_LEVEL_DEF & LOG_FLAG_ERROR)\n#define LOG_WARN     (LOG_LEVEL_DEF & LOG_FLAG_WARN)\n#define LOG_INFO     (LOG_LEVEL_DEF & LOG_FLAG_INFO)\n#define LOG_DEBUG    (LOG_LEVEL_DEF & LOG_FLAG_DEBUG)\n#define LOG_VERBOSE  (LOG_LEVEL_DEF & LOG_FLAG_VERBOSE)\n\n#define LOG_ASYNC_ENABLED YES\n\n#define LOG_ASYNC_ERROR    ( NO && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_WARN     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_INFO     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_DEBUG    (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_VERBOSE  (YES && LOG_ASYNC_ENABLED)\n\n#define DDLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogDebug(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define DDLogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogCDebug(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n/**\n * The THIS_FILE macro gives you an NSString of the file name.\n * For simplicity and clarity, the file name does not include the full path or file extension.\n * \n * For example: DDLogWarn(@\"%@: Unable to find thingy\", THIS_FILE) -> @\"MyViewController: Unable to find thingy\"\n**/\n\nNSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy);\n\n#define THIS_FILE (DDExtractFileNameWithoutExtension(__FILE__, NO))\n\n/**\n * The THIS_METHOD macro gives you the name of the current objective-c method.\n * \n * For example: DDLogWarn(@\"%@ - Requires non-nil strings\", THIS_METHOD) -> @\"setMake:model: requires non-nil strings\"\n * \n * Note: This does NOT work in straight C functions (non objective-c).\n * Instead you should use the predefined __FUNCTION__ macro.\n**/\n\n#define THIS_METHOD NSStringFromSelector(_cmd)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDLog : NSObject\n\n/**\n * Provides access to the underlying logging queue.\n * This may be helpful to Logger classes for things like thread synchronization.\n**/\n\n+ (dispatch_queue_t)loggingQueue;\n\n/**\n * Logging Primitive.\n * \n * This method is used by the macros above.\n * It is suggested you stick with the macros as they're easier to use.\n**/\n\n+ (void)log:(BOOL)synchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format, ... __attribute__ ((format (__NSString__, 9, 10)));\n\n/**\n * Logging Primitive.\n * \n * This method can be used if you have a prepared va_list.\n**/\n\n+ (void)log:(BOOL)asynchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format\n       args:(va_list)argList;\n\n\n/**\n * Since logging can be asynchronous, there may be times when you want to flush the logs.\n * The framework invokes this automatically when the application quits.\n**/\n\n+ (void)flushLog;\n\n/** \n * Loggers\n * \n * If you want your log statements to go somewhere,\n * you should create and add a logger.\n**/\n\n+ (void)addLogger:(id <DDLogger>)logger;    // adds the logger using maximum log level (LOG_LEVEL_VERBOSE)\n\n/**\n * Please use as logLevels the LOG_LEVEL_* macros\n *\n**/\n+ (void)addLogger:(id <DDLogger>)logger withLogLevel:(int)logLevel;\n\n+ (void)removeLogger:(id <DDLogger>)logger;\n+ (void)removeAllLoggers;\n\n/**\n * Registered Dynamic Logging\n * \n * These methods allow you to obtain a list of classes that are using registered dynamic logging,\n * and also provides methods to get and set their log level during run time.\n**/\n\n+ (NSArray *)registeredClasses;\n+ (NSArray *)registeredClassNames;\n\n+ (int)logLevelForClass:(Class)aClass;\n+ (int)logLevelForClassWithName:(NSString *)aClassName;\n\n+ (void)setLogLevel:(int)logLevel forClass:(Class)aClass;\n+ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogger <NSObject>\n@required\n\n- (void)logMessage:(DDLogMessage *)logMessage;\n\n/**\n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n**/\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@optional\n\n/**\n * Since logging is asynchronous, adding and removing loggers is also asynchronous.\n * In other words, the loggers are added and removed at appropriate times with regards to log messages.\n * \n * - Loggers will not receive log messages that were executed prior to when they were added.\n * - Loggers will not receive log messages that were executed after they were removed.\n * \n * These methods are executed in the logging thread/queue.\n * This is the same thread/queue that will execute every logMessage: invocation.\n * Loggers may use these methods for thread synchronization or other setup/teardown tasks.\n**/\n- (void)didAddLogger;\n- (void)willRemoveLogger;\n\n/**\n * Some loggers may buffer IO for optimization purposes.\n * For example, a database logger may only save occasionaly as the disk IO is slow.\n * In such loggers, this method should be implemented to flush any pending IO.\n * \n * This allows invocations of DDLog's flushLog method to be propogated to loggers that need it.\n * \n * Note that DDLog's flushLog method is invoked automatically when the application quits,\n * and it may be also invoked manually by the developer prior to application crashes, or other such reasons.\n**/\n- (void)flush;\n\n/**\n * Each logger is executed concurrently with respect to the other loggers.\n * Thus, a dedicated dispatch queue is used for each logger.\n * Logger implementations may optionally choose to provide their own dispatch queue.\n**/\n- (dispatch_queue_t)loggerQueue;\n\n/**\n * If the logger implementation does not choose to provide its own queue,\n * one will automatically be created for it.\n * The created queue will receive its name from this method.\n * This may be helpful for debugging or profiling reasons.\n**/\n- (NSString *)loggerName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogFormatter <NSObject>\n@required\n\n/**\n * Formatters may optionally be added to any logger.\n * This allows for increased flexibility in the logging environment.\n * For example, log messages for log files may be formatted differently than log messages for the console.\n * \n * For more information about formatters, see the \"Custom Formatters\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The formatter may also optionally filter the log message by returning nil,\n * in which case the logger will not log the message.\n**/\n- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;\n\n@optional\n\n/**\n * A single formatter instance can be added to multiple loggers.\n * These methods provides hooks to notify the formatter of when it's added/removed.\n *\n * This is primarily for thread-safety.\n * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers.\n * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter),\n * it could possibly use these hooks to switch to thread-safe versions of the code.\n**/\n- (void)didAddToLogger:(id <DDLogger>)logger;\n- (void)willRemoveFromLogger:(id <DDLogger>)logger;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDRegisteredDynamicLogging\n\n/**\n * Implement these methods to allow a file's log level to be managed from a central location.\n * \n * This is useful if you'd like to be able to change log levels for various parts\n * of your code from within the running application.\n * \n * Imagine pulling up the settings for your application,\n * and being able to configure the logging level on a per file basis.\n * \n * The implementation can be very straight-forward:\n * \n * + (int)ddLogLevel\n * {\n *     return ddLogLevel;\n * }\n *  \n * + (void)ddSetLogLevel:(int)logLevel\n * {\n *     ddLogLevel = logLevel;\n * }\n**/\n\n+ (int)ddLogLevel;\n+ (void)ddSetLogLevel:(int)logLevel;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogMessage class encapsulates information about the log message.\n * If you write custom loggers or formatters, you will be dealing with objects of this class.\n**/\n\nenum {\n    DDLogMessageCopyFile     = 1 << 0,\n    DDLogMessageCopyFunction = 1 << 1\n};\ntypedef int DDLogMessageOptions;\n\n@interface DDLogMessage : NSObject <NSCopying>\n{\n\n// The public variables below can be accessed directly (for speed).\n// For example: logMessage->logLevel\n    \n@public\n    int logLevel;\n    int logFlag;\n    int logContext;\n    NSString *logMsg;\n    NSDate *timestamp;\n    char *file;\n    char *function;\n    int lineNumber;\n    mach_port_t machThreadID;\n    char *queueLabel;\n    NSString *threadName;\n    \n    // For 3rd party extensions to the framework, where flags and contexts aren't enough.\n    id tag;\n    \n    // For 3rd party extensions that manually create DDLogMessage instances.\n    DDLogMessageOptions options;\n}\n\n/**\n * Standard init method for a log message object.\n * Used by the logging primitives. (And the macros use the logging primitives.)\n * \n * If you find need to manually create logMessage objects, there is one thing you should be aware of:\n * \n * If no flags are passed, the method expects the file and function parameters to be string literals.\n * That is, it expects the given strings to exist for the duration of the object's lifetime,\n * and it expects the given strings to be immutable.\n * In other words, it does not copy these strings, it simply points to them.\n * This is due to the fact that __FILE__ and __FUNCTION__ are usually used to specify these parameters,\n * so it makes sense to optimize and skip the unnecessary allocations.\n * However, if you need them to be copied you may use the options parameter to specify this.\n * Options is a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction.\n**/\n- (instancetype)initWithLogMsg:(NSString *)logMsg\n                         level:(int)logLevel\n                          flag:(int)logFlag\n                       context:(int)logContext\n                          file:(const char *)file\n                      function:(const char *)function\n                          line:(int)line\n                           tag:(id)tag\n                       options:(DDLogMessageOptions)optionsMask;\n\n/**\n * Returns the threadID as it appears in NSLog.\n * That is, it is a hexadecimal value which is calculated from the machThreadID.\n**/\n- (NSString *)threadID;\n\n/**\n * Convenience property to get just the file name, as the file variable is generally the full file path.\n * This method does not include the file extension, which is generally unwanted for logging purposes.\n**/\n- (NSString *)fileName;\n\n/**\n * Returns the function variable in NSString form.\n**/\n- (NSString *)methodName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogger protocol specifies that an optional formatter can be added to a logger.\n * Most (but not all) loggers will want to support formatters.\n * \n * However, writting getters and setters in a thread safe manner,\n * while still maintaining maximum speed for the logging process, is a difficult task.\n * \n * To do it right, the implementation of the getter/setter has strict requiremenets:\n * - Must NOT require the logMessage method to acquire a lock.\n * - Must NOT require the logMessage method to access an atomic property (also a lock of sorts).\n * \n * To simplify things, an abstract logger is provided that implements the getter and setter.\n * \n * Logger implementations may simply extend this class,\n * and they can ACCESS THE FORMATTER VARIABLE DIRECTLY from within their logMessage method!\n**/\n\n@interface DDAbstractLogger : NSObject <DDLogger>\n{\n    id <DDLogFormatter> formatter;\n    \n    dispatch_queue_t loggerQueue;\n}\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n// For thread-safety assertions\n- (BOOL)isOnGlobalLoggingQueue;\n- (BOOL)isOnInternalLoggerQueue;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/DDTTYLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#if TARGET_OS_IPHONE\n#import <UIKit/UIColor.h>   // iOS\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n#import <AppKit/NSColor.h>  // OS X with AppKit\n#else\n#import \"CLIColor.h\"        // OS X without AppKit\n#endif\n\n#import \"DDLog.h\"\n\n#define LOG_CONTEXT_ALL INT_MAX\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for Terminal output or Xcode console output,\n * depending on where you are running your code.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log (so it shows up in Console.app)\n * - StdErr (if stderr is a TTY, so log statements show up in Xcode console)\n * \n * To duplicate NSLog() functionality you can simply add this logger and an asl logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use only a file logger and a tty logger.\n**/\n\n@interface DDTTYLogger : DDAbstractLogger <DDLogger>\n{\n    NSCalendar *calendar;\n    NSUInteger calendarUnitFlags;\n    \n    NSString *appName;\n    char *app;\n    size_t appLen;\n    \n    NSString *processID;\n    char *pid;\n    size_t pidLen;\n    \n    BOOL colorsEnabled;\n    NSMutableArray *colorProfilesArray;\n    NSMutableDictionary *colorProfilesDict;\n}\n\n+ (instancetype)sharedInstance;\n\n/* Inherited from the DDLogger protocol:\n * \n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n * \n * More information about formatters can be found here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The actual implementation of these methods is inherited from DDAbstractLogger.\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n \n*/\n\n/**\n * Want to use different colors for different log levels?\n * Enable this property.\n * \n * If you run the application via the Terminal (not Xcode),\n * the logger will map colors to xterm-256color or xterm-color (if available).\n * \n * Xcode does NOT natively support colors in the Xcode debugging console.\n * You'll need to install the XcodeColors plugin to see colors in the Xcode console.\n * https://github.com/robbiehanson/XcodeColors\n * \n * The default value if NO.\n**/\n@property (readwrite, assign) BOOL colorsEnabled;\n\n/**\n * The default color set (foregroundColor, backgroundColor) is:\n * \n * - LOG_FLAG_ERROR = (red, nil)\n * - LOG_FLAG_WARN  = (orange, nil)\n * \n * You can customize the colors however you see fit.\n * Please note that you are passing a flag, NOT a level.\n * \n * GOOD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_FLAG_INFO];  // <- Good :)\n *  BAD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_LEVEL_INFO]; // <- BAD! :(\n * \n * LOG_FLAG_INFO  = 0...00100\n * LOG_LEVEL_INFO = 0...00111 <- Would match LOG_FLAG_INFO and LOG_FLAG_WARN and LOG_FLAG_ERROR\n * \n * If you run the application within Xcode, then the XcodeColors plugin is required.\n * \n * If you run the application from a shell, then DDTTYLogger will automatically map the given color to\n * the closest available color. (xterm-256color or xterm-color which have 256 and 16 supported colors respectively.)\n * \n * This method invokes setForegroundColor:backgroundColor:forFlag:context: and applies it to `LOG_CONTEXT_ALL`.\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask;\n#endif\n\n/**\n * Just like setForegroundColor:backgroundColor:flag, but allows you to specify a particular logging context.\n * \n * A logging context is often used to identify log messages coming from a 3rd party framework,\n * although logging context's can be used for many different functions.\n * \n * Use LOG_CONTEXT_ALL to set the deafult color for all contexts that have no specific color set defined.\n * \n * Logging context's are explained in further detail here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomContext\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#endif\n\n/**\n * Similar to the methods above, but allows you to map DDLogMessage->tag to a particular color profile.\n * For example, you could do something like this:\n * \n * static NSString *const PurpleTag = @\"PurpleTag\";\n * \n * #define DDLogPurple(frmt, ...) LOG_OBJC_TAG_MACRO(NO, 0, 0, 0, PurpleTag, frmt, ##__VA_ARGS__)\n * \n * And then in your applicationDidFinishLaunching, or wherever you configure Lumberjack:\n * \n * #if TARGET_OS_IPHONE\n *   UIColor *purple = [UIColor colorWithRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n * #else\n *   NSColor *purple = [NSColor colorWithCalibratedRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n *\n * Note: For CLI OS X projects that don't link with AppKit use CLIColor objects instead\n * \n * [[DDTTYLogger sharedInstance] setForegroundColor:purple backgroundColor:nil forTag:PurpleTag];\n * [DDLog addLogger:[DDTTYLogger sharedInstance]];\n * \n * This would essentially give you a straight NSLog replacement that prints in purple:\n * \n * DDLogPurple(@\"I'm a purple log message!\");\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forTag:(id <NSCopying>)tag;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forTag:(id <NSCopying>)tag;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forTag:(id <NSCopying>)tag;\n#endif\n\n/**\n * Clearing color profiles.\n**/\n- (void)clearColorsForFlag:(int)mask;\n- (void)clearColorsForFlag:(int)mask context:(int)context;\n- (void)clearColorsForTag:(id <NSCopying>)tag;\n- (void)clearColorsForAllFlags;\n- (void)clearColorsForAllTags;\n- (void)clearAllColors;\n\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/NSJSONSerialization+ObjectWithNString.h",
    "content": "//\n//  NSJSONSerialization+ObjectWithNString.h\n//  Ejecta\n//\n//  Created by matth on 7/19/13.\n//\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (ObjectWithNString)\n+ (id)JSONObjectWithString:(NSString *)string options:(NSJSONReadingOptions)opt error:(NSError **)error;\n+ (NSString*)stringWithNSDictionary:(NSDictionary*)dictionary;\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/NSJSONSerialization+PBJSONHelpers.h",
    "content": "//\n//  NSJSONSerialization+PBJSONHelpers.h\n//  PebbleVendor\n//\n//  Created by matth on 9/17/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (PBJSONHelpers)\n\n/** @name Reflection helpers */\n\n/**\n * Derived from the Box SDK (MIT license) NSJSONSerialization+BoxAdditions...\n * https://github.com/box/box-ios-sdk-v2/tree/master/BoxSDK/Categories\n \n * Ensure that the object at `key` in `dictionary` is a member of the expected class.\n * `NSNull` may be specified as an allowable value. This method may return nil if `key`\n * is not present in `dictionary`.\n *\n * @param key The key to lookup in `dictionary`.\n * @param dictionary A dictionary resulting from deserializing a JSON object.\n * @param cls The expected class of the value at key.\n * @param nullAllowed If true, `NSNull` will be returned. If not, NSNull will be converted to nil. Property getters that pass `YES` for this parameter should have the return type of `id`.\n *\n * @return The object at `key` in `dictionary` if expectations are satisfied; `nil` otherwise.\n */\n+ (id)ensureObjectForKey:(NSString *)key inDictionary:(NSDictionary *)dictionary hasExpectedType:(Class)cls nullAllowed:(BOOL)nullAllowed;\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/NSString+HexData.h",
    "content": "//\n//  NSString+HexData.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 11/19/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSString (HexData)\n\n- (NSData*)hexData;\n\n@end\n\n\n@interface NSData (HexString)\n\n- (NSString*)hexString;\n\n@end"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/UIDevice-Hardware.h",
    "content": "/*\n Erica Sadun, http://ericasadun.com\n iPhone Developer's Cookbook, 6.x Edition\n BSD License, Use at your own risk\n */\n\n#import <UIKit/UIKit.h>\n\ntypedef enum {\n    UIDeviceFamilyiPhone,\n    UIDeviceFamilyiPod,\n    UIDeviceFamilyiPad,\n    UIDeviceFamilyAppleTV,\n    UIDeviceFamilyUnknown,\n    \n} UIDeviceFamily;\n\n@interface UIDevice (Hardware)\n- (NSString *) platform;\n- (NSString *) hwmodel;\n- (NSString *) platformString;\n\n- (NSUInteger) cpuFrequency;\n- (NSUInteger) busFrequency;\n- (NSUInteger) cpuCount;\n- (NSUInteger) totalMemory;\n- (NSUInteger) userMemory;\n\n- (NSNumber *) totalDiskSpace;\n- (NSNumber *) freeDiskSpace;\n\n- (NSString *) macaddress;\n\n- (BOOL) hasRetinaDisplay;\n- (BOOL) hasBluetoothMAP;\n- (UIDeviceFamily) deviceFamily;\n@end"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/PebbleKit/Readme.md",
    "content": "# PebbleKit iOS\n\nWelcome to Pebble's official iOS SDK!\n\n## Compatibility\n\n- iOS 5.0+\n- iPhone 3GS or later\n\n## Examples\n\nAll Pebble SDK examples are now grouped in Pebble SDK, please look into the `examples/` folder of your Pebble SDK for sample code.\n\n## Integrating PebbleKit using Cocoapods\n\n- Install [Cocoapods](http://www.cocoapods.org) or make sure it is up to date\n- Add a Podfile to your project if you don't have one already (Hint: use `pod init`).\n- Add this line to the Podfile: `pod 'PebbleKit', :path => \"/path/to/PebbleKit-iOS\"`\n- Run `pod install`\n\n## Integrating PebbleKit Manually\n\n- Drag PebbleKit.framework into project\n- Drag in PebbleVendor.framework into the project, or, drag the PebbleVendor.xcodeproj into project if you need to control the 3rd party components needed for PebbleKit.\n- Link ExternalAccessory.framework, libz.dylib, CoreBluetooth.framework, CoreMotion.framework and MessageUI.framework\n- Add \"-ObjC\" linker flag to your project's build settings\n- Add the value \"com.getpebble.public\" to the \"Supported external accessory protocols\" (UISupportedExternalAccessoryProtocols) array in your app's Info.plist\n- Optionally, add the value \"App communicates with an accessory\" (external-accessory) to the \"Required background modes\" (UIBackgroundModes) array in your app's Info.plist\n\n\n## Xcode Documentation\n\n- An Xcode docset is included with documentation about all public APIs.\n- Copy `com.getpebble.PebbleKit.docset` content into `~/Library/Developer/Shared/Documentation/DocSets`\n- Restart Xcode. The documentation will now be available from `Help > Documentation and API Reference`\n\n## Submitting iOS apps with PebbleKit to Apple's App Store\n\nIn order for Pebble to work with iPhones, Pebble is part of the Made For iPhone program (a requirement for hardware accessories to interact with iOS apps). Unfortunately this also means that if you build an iOS app with PebbleKit, we (Pebble) will need to whitelist your iOS app before you can upload it to the App Store. If you have completed a Pebble app and would like to learn more about making it available on the App Store, please visit [the whitelisting guide](https://developer.getpebble.com/2/distribute/whitelisting.html)\n\n## Change Log\n\n#### TODO-SetDate - 2.0\n\n- Remove examples from PebbleKit and move them into Pebble SDK\n\n#### 2013-07-03 - 1.12\n- Log errors to the console if there is no delegate set on PBWatch\n- Bugfixes\n-- Fix threading bugs in WeatherDemo\n-- Fix bugs that could cause callbacks to be called on the wrong thread\n-- Fix a bug that could cause a crash when re-connecting to the watch\n-- Fix a bug that caused some types to be unavailable (gtypes.h)\n\n#### 2013-05-06\n- Added WeatherDemo sample project to demonstrate custom use of the AppMessage subsystem\n- Added -[PBWatch closeSession:] to enable 3rd party apps to explicitely close the shared communication session.\n- Added PBBitmap helper class to convert UIImage to the native Pebble bitmap format\n- Exposed category methods on NSData/NSDictionary to (de)serialize from/to Pebble dicts\n- Added documentation for the NSNumber+stdint category\n\n#### 2013-03-25\n- Added generic bi-directional phone app <-> watch app communication layer, called \"App Messages\"\n- Refactored legacy Sports protocol to use App Messages\n- Added APIs to query the watch whether App / Sports Messages are supported (-appMessagesGetIsSupported: and -sportsGetIsSupported:)\n- Added API to set custom icon / title to the Sports watch app\n- Added API to receive Sports activity state changes by pressing the SELECT button on the watch (-sportsAppAddReceiveUpdateHandler:)\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/Pods-PebbleKit-Private.xcconfig",
    "content": "#include \"Pods-PebbleKit.xcconfig\"\nFRAMEWORK_SEARCH_PATHS = ${PODS_PEBBLEKIT_FRAMEWORK_SEARCH_PATHS}\nGCC_PREPROCESSOR_DEFINITIONS = COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/BuildHeaders\" \"${PODS_ROOT}/BuildHeaders/PebbleKit\" \"${PODS_ROOT}/Headers\" \"${PODS_ROOT}/Headers/PebbleKit\"\nOTHER_LDFLAGS = -ObjC ${PODS_PEBBLEKIT_OTHER_LDFLAGS}\nPODS_ROOT = ${SRCROOT}"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/Pods-PebbleKit-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_PebbleKit : NSObject\n@end\n@implementation PodsDummy_Pods_PebbleKit\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/Pods-PebbleKit-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n#import \"Pods-environment.h\"\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/Pods-PebbleKit.xcconfig",
    "content": "PODS_PEBBLEKIT_FRAMEWORK_SEARCH_PATHS = \"$(PODS_ROOT)/PebbleKit\" \"$(PODS_ROOT)/PebbleKit\"\nPODS_PEBBLEKIT_OTHER_LDFLAGS = -lz -framework PebbleKit -framework PebbleVendor -weak_framework CoreBluetooth -weak_framework CoreMotion -weak_framework ExternalAccessory -weak_framework MessageUI"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/Pods-acknowledgements.markdown",
    "content": "# Acknowledgements\nThis application makes use of the following third party libraries:\n\n## PebbleKit\n\n© 2014 Pebble Technology Corp. All rights reserved.\n\nGenerated by CocoaPods - http://cocoapods.org\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/Pods-acknowledgements.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreferenceSpecifiers</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>This application makes use of the following third party libraries:</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Acknowledgements</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>© 2014 Pebble Technology Corp. All rights reserved.\n</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>PebbleKit</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Generated by CocoaPods - http://cocoapods.org</string>\n\t\t\t<key>Title</key>\n\t\t\t<string></string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t</array>\n\t<key>StringsTable</key>\n\t<string>Acknowledgements</string>\n\t<key>Title</key>\n\t<string>Acknowledgements</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/Pods-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods : NSObject\n@end\n@implementation PodsDummy_Pods\n@end\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/Pods-environment.h",
    "content": "\n// To check if a library is compiled with CocoaPods you\n// can use the `COCOAPODS` macro definition which is\n// defined in the xcconfigs so it is available in\n// headers also when they are imported in the client\n// project.\n\n\n// PebbleKit\n#define COCOAPODS_POD_AVAILABLE_PebbleKit\n#define COCOAPODS_VERSION_MAJOR_PebbleKit 2\n#define COCOAPODS_VERSION_MINOR_PebbleKit 2\n#define COCOAPODS_VERSION_PATCH_PebbleKit 0\n\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/Pods-resources.sh",
    "content": "#!/bin/sh\nset -e\n\nRESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt\n> \"$RESOURCES_TO_COPY\"\n\ninstall_resource()\n{\n  case $1 in\n    *.storyboard)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}\"\n      ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .storyboard`.storyboardc\" \"${PODS_ROOT}/$1\" --sdk \"${SDKROOT}\"\n      ;;\n    *.xib)\n        echo \"ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}\"\n      ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .xib`.nib\" \"${PODS_ROOT}/$1\" --sdk \"${SDKROOT}\"\n      ;;\n    *.framework)\n      echo \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      mkdir -p \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      echo \"rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      rsync -av \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      ;;\n    *.xcdatamodel)\n      echo \"xcrun momc \\\"${PODS_ROOT}/$1\\\" \\\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\"`.mom\\\"\"\n      xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcdatamodel`.mom\"\n      ;;\n    *.xcdatamodeld)\n      echo \"xcrun momc \\\"${PODS_ROOT}/$1\\\" \\\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcdatamodeld`.momd\\\"\"\n      xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcdatamodeld`.momd\"\n      ;;\n    *.xcassets)\n      ;;\n    /*)\n      echo \"$1\"\n      echo \"$1\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n    *)\n      echo \"${PODS_ROOT}/$1\"\n      echo \"${PODS_ROOT}/$1\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n  esac\n}\n\nrsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nif [[ \"${ACTION}\" == \"install\" ]]; then\n  rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\nrm -f \"$RESOURCES_TO_COPY\"\n\nif [[ -n \"${WRAPPER_EXTENSION}\" ]] && [ `xcrun --find actool` ] && [ `find . -name '*.xcassets' | wc -l` -ne 0 ]\nthen\n  case \"${TARGETED_DEVICE_FAMILY}\" in \n    1,2)\n      TARGET_DEVICE_ARGS=\"--target-device ipad --target-device iphone\"\n      ;;\n    1)\n      TARGET_DEVICE_ARGS=\"--target-device iphone\"\n      ;;\n    2)\n      TARGET_DEVICE_ARGS=\"--target-device ipad\"\n      ;;\n    *)\n      TARGET_DEVICE_ARGS=\"--target-device mac\"\n      ;;  \n  esac \n  find \"${PWD}\" -name \"*.xcassets\" -print0 | xargs -0 actool --output-format human-readable-text --notices --warnings --platform \"${PLATFORM_NAME}\" --minimum-deployment-target \"${IPHONEOS_DEPLOYMENT_TARGET}\" ${TARGET_DEVICE_ARGS} --compress-pngs --compile \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\n"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/Pods.xcconfig",
    "content": "FRAMEWORK_SEARCH_PATHS = \"$(PODS_ROOT)/PebbleKit\" \"$(PODS_ROOT)/PebbleKit\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers\" \"${PODS_ROOT}/Headers/PebbleKit\"\nOTHER_CFLAGS = $(inherited) -isystem \"${PODS_ROOT}/Headers\" -isystem \"${PODS_ROOT}/Headers/PebbleKit\"\nOTHER_LDFLAGS = -ObjC -lz -framework PebbleKit -framework PebbleVendor -weak_framework CoreBluetooth -weak_framework CoreMotion -weak_framework ExternalAccessory -weak_framework MessageUI\nPODS_ROOT = ${SRCROOT}/Pods"
  },
  {
    "path": "golf-demo/GolfDemo-iOS/Pods/Pods.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7723D983F4FF430B9766BBFE /* Pods-PebbleKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F4754F7079C4614BC807153 /* Pods-PebbleKit-dummy.m */; };\n\t\tA07773FC6C314DCEB0960832 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAEF90853F594C59AEB3A6C5 /* Foundation.framework */; };\n\t\tB8BC607515334457BB9341B4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAEF90853F594C59AEB3A6C5 /* Foundation.framework */; };\n\t\tE927AC097B334CC2B6534369 /* libPods-PebbleKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3670A954371545BAB4761230 /* libPods-PebbleKit.a */; };\n\t\tE95639A863944418801BA89E /* Pods-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1073A85F92CF4D9FAD591FA8 /* Pods-dummy.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\tB7B3060619154C8B87D52A0A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = C5F91D4698A246F09C4211FB /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 556FE4BD808A4E10ABD2157C;\n\t\t\tremoteInfo = \"Pods-PebbleKit\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t03B92534013941C19E3790F4 /* PebbleKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = PebbleKit.framework; sourceTree = \"<group>\"; };\n\t\t1073A85F92CF4D9FAD591FA8 /* Pods-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t22FC278632CD472A9B477DC2 /* Pods-PebbleKit-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-PebbleKit-Private.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t3670A954371545BAB4761230 /* libPods-PebbleKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-PebbleKit.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t577ACB6582874B809552A3C4 /* Pods-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-resources.sh\"; sourceTree = \"<group>\"; };\n\t\t58FA3747906B46FDA9170A87 /* Pods-PebbleKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-PebbleKit.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t5D83954542D247E1967D4C17 /* Pods-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = \"Pods-acknowledgements.markdown\"; sourceTree = \"<group>\"; };\n\t\t63512A43B67A4FE8873EA155 /* Pods-environment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Pods-environment.h\"; sourceTree = \"<group>\"; };\n\t\t945D8CA7CA7B45F29DC7D9CF /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t9F4754F7079C4614BC807153 /* Pods-PebbleKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-PebbleKit-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tCF91FF37BCC7412AB5BFE5DB /* Pods-PebbleKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Pods-PebbleKit-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tD4DFDD88A8B844659D2FA264 /* PebbleVendor.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = PebbleVendor.framework; sourceTree = \"<group>\"; };\n\t\tD9C8A29BBF5D4239B58785A8 /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.xcconfig; sourceTree = \"<group>\"; };\n\t\tDAEF90853F594C59AEB3A6C5 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };\n\t\tECFD7674470B45A9AE89EEB7 /* Pods-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-acknowledgements.plist\"; sourceTree = \"<group>\"; };\n\t\tFE5D5ED77FC5400A83BF2C6B /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B3F14EFF37E4DE7AE19B335 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB8BC607515334457BB9341B4 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tB0F4DD8D98664CF0935645DC /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA07773FC6C314DCEB0960832 /* Foundation.framework in Frameworks */,\n\t\t\t\tE927AC097B334CC2B6534369 /* libPods-PebbleKit.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t14CD1368656B4893BAF12977 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFE5D5ED77FC5400A83BF2C6B /* Podfile */,\n\t\t\t\tC8DE8E0AB0D7481C891E3786 /* Frameworks */,\n\t\t\t\t2BFADE9172884804AD8B59BC /* Pods */,\n\t\t\t\tBEE2D9A20DC0412386A8A2D7 /* Products */,\n\t\t\t\t718E27A2AFF14A9081C6AAAE /* Targets Support Files */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1A56662A59454707B56B2A4B /* PebbleKit */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3CCBF435D2444BE384DF08A3 /* Frameworks */,\n\t\t\t\t4B102F94A7634A969CBD2F0D /* Support Files */,\n\t\t\t);\n\t\t\tname = PebbleKit;\n\t\t\tpath = PebbleKit;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2BFADE9172884804AD8B59BC /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1A56662A59454707B56B2A4B /* PebbleKit */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3CCBF435D2444BE384DF08A3 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t03B92534013941C19E3790F4 /* PebbleKit.framework */,\n\t\t\t\tD4DFDD88A8B844659D2FA264 /* PebbleVendor.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4B102F94A7634A969CBD2F0D /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t58FA3747906B46FDA9170A87 /* Pods-PebbleKit.xcconfig */,\n\t\t\t\t22FC278632CD472A9B477DC2 /* Pods-PebbleKit-Private.xcconfig */,\n\t\t\t\t9F4754F7079C4614BC807153 /* Pods-PebbleKit-dummy.m */,\n\t\t\t\tCF91FF37BCC7412AB5BFE5DB /* Pods-PebbleKit-prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\t718E27A2AFF14A9081C6AAAE /* Targets Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC9CD18BA759C404994DDE63C /* Pods */,\n\t\t\t);\n\t\t\tname = \"Targets Support Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBEE2D9A20DC0412386A8A2D7 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t945D8CA7CA7B45F29DC7D9CF /* libPods.a */,\n\t\t\t\t3670A954371545BAB4761230 /* libPods-PebbleKit.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC8DE8E0AB0D7481C891E3786 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF614D34189A149D88302F3A2 /* iOS */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC9CD18BA759C404994DDE63C /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD9C8A29BBF5D4239B58785A8 /* Pods.xcconfig */,\n\t\t\t\t5D83954542D247E1967D4C17 /* Pods-acknowledgements.markdown */,\n\t\t\t\tECFD7674470B45A9AE89EEB7 /* Pods-acknowledgements.plist */,\n\t\t\t\t1073A85F92CF4D9FAD591FA8 /* Pods-dummy.m */,\n\t\t\t\t63512A43B67A4FE8873EA155 /* Pods-environment.h */,\n\t\t\t\t577ACB6582874B809552A3C4 /* Pods-resources.sh */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF614D34189A149D88302F3A2 /* iOS */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tDAEF90853F594C59AEB3A6C5 /* Foundation.framework */,\n\t\t\t);\n\t\t\tname = iOS;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t32CAA308C54948A3A9C6AAAD /* Pods */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 24DB3A80C6894C48A3AF4E93 /* Build configuration list for PBXNativeTarget \"Pods\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t725DFAE3EC7E405F96B5DE4F /* Sources */,\n\t\t\t\tB0F4DD8D98664CF0935645DC /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t34471DE79C234EA4BDEFF72A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tproductName = Pods;\n\t\t\tproductReference = 945D8CA7CA7B45F29DC7D9CF /* libPods.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t556FE4BD808A4E10ABD2157C /* Pods-PebbleKit */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = A0C5036680FC42BB8FB33A13 /* Build configuration list for PBXNativeTarget \"Pods-PebbleKit\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8337B6ACC75A4CE98155EEDC /* Sources */,\n\t\t\t\t7B3F14EFF37E4DE7AE19B335 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Pods-PebbleKit\";\n\t\t\tproductName = \"Pods-PebbleKit\";\n\t\t\tproductReference = 3670A954371545BAB4761230 /* libPods-PebbleKit.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tC5F91D4698A246F09C4211FB /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0510;\n\t\t\t};\n\t\t\tbuildConfigurationList = B6AF34D32C754071B0215766 /* Build configuration list for PBXProject \"Pods\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 14CD1368656B4893BAF12977;\n\t\t\tproductRefGroup = BEE2D9A20DC0412386A8A2D7 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectReferences = (\n\t\t\t);\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t32CAA308C54948A3A9C6AAAD /* Pods */,\n\t\t\t\t556FE4BD808A4E10ABD2157C /* Pods-PebbleKit */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t725DFAE3EC7E405F96B5DE4F /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tE95639A863944418801BA89E /* Pods-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8337B6ACC75A4CE98155EEDC /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7723D983F4FF430B9766BBFE /* Pods-PebbleKit-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t34471DE79C234EA4BDEFF72A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 556FE4BD808A4E10ABD2157C /* Pods-PebbleKit */;\n\t\t\ttargetProxy = B7B3060619154C8B87D52A0A /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t09A1AB69FF2241C586164ADD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 22FC278632CD472A9B477DC2 /* Pods-PebbleKit-Private.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDSTROOT = /tmp/xcodeproj.dst;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Pods-PebbleKit-prefix.pch\";\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINSTALL_PATH = \"$(BUILT_PRODUCTS_DIR)\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"-DNS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tOTHER_CPLUSPLUSFLAGS = (\n\t\t\t\t\t\"-DNS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t2F7E73D5A65B4467A39BE038 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 22FC278632CD472A9B477DC2 /* Pods-PebbleKit-Private.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDSTROOT = /tmp/xcodeproj.dst;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Pods-PebbleKit-prefix.pch\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINSTALL_PATH = \"$(BUILT_PRODUCTS_DIR)\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B87841A35914ADEBC5F4729 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = D9C8A29BBF5D4239B58785A8 /* Pods.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDSTROOT = /tmp/xcodeproj.dst;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINSTALL_PATH = \"$(BUILT_PRODUCTS_DIR)\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"-DNS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tOTHER_CPLUSPLUSFLAGS = (\n\t\t\t\t\t\"-DNS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t86E22E80241543A2936C2089 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = D9C8A29BBF5D4239B58785A8 /* Pods.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDSTROOT = /tmp/xcodeproj.dst;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINSTALL_PATH = \"$(BUILT_PRODUCTS_DIR)\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tB9A8E0B2FC814382B8909AE6 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = NO;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD7FEF9660A9647999C45982C /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = NO;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t24DB3A80C6894C48A3AF4E93 /* Build configuration list for PBXNativeTarget \"Pods\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t86E22E80241543A2936C2089 /* Debug */,\n\t\t\t\t7B87841A35914ADEBC5F4729 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tA0C5036680FC42BB8FB33A13 /* Build configuration list for PBXNativeTarget \"Pods-PebbleKit\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2F7E73D5A65B4467A39BE038 /* Debug */,\n\t\t\t\t09A1AB69FF2241C586164ADD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tB6AF34D32C754071B0215766 /* Build configuration list for PBXProject \"Pods\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD7FEF9660A9647999C45982C /* Debug */,\n\t\t\t\tB9A8E0B2FC814382B8909AE6 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = C5F91D4698A246F09C4211FB /* Project object */;\n}\n"
  },
  {
    "path": "golf-demo/README.md",
    "content": "# golf-demo\n\n![screenshot](golf-demo-screenshot.png)\n\nThis app demonstrates how to launch and push sports stats to the built-in Sports\nAPI watchapps. There are two watchapps - Golf and Sports."
  },
  {
    "path": "pebblekit-js/quotes/README.md",
    "content": "# quotes\n\n![screenshot](quotes-screenshot.png)\n\nThis app shows how to use the PebbleKit JS APIs to fetch price quotes from the\ninternet and display them on Pebble. Use the buttons to choose your stock symbol\n(for example, GOOG for Google) and check for the appropriate price value."
  },
  {
    "path": "pebblekit-js/quotes/appinfo.json",
    "content": "{\n  \"uuid\": \"2a3352d5-2d44-437f-9652-98464640aeab\",\n  \"shortName\": \"Quotes\",\n  \"longName\": \"Quotes\",\n  \"companyName\": \"Pebble Financial Corp\",\n  \"versionCode\": 1,\n  \"versionLabel\": \"1.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {\n    \"init\": 0,\n    \"fetch\": 1,\n    \"symbol\": 2,\n    \"price\": 3\n  },\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "pebblekit-js/quotes/src/entry.c",
    "content": "#include <pebble.h>\n\n#include \"entry.h\"\n\nstatic struct EntryUi {\n  Window *window;\n  TextLayer *title_text;\n\n  TextLayer *chars_text[4];\n  char entry_chars[4][2];\n  uint8_t index;\n\n  char entry_name[30];\n  InverterLayer *invert;\n} ui;\n\nchar *hs_name; // Pointer to put the name into.\nEntryCallback hs_callback;\n\nstatic void up_click_handler(ClickRecognizerRef recognizer, void *context) {\n  if (ui.index < 4) {\n    if (ui.entry_chars[ui.index][0] == 'Z')\n      ui.entry_chars[ui.index][0] = 'A';\n    else\n      ++ui.entry_chars[ui.index][0];\n    layer_mark_dirty(text_layer_get_layer(ui.chars_text[ui.index]));\n  }\n}\n\nstatic void down_click_handler(ClickRecognizerRef recognizer, void *context) {\n  if (ui.index < 4) {\n    if (ui.entry_chars[ui.index][0] == 'A')\n      ui.entry_chars[ui.index][0] = 'Z';\n    else\n      --ui.entry_chars[ui.index][0];\n    layer_mark_dirty(text_layer_get_layer(ui.chars_text[ui.index]));\n  }\n}\n\nstatic void select_click_handler(ClickRecognizerRef recognizer, void *context) {\n  if (ui.index == 3)\n    ui.index = 0;\n  else\n    ++ui.index;\n\n  inverter_layer_destroy(ui.invert);\n  ui.invert = inverter_layer_create((GRect) {\n        .origin = { 35 + 20 * ui.index, 66 },\n        .size = { 15, 31 }\n      });\n  layer_add_child(window_get_root_layer(ui.window),\n                  inverter_layer_get_layer(ui.invert));\n}\n\nstatic void select_long_click_handler(ClickRecognizerRef recognizer, void *context) {\n  if (ui.entry_chars[3][0] == '\\0')\n    ui.entry_chars[3][0] = 'A';\n  else\n    ui.entry_chars[3][0] = '\\0';\n\n  layer_mark_dirty(text_layer_get_layer(ui.chars_text[ui.index]));\n}\n\nstatic void click_config_provider(void *context) {\n  const uint16_t repeat_interval_ms = 100;\n  window_single_repeating_click_subscribe(BUTTON_ID_UP, repeat_interval_ms, up_click_handler);\n  window_single_click_subscribe(BUTTON_ID_SELECT, select_click_handler);\n  window_long_click_subscribe(BUTTON_ID_SELECT, 0, select_long_click_handler, NULL);\n  window_single_repeating_click_subscribe(BUTTON_ID_DOWN, repeat_interval_ms, down_click_handler);\n}\n\nstatic void window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(ui.window);\n  GRect bounds = layer_get_bounds(window_layer);\n\n  ui.title_text = text_layer_create((GRect) {\n        .origin = { 0, 0 },\n        .size = { bounds.size.w, 64 }\n      });\n  text_layer_set_text(ui.title_text, ui.entry_name);\n  text_layer_set_text_alignment(ui.title_text, GTextAlignmentCenter);\n  text_layer_set_font(ui.title_text,\n                      fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));\n  layer_add_child(window_layer, text_layer_get_layer(ui.title_text));\n\n  ui.index = 0;\n\n  for (int i = 0; i < 4; ++i) {\n    strncpy(ui.entry_chars[i], \"A\", 2);\n\n    ui.chars_text[i] = text_layer_create(\n        (GRect) { .origin = { 35+20*i, 64 },  .size = { 15, 50 } });\n    text_layer_set_font(ui.chars_text[i],\n                        fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));\n    text_layer_set_text_alignment(ui.chars_text[i], GTextAlignmentCenter);\n    text_layer_set_text(ui.chars_text[i], ui.entry_chars[i]);\n    layer_add_child(window_layer, text_layer_get_layer(ui.chars_text[i]));\n  }\n\n  ui.invert = inverter_layer_create((GRect) {\n        .origin = { 35, 66 },\n        .size = { 16, 31 }\n      });\n  layer_add_child(window_layer, inverter_layer_get_layer(ui.invert));\n}\n\nstatic void window_unload(Window *window) {\n  text_layer_destroy(ui.title_text);\n  for (int i = 0; i < 4; ++i) {\n    hs_name[i] = ui.entry_chars[i][0];\n    text_layer_destroy(ui.chars_text[i]);\n  }\n  hs_name[4] = '\\0';\n  inverter_layer_destroy(ui.invert);\n  hs_callback(hs_name);\n}\n\nvoid entry_init(char *name) {\n  ui.window = window_create();\n  strncpy(ui.entry_name, name, 30);\n  window_set_click_config_provider(ui.window, click_config_provider);\n  window_set_window_handlers(ui.window, (WindowHandlers) {\n    .load = window_load,\n    .unload = window_unload,\n  });\n}\n\nvoid entry_deinit(void) {\n  window_destroy(ui.window);\n}\n\nvoid entry_get_name(char *name, EntryCallback callback) {\n  hs_callback = callback;\n  hs_name = name;\n  window_stack_push(ui.window, true);\n}\n"
  },
  {
    "path": "pebblekit-js/quotes/src/entry.h",
    "content": "#pragma once\n\ntypedef void (*EntryCallback)(char *name);\n\nvoid entry_init(char *name);\n\nvoid entry_deinit(void);\n\nvoid entry_get_name(char *name, EntryCallback cb);\n"
  },
  {
    "path": "pebblekit-js/quotes/src/js/pebble-js-app.js",
    "content": "// We use the fake \"PBL\" symbol as default\nvar defaultSymbol = \"PBL\";\nvar symbol = defaultSymbol;\n\n// Fetch stock data for a given stock symbol (NYSE or NASDAQ only) from markitondemand.com\n// & send the stock price back to the watch via app message\n// API documentation at http://dev.markitondemand.com/#doc\nfunction fetchStockQuote(symbol, isInitMsg) {\n  var response;\n  var req = new XMLHttpRequest();\n  // build the GET request\n  req.open('GET', \"http://dev.markitondemand.com/Api/Quote/json?\" +\n    \"symbol=\" + symbol, true);\n  req.onload = function(e) {\n    if (req.readyState == 4) {\n      // 200 - HTTP OK\n      if(req.status == 200) {\n        console.log(req.responseText);\n        response = JSON.parse(req.responseText);\n        var price;\n        if (response.Message) {\n          // the markitondemand API sends a response with a Message\n          // field when the symbol is not found\n          Pebble.sendAppMessage({\n            \"price\": \"Not Found\"});\n        }\n        if (response.Data) {\n          // data found, look for LastPrice\n          price = response.Data.LastPrice;\n          console.log(price);\n\n          var msg = {};\n          if (isInitMsg) {\n            msg.init = true;\n            msg.symbol = symbol;\n          }\n          msg.price = \"$\" + price.toString();\n          Pebble.sendAppMessage(msg);\n        }\n      } else {\n        console.log(\"Request returned error code \" + req.status.toString());\n      }\n    }\n  };\n  req.send(null);\n}\n\n// Set callback for the app ready event\nPebble.addEventListener(\"ready\", function(e) {\n  console.log(\"connect! \" + e.ready);\n  console.log(e.type);\n  // Fetch saved symbol from local storage (using\n  // standard localStorage webAPI)\n  symbol = localStorage.getItem(\"symbol\");\n  if (!symbol) {\n    symbol = \"PBL\";\n  }\n  var isInitMsg = true;\n  fetchStockQuote(symbol, isInitMsg);\n});\n\n// Set callback for appmessage events\nPebble.addEventListener(\"appmessage\", function(e) {\n  console.log(\"message\");\n  var isInitMsg;\n  if (e.payload.init) {\n    isInitMsg = true;\n    fetchStockQuote(symbol, isInitMsg);\n  } else if (e.payload.fetch) {\n    isInitMsg = false;\n    fetchStockQuote(symbol, isInitMsg);\n  } else if (e.payload.symbol) {\n    symbol = e.payload.symbol;\n    localStorage.setItem(\"symbol\", symbol);\n    isInitMsg = false;\n    fetchStockQuote(symbol, isInitMsg);\n  }\n});\n\n"
  },
  {
    "path": "pebblekit-js/quotes/src/quotes.c",
    "content": "#include <pebble.h>\n\n#include \"entry.h\"\n\nstatic Window *s_main_window;\nstatic TextLayer *s_symbol_layer;\nstatic TextLayer *s_price_layer;\nstatic char s_symbol[5];\nstatic char s_price[10];\nstatic bool s_wasFirstMsg;\nstatic bool s_dataInited;\nstatic int s_refreshKey;\nstatic char *s_refreshSymbol;\n\nenum {\n  QUOTE_KEY_INIT = 0x0,\n  QUOTE_KEY_FETCH = 0x1,\n  QUOTE_KEY_SYMBOL = 0x2,\n  QUOTE_KEY_PRICE = 0x03,\n};\n\nstatic bool send_to_phone_multi(int quote_key, char *s_symbol) {\n  if ((quote_key == -1) && (s_symbol == NULL)) {\n    APP_LOG(APP_LOG_LEVEL_DEBUG, \"no data to send\");\n    // well, the \"nothing\" that was sent to us was queued, anyway ...\n    return true;\n  }\n\n  DictionaryIterator *iter;\n  app_message_outbox_begin(&iter);\n  if (iter == NULL) {\n    APP_LOG(APP_LOG_LEVEL_DEBUG, \"null iter\");\n    return false;\n  }\n\n  Tuplet tuple = (s_symbol == NULL)\n                      ? TupletInteger(quote_key, 1)\n                      : TupletCString(quote_key, s_symbol);\n  dict_write_tuplet(iter, &tuple);\n  dict_write_end(iter);\n\n  app_message_outbox_send();\n  return true;\n}\n\nstatic void send_to_phone(int quote_key) {\n  bool queued = send_to_phone_multi(quote_key, NULL);\n  if (!queued && (s_refreshKey == -1) && (s_refreshSymbol == NULL)) {\n    s_refreshKey = quote_key;\n  }\n}\n\nstatic void set_symbol_msg(char *symbolName) {\n  bool queued = send_to_phone_multi(QUOTE_KEY_SYMBOL, symbolName);\n  if (!queued) {\n    s_refreshKey = QUOTE_KEY_SYMBOL;\n    s_refreshSymbol = symbolName;\n  }\n}\n\nstatic void in_received_handler(DictionaryIterator *iter, void *context) {\n  Tuple *init_tuple = dict_find(iter, QUOTE_KEY_INIT);\n  Tuple *symbol_tuple = dict_find(iter, QUOTE_KEY_SYMBOL);\n  Tuple *price_tuple = dict_find(iter, QUOTE_KEY_PRICE);\n\n  if (init_tuple) {\n    // only accept one initial tuple; the second may be a server reply to\n    // an out-of-date action on our part\n    if (s_dataInited) {\n      return;\n    } else {\n      s_dataInited = true;\n    }\n  }\n  if (symbol_tuple) {\n    strncpy(s_symbol, symbol_tuple->value->cstring, 5);\n    text_layer_set_text(s_symbol_layer, s_symbol);\n  }\n  if (price_tuple) {\n    strncpy(s_price, price_tuple->value->cstring, 10);\n    text_layer_set_text(s_price_layer, s_price);\n  }\n}\n\nstatic void in_dropped_handler(AppMessageResult reason, void *context) {\n  APP_LOG(APP_LOG_LEVEL_DEBUG, \"App Message Dropped!\");\n}\n\nstatic void out_failed_handler(DictionaryIterator *failed, AppMessageResult reason, void *context) {\n  if (s_wasFirstMsg && s_dataInited) {\n    // Ignore, was successful\n  } else {\n    APP_LOG(APP_LOG_LEVEL_DEBUG, \"App Message Failed to Send!\");\n  }\n\n  s_wasFirstMsg = false;\n}\n\nstatic void select_click_handler(ClickRecognizerRef recognizer, void *context) {\n  // refresh\n  text_layer_set_text(s_price_layer, \"Loading...\");\n  send_to_phone(QUOTE_KEY_FETCH);\n}\n\nstatic void select_long_click_handler(ClickRecognizerRef recognizer, void *context) {\n  // refresh\n  entry_get_name(s_symbol, set_symbol_msg);\n  text_layer_set_text(s_symbol_layer, s_symbol);\n  text_layer_set_text(s_price_layer, \"Loading...\");\n}\n\nstatic void click_config_provider(void *context) {\n  window_single_click_subscribe(BUTTON_ID_SELECT, select_click_handler);\n  window_long_click_subscribe(BUTTON_ID_SELECT, 0, select_long_click_handler, NULL);\n}\n\nstatic void window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_bounds(window_layer);\n\n  s_symbol_layer = text_layer_create(GRect(0, 20, bounds.size.w, 50));\n  text_layer_set_text(s_symbol_layer, \"PBL\");\n  text_layer_set_text_alignment(s_symbol_layer, GTextAlignmentCenter);\n  text_layer_set_font(s_symbol_layer, fonts_get_system_font(FONT_KEY_BITHAM_42_BOLD));\n  layer_add_child(window_layer, text_layer_get_layer(s_symbol_layer));\n\n  s_price_layer = text_layer_create(GRect(0, 75, bounds.size.w, 50));\n  text_layer_set_text(s_price_layer, \"$0000.00\");\n  text_layer_set_text_alignment(s_price_layer, GTextAlignmentCenter);\n  text_layer_set_font(s_price_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28));\n  layer_add_child(window_layer, text_layer_get_layer(s_price_layer));\n\n  send_to_phone(QUOTE_KEY_INIT);\n  s_wasFirstMsg = true;\n}\n\nstatic void window_unload(Window *window) {\n  text_layer_destroy(s_symbol_layer);\n  text_layer_destroy(s_price_layer);\n}\n\nstatic void init(void) {\n  s_refreshKey = -1;\n  s_refreshSymbol = NULL;\n\n  // Register message handlers\n  app_message_register_inbox_received(in_received_handler);\n  app_message_register_inbox_dropped(in_dropped_handler);\n  app_message_register_outbox_failed(out_failed_handler);\n  \n  // Init buffers\n  app_message_open(64, 64);\n\n  char entry_title[] = \"Enter Symbol\";\n  entry_init(entry_title);\n\n  s_main_window = window_create();\n  window_set_click_config_provider(s_main_window, click_config_provider);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = window_load,\n    .unload = window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit(void) {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "pebblekit-js/quotes/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "pebblekit-js/weather/README.md",
    "content": "# weather\n\n![screenshot](weather-screenshot.png)\n\nThis wapp uses PebbleKit JS to fetch weather data from the \n[openweathermap.org](http://openweathermap.org/) and display it on the watch. \nIt uses the location provided by the phone to look up the nearest location, and\nsends temperature data along with that location's name. A weather icon is also\ndisplayed."
  },
  {
    "path": "pebblekit-js/weather/appinfo.json",
    "content": "{\n  \"uuid\": \"74460383-8a0f-4bb6-971f-8937c2ed4441\",\n  \"shortName\": \"PebbleJS Weather\",\n  \"longName\": \"PebbleJS Weather\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {\n    \"WEATHER_CITY_KEY\": 2,\n    \"WEATHER_TEMPERATURE_KEY\": 1,\n    \"WEATHER_ICON_KEY\": 0\n  },\n  \"resources\": {\n    \"media\": [\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_SUN\",\n        \"file\": \"img/sun.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_RAIN\",\n        \"file\": \"img/rain.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_CLOUD\",\n        \"file\": \"img/cloud.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_SNOW\",\n        \"file\": \"img/snow.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "pebblekit-js/weather/src/js/pebble-js-app.js",
    "content": "\nfunction iconFromWeatherId(weatherId) {\n  if (weatherId < 600) {\n    return 2;\n  } else if (weatherId < 700) {\n    return 3;\n  } else if (weatherId > 800) {\n    return 1;\n  } else {\n    return 0;\n  }\n}\n\nfunction fetchWeather(latitude, longitude) {\n  var req = new XMLHttpRequest();\n  req.open('GET', \"http://api.openweathermap.org/data/2.5/weather?\" +\n    \"lat=\" + latitude + \"&lon=\" + longitude + \"&cnt=1\", true);\n  req.onload = function(e) {\n    if (req.readyState == 4) {\n      if(req.status == 200) {\n        console.log(req.responseText);\n\n        var response = JSON.parse(req.responseText);\n        var temperature = Math.round(response.main.temp - 273.15);\n        var icon = iconFromWeatherId(response.weather[0].id);\n        var city = response.name;\n        console.log(temperature);\n        console.log(icon);\n        console.log(city);\n        Pebble.sendAppMessage({\n          \"WEATHER_ICON_KEY\":icon,\n          \"WEATHER_TEMPERATURE_KEY\":temperature + \"\\u00B0C\",\n          \"WEATHER_CITY_KEY\":city}\n        );\n\n      } else {\n        console.log(\"Error\");\n      }\n    }\n  }\n  req.send(null);\n}\n\nfunction locationSuccess(pos) {\n  var coordinates = pos.coords;\n  fetchWeather(coordinates.latitude, coordinates.longitude);\n}\n\nfunction locationError(err) {\n  console.warn('location error (' + err.code + '): ' + err.message);\n  Pebble.sendAppMessage({\n    \"WEATHER_CITY_KEY\":\"Loc Unavailable\",\n    \"WEATHER_TEMPERATURE_KEY\":\"N/A\"\n  });\n}\n\nvar locationOptions = { \"timeout\": 15000, \"maximumAge\": 60000 }; \n\nPebble.addEventListener(\"ready\", function(e) {\n  console.log(\"connect!\" + e.ready);\n  locationWatcher = window.navigator.geolocation.getCurrentPosition(locationSuccess, locationError, locationOptions);\n  console.log(e.type);\n});\n\nPebble.addEventListener(\"appmessage\", function(e) {\n  window.navigator.geolocation.getCurrentPosition(locationSuccess, locationError, locationOptions);\n  console.log(e.type);\n  console.log(e.payload.temperature);\n  console.log(\"message!\");\n});\n\nPebble.addEventListener(\"webviewclosed\", function(e) {\n  console.log(\"webview closed\");\n  console.log(e.type);\n  console.log(e.response);\n});\n\n\n"
  },
  {
    "path": "pebblekit-js/weather/src/weather.c",
    "content": "#include \"pebble.h\"\n\nstatic Window *s_main_window;\n\nstatic TextLayer *s_temperature_layer;\nstatic TextLayer *s_city_layer;\nstatic BitmapLayer *s_icon_layer;\nstatic GBitmap *s_icon_bitmap = NULL;\n\nstatic AppSync s_sync;\nstatic uint8_t s_sync_buffer[64];\n\nenum WeatherKey {\n  WEATHER_ICON_KEY = 0x0,         // TUPLE_INT\n  WEATHER_TEMPERATURE_KEY = 0x1,  // TUPLE_CSTRING\n  WEATHER_CITY_KEY = 0x2,         // TUPLE_CSTRING\n};\n\nstatic const uint32_t WEATHER_ICONS[] = {\n  RESOURCE_ID_IMAGE_SUN, //0\n  RESOURCE_ID_IMAGE_CLOUD, //1\n  RESOURCE_ID_IMAGE_RAIN, //2\n  RESOURCE_ID_IMAGE_SNOW //3\n};\n\nstatic void sync_error_callback(DictionaryResult dict_error, AppMessageResult app_message_error, void *context) {\n  APP_LOG(APP_LOG_LEVEL_DEBUG, \"App Message Sync Error: %d\", app_message_error);\n}\n\nstatic void sync_tuple_changed_callback(const uint32_t key, const Tuple* new_tuple, const Tuple* old_tuple, void* context) {\n  switch (key) {\n    case WEATHER_ICON_KEY:\n      if (s_icon_bitmap) {\n        gbitmap_destroy(s_icon_bitmap);\n      }\n\n      s_icon_bitmap = gbitmap_create_with_resource(WEATHER_ICONS[new_tuple->value->uint8]);\n      bitmap_layer_set_bitmap(s_icon_layer, s_icon_bitmap);\n      break;\n\n    case WEATHER_TEMPERATURE_KEY:\n      // App Sync keeps new_tuple in s_sync_buffer, so we may use it directly\n      text_layer_set_text(s_temperature_layer, new_tuple->value->cstring);\n      break;\n\n    case WEATHER_CITY_KEY:\n      text_layer_set_text(s_city_layer, new_tuple->value->cstring);\n      break;\n  }\n}\n\nstatic void request_weather(void) {\n  DictionaryIterator *iter;\n  app_message_outbox_begin(&iter);\n\n  if (!iter) {\n    // Error creating outbound message\n    return;\n  }\n\n  int value = 1;\n  dict_write_int(iter, 1, &value, sizeof(int), true);\n  dict_write_end(iter);\n\n  app_message_outbox_send();\n}\n\nstatic void window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_bounds(window_layer);\n\n  s_icon_layer = bitmap_layer_create(GRect(32, 10, 80, 80));\n  layer_add_child(window_layer, bitmap_layer_get_layer(s_icon_layer));\n\n  s_temperature_layer = text_layer_create(GRect(0, 75, bounds.size.w, 68));\n  text_layer_set_text_color(s_temperature_layer, GColorWhite);\n  text_layer_set_background_color(s_temperature_layer, GColorClear);\n  text_layer_set_font(s_temperature_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));\n  text_layer_set_text_alignment(s_temperature_layer, GTextAlignmentCenter);\n  layer_add_child(window_layer, text_layer_get_layer(s_temperature_layer));\n\n  s_city_layer = text_layer_create(GRect(0, 105, bounds.size.w, 68));\n  text_layer_set_text_color(s_city_layer, GColorWhite);\n  text_layer_set_background_color(s_city_layer, GColorClear);\n  text_layer_set_font(s_city_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));\n  text_layer_set_text_alignment(s_city_layer, GTextAlignmentCenter);\n  layer_add_child(window_layer, text_layer_get_layer(s_city_layer));\n\n  Tuplet initial_values[] = {\n    TupletInteger(WEATHER_ICON_KEY, (uint8_t) 1),\n    TupletCString(WEATHER_TEMPERATURE_KEY, \"1234\\u00B0C\"),\n    TupletCString(WEATHER_CITY_KEY, \"St Pebblesburg\"),\n  };\n\n  app_sync_init(&s_sync, s_sync_buffer, sizeof(s_sync_buffer), \n      initial_values, ARRAY_LENGTH(initial_values),\n      sync_tuple_changed_callback, sync_error_callback, NULL\n  );\n\n  request_weather();\n}\n\nstatic void window_unload(Window *window) {\n  if (s_icon_bitmap) {\n    gbitmap_destroy(s_icon_bitmap);\n  }\n\n  text_layer_destroy(s_city_layer);\n  text_layer_destroy(s_temperature_layer);\n  bitmap_layer_destroy(s_icon_layer);\n}\n\nstatic void init(void) {\n  s_main_window = window_create();\n  window_set_background_color(s_main_window, GColorBlack);\n  window_set_fullscreen(s_main_window, true);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = window_load,\n    .unload = window_unload\n  });\n  window_stack_push(s_main_window, true);\n\n  app_message_open(64, 64);\n}\n\nstatic void deinit(void) {\n  window_destroy(s_main_window);\n\n  app_sync_deinit(&s_sync);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "pebblekit-js/weather/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "sports-demo/README.md",
    "content": "# sports-demo\n\n![screenshot](sports-demo-screenshot.png)\n\nSimilar to the `golf-demo` example, each of these Android and iOS projects\ndemonstrate how to launch and push data and statistics to the Sports API sport\nwatchapp. This app has fields for time, pace, speed, distance that is ideal for\nrunning apps. The watchapp is built-in to the Pebble firmware and so is not\nrequired to be written by the developer."
  },
  {
    "path": "sports-demo/SportsDemo-Android/.classpath",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<classpath>\n\t<classpathentry kind=\"src\" path=\"src\"/>\n\t<classpathentry kind=\"src\" path=\"gen\"/>\n\t<classpathentry kind=\"con\" path=\"com.android.ide.eclipse.adt.ANDROID_FRAMEWORK\"/>\n\t<classpathentry kind=\"con\" path=\"com.android.ide.eclipse.adt.LIBRARIES\"/>\n\t<classpathentry kind=\"output\" path=\"bin/classes\"/>\n</classpath>\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/.idea/.name",
    "content": "SportsDemo-Android"
  },
  {
    "path": "sports-demo/SportsDemo-Android/.idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <option name=\"DEFAULT_COMPILER\" value=\"Javac\" />\n    <resourceExtensions />\n    <wildcardResourcePatterns>\n      <entry name=\"!?*.java\" />\n      <entry name=\"!?*.form\" />\n      <entry name=\"!?*.class\" />\n      <entry name=\"!?*.groovy\" />\n      <entry name=\"!?*.scala\" />\n      <entry name=\"!?*.flex\" />\n      <entry name=\"!?*.kt\" />\n      <entry name=\"!?*.clj\" />\n    </wildcardResourcePatterns>\n    <annotationProcessing>\n      <profile default=\"true\" name=\"Default\" enabled=\"false\">\n        <processorPath useClasspath=\"true\" />\n      </profile>\n    </annotationProcessing>\n  </component>\n</project>\n\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/.idea/copyright/profiles_settings.xml",
    "content": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": "sports-demo/SportsDemo-Android/.idea/encodings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\" useUTFGuessing=\"true\" native2AsciiForPropertiesFiles=\"false\" />\n</project>\n\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/.idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"gradleHome\" value=\"/usr/local/bin/gradle\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n          </set>\n        </option>\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>\n\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/.idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points version=\"2.0\" />\n  </component>\n  <component name=\"ProjectInspectionProfilesVisibleTreeState\">\n    <entry key=\"Project Default\">\n      <profile-state>\n        <expanded-state>\n          <State>\n            <id />\n          </State>\n        </expanded-state>\n        <selected-state>\n          <State>\n            <id>Spelling</id>\n          </State>\n        </selected-state>\n      </profile-state>\n    </entry>\n  </component>\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_1_6\" assert-keyword=\"true\" jdk-15=\"true\" project-jdk-name=\"1.7\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"masterDetails\">\n    <states>\n      <state key=\"ProjectJDKs.UI\">\n        <settings>\n          <last-edited>Android API 10 Platform</last-edited>\n          <splitter-proportions>\n            <option name=\"proportions\">\n              <list>\n                <option value=\"0.2\" />\n              </list>\n            </option>\n          </splitter-proportions>\n        </settings>\n      </state>\n    </states>\n  </component>\n</project>\n\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/.idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/SportsDemo-Android.iml\" filepath=\"$PROJECT_DIR$/SportsDemo-Android.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/app/app.iml\" filepath=\"$PROJECT_DIR$/app/app.iml\" />\n    </modules>\n  </component>\n</project>\n\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/.idea/scopes/scope_settings.xml",
    "content": "<component name=\"DependencyValidationManager\">\n  <state>\n    <option name=\"SKIP_IMPORT_STATEMENTS\" value=\"false\" />\n  </state>\n</component>"
  },
  {
    "path": "sports-demo/SportsDemo-Android/.idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"\" vcs=\"\" />\n    <mapping directory=\"$PROJECT_DIR$/../..\" vcs=\"Git\" />\n  </component>\n</project>\n\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/.project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>PebbleKitExamples(git)</name>\n\t<comment></comment>\n\t<projects>\n\t</projects>\n\t<buildSpec>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.jdt.core.javabuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.ApkBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t</buildSpec>\n\t<natures>\n\t\t<nature>com.android.ide.eclipse.adt.AndroidNature</nature>\n\t\t<nature>org.eclipse.jdt.core.javanature</nature>\n\t</natures>\n</projectDescription>\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/.settings/org.eclipse.jdt.core.prefs",
    "content": "eclipse.preferences.version=1\norg.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6\norg.eclipse.jdt.core.compiler.compliance=1.6\norg.eclipse.jdt.core.compiler.source=1.6\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.example.PebbleKitExample\"\n  android:versionCode=\"1\"\n  android:versionName=\"1.0\">\n\n  <permission android:name=\"com.example.PebbleKitExample.permission.C2D_MESSAGE\" android:protectionLevel=\"signature\" />\n  <uses-permission android:name=\"com.example.PebbleKitExample.permission.C2D_MESSAGE\" />\n  <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />\n  <uses-permission android:name=\"android.permission.INTERNET\" />\n  <uses-permission android:name=\"android.permission.SEND_SMS\"/>\n  <uses-permission android:name=\"android.permission.READ_CONTACTS\"/>\n  <uses-permission android:name=\"android.permission.NFC\" />\n  <uses-feature android:name=\"android.hardware.nfc\" />\n\n    <!-- App receives GCM messages. -->\n    <uses-permission android:name=\"com.google.android.c2dm.permission.RECEIVE\" />\n    <!-- GCM connects to Google Services. -->\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <!-- GCM requires a Google account. -->\n    <uses-permission android:name=\"android.permission.GET_ACCOUNTS\" />\n    <!-- Keeps the processor from sleeping when a message is received. -->\n    <uses-permission android:name=\"android.permission.WAKE_LOCK\" />\n\n  <application android:label=\"@string/app_name\">\n\n    <activity\n      android:name=\".MainActivity\"\n      android:label=\"@string/app_name\">\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n\n    <activity\n      android:name=\".ExampleSportsActivity\"\n      android:label=\"@string/activity_sports\">\n\n    </activity>\n\n    <activity\n      android:name=\".ExampleGolfActivity\"\n      android:label=\"@string/activity_golf\">\n\n    </activity>\n\n    <activity\n      android:name=\".ExampleWeatherActivity\"\n      android:label=\"@string/activity_weather\">\n\n    </activity>\n\n    <activity\n      android:name=\".TodoList.ExampleTodoListActivity\"\n      android:label=\"@string/activity_todo_list\">\n\n    </activity>\n\n      <activity\n          android:name=\".ExampleSmsActivity\"\n          android:label=\"@string/activity_sms\">\n\n      </activity>\n\n    <activity\n       android:name=\".ExampleGCMActivity\"\n       android:label=\"@string/activity_gcm\"\n       android:screenOrientation=\"portrait\"\n       android:launchMode=\"singleInstance\">\n       <intent-filter>\n            <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n            <category android:name=\"android.intent.category.DEFAULT\" />\n            <data android:mimeType=\"application/com.example.android.beam\" />\n        </intent-filter>\n    </activity>\n\n    <receiver android:name=\"com.google.android.gcm.GCMBroadcastReceiver\" android:permission=\"com.google.android.c2dm.permission.SEND\" >\n        <intent-filter>\n            <action android:name=\"com.google.android.c2dm.intent.RECEIVE\" />\n            <action android:name=\"com.google.android.c2dm.intent.REGISTRATION\" />\n            <category android:name=\"com.example.PebbleKitExample\" />\n        </intent-filter>\n    </receiver>\n\n    <service android:name=\".GCMIntentService\" />\n  </application>\n</manifest> \n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/README.md",
    "content": "PebbleKitExample\n================\n\nA class containing sample code that demonstrates how Android applications can\nsend to and receive data from Pebble Smartwatch applications that support\nAppMessages.\n\nEmergency SMS: ExampleSmsActivity\n---------------------------------\nThis app looks like an ordinary clock, but pressing a button on your Pebble will discreetly alert a friend to your current location so they can rescue you. \n\n1. From the watch SDK, build and install demos/feature_app_messages_send to your Pebble.\n2. Launch the ExamplePebbleKitActivity on your phone.\n3. Tap \"GPS/SMS App Example\"\n4. Enter a phone number, or tap \"Select Contact\" to choose one.\n5. If the app hasn't already launched on your watch, pick GPS/SMS Time from the watch menu\n6. On your watch, press the up button\n\nYou'll see GPS start up on your phone.  After it gets a fix, the number you entered will receive two texts: one with GPS coordinates, and another with the address corresponding to those coordinates (if the Geocoding API can find one.)\n\nNote: this app will only function if it's in the foreground, and the screen is on.\n\n---\n\nPebble-to-pebble communication via Google Cloud Messaging and NFC: ExampleGCMActivity\n-------------------------------------------------------------------------------------\nThis app lets you pair a friend's Pebble with yours so you can send a vibrating notification from your watch to theirs.   It's called Happy Hour because it could be a good way to tell a friend about free beer or food.  You'll need two Pebbles and two NFC-enabled Android devices for this app.\n\n1. From the watch SDK, build and install demos/app_vibrate_paired_pebble to your Pebble.\n2. Launch the ExamplePebbleKitActivity on your phones.  \n3. Tap \"GCM Activity\" on both phones.\n4. Tap the two phones together.  When the Android Beam UI comes up, tap \"Touch to Beam\" on one of the phones.  Tap the two phones again, and tap the send button on the other phone.\n5. If the app hasn't already launched on your watch, pick Happy Hour from the watch menu\n6. The phones are now paired.  Pressing the up button on the watch will make the other watch vibrate.\n\nHow it works: the NFC tap sends one phone's GCM id to the other phone.  We ping the GCM server directly from the phone, rather than needing to have a backend.  When a GCM notification arrives, it sends an app message to the watch, causing it to vibrate.\n\nNote: this app will only function if it's in the foreground, and the screen is on.\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/SportsDemo-Android.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.path=\"$MODULE_DIR$\" external.root.project.path=\"$MODULE_DIR$\" external.system.id=\"GRADLE\" external.system.module.group=\"\" external.system.module.version=\"unspecified\" type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"FacetManager\">\n    <facet type=\"java-gradle\" name=\"Java-Gradle\">\n      <configuration>\n        <option name=\"BUILD_FOLDER_PATH\" value=\"$MODULE_DIR$/build\" />\n      </configuration>\n    </facet>\n  </component>\n  <component name=\"NewModuleRootManager\" inherit-compiler-output=\"true\">\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$\">\n      <excludeFolder url=\"file://$MODULE_DIR$/.gradle\" />\n    </content>\n    <orderEntry type=\"inheritedJdk\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n  </component>\n</module>\n\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/ant.properties",
    "content": "# This file is used to override default values used by the Ant build system.\n#\n# This file must be checked into Version Control Systems, as it is\n# integral to the build system of your project.\n\n# This file is only used by the Ant script.\n\n# You can use this to override default values such as\n#  'source.dir' for the location of your java source folder and\n#  'out.dir' for the location of your output folder.\n\n# You can also use it define how the release builds are signed by declaring\n# the following properties:\n#  'key.store' for the location of your keystore and\n#  'key.alias' for the name of the key to use.\n# The password will be asked during the build when you use the 'release' target.\n\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/app/app.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.path=\"$MODULE_DIR$\" external.root.project.path=\"$MODULE_DIR$/..\" external.system.id=\"GRADLE\" external.system.module.group=\"SportsDemo-Android\" external.system.module.version=\"unspecified\" type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"FacetManager\">\n    <facet type=\"android-gradle\" name=\"Android-Gradle\">\n      <configuration>\n        <option name=\"GRADLE_PROJECT_PATH\" value=\":app\" />\n      </configuration>\n    </facet>\n    <facet type=\"android\" name=\"Android\">\n      <configuration>\n        <option name=\"SELECTED_BUILD_VARIANT\" value=\"debug\" />\n        <option name=\"SELECTED_TEST_ARTIFACT\" value=\"_android_test_\" />\n        <option name=\"ASSEMBLE_TASK_NAME\" value=\"assembleDebug\" />\n        <option name=\"COMPILE_JAVA_TASK_NAME\" value=\"compileDebugSources\" />\n        <option name=\"ASSEMBLE_TEST_TASK_NAME\" value=\"assembleDebugTest\" />\n        <option name=\"SOURCE_GEN_TASK_NAME\" value=\"generateDebugSources\" />\n        <option name=\"TEST_SOURCE_GEN_TASK_NAME\" value=\"generateDebugTestSources\" />\n        <option name=\"ALLOW_USER_CONFIGURATION\" value=\"false\" />\n        <option name=\"MANIFEST_FILE_RELATIVE_PATH\" value=\"/src/main/AndroidManifest.xml\" />\n        <option name=\"RES_FOLDER_RELATIVE_PATH\" value=\"/src/main/res\" />\n        <option name=\"RES_FOLDERS_RELATIVE_PATH\" value=\"file://$MODULE_DIR$/src/main/res\" />\n        <option name=\"ASSETS_FOLDER_RELATIVE_PATH\" value=\"/src/main/assets\" />\n      </configuration>\n    </facet>\n  </component>\n  <component name=\"NewModuleRootManager\" inherit-compiler-output=\"false\">\n    <output url=\"file://$MODULE_DIR$/build/intermediates/classes/debug\" />\n    <output-test url=\"file://$MODULE_DIR$/build/intermediates/classes/test/debug\" />\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$\">\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/r/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/aidl/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/buildConfig/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/rs/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/res/rs/debug\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/res/generated/debug\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/r/test/debug\" isTestSource=\"true\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/aidl/test/debug\" isTestSource=\"true\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/buildConfig/test/debug\" isTestSource=\"true\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/rs/test/debug\" isTestSource=\"true\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/res/rs/test/debug\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/res/generated/test/debug\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/res\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/resources\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/assets\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/aidl\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/java\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/jni\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/rs\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/res\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/resources\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/assets\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/aidl\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/java\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/jni\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/rs\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/res\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/resources\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/assets\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/aidl\" isTestSource=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/java\" isTestSource=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/jni\" isTestSource=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/rs\" isTestSource=\"true\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/assets\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/bundles\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/classes\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/dependency-cache\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/dex\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/dex-cache\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/incremental\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/jacoco\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/javaResources\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/libs\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/lint\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/manifests\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/ndk\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/pre-dexed\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/proguard\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/res\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/rs\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/symbols\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/outputs\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/tmp\" />\n    </content>\n    <orderEntry type=\"jdk\" jdkName=\"Android API 17 Platform\" jdkType=\"Android SDK\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n    <orderEntry type=\"library\" exported=\"\" name=\"pebblekit-2.6.0\" level=\"project\" />\n    <orderEntry type=\"library\" exported=\"\" name=\"support-v4-r7\" level=\"project\" />\n  </component>\n</module>\n\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nrepositories {\n    mavenCentral()\n    maven { url \"https://oss.sonatype.org/content/groups/public/\" }\n}\n\nandroid {\n    compileSdkVersion 17\n    buildToolsVersion '20.0.0'\n\n    defaultConfig {\n        applicationId \"com.example.pebblekit.sports\"\n        minSdkVersion 14\n        targetSdkVersion 17\n    }\n\n    lintOptions {\n        abortOnError false\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'\n        }\n    }\n}\n\ndependencies {\n    compile 'com.getpebble:pebblekit:2.6.0'\n    compile 'com.google.android:support-v4:r7@jar'\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.example.PebbleKitExample\"\n  android:versionCode=\"1\"\n  android:versionName=\"1.0\">\n\n  <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />\n  <uses-permission android:name=\"android.permission.INTERNET\" />\n  <uses-permission android:name=\"android.permission.SEND_SMS\"/>\n  <uses-permission android:name=\"android.permission.READ_CONTACTS\"/>\n  <uses-permission android:name=\"android.permission.NFC\" />\n  <uses-feature android:name=\"android.hardware.nfc\" />\n  \n  <!-- Keeps the processor from sleeping when a message is received. -->\n  <uses-permission android:name=\"android.permission.WAKE_LOCK\" />\n\n  <application android:label=\"@string/app_name\">\n\n      <activity\n      android:name=\".ExampleSportsActivity\"\n      android:label=\"@string/activity_sports\">\n          <intent-filter>\n              <action android:name=\"android.intent.action.MAIN\" />\n              <category android:name=\"android.intent.category.LAUNCHER\" />\n          </intent-filter>\n      </activity>\n\n\n  </application>\n</manifest> \n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/app/src/main/java/com/example/PebbleKitExample/ExampleSportsActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.view.View;\nimport android.widget.TextView;\nimport com.getpebble.android.kit.Constants;\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\n\nimport java.util.Random;\n\n/**\n * Sample code demonstrating how Android applications can send+receive data using the 'Sports' app, one of Pebble's\n * built-in watch-apps that supports app messaging.\n */\npublic class ExampleSportsActivity extends Activity {\n\n    private static final String TAG = \"ExampleSportsActivity\";\n\n    private final Random rand = new Random();\n    private PebbleKit.PebbleDataReceiver sportsDataHandler = null;\n    private int sportsState = Constants.SPORTS_STATE_INIT;\n    private boolean useMetric = false;\n    private boolean isPaceLabel = true;\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_sports);\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (sportsDataHandler != null) {\n            unregisterReceiver(sportsDataHandler);\n            sportsDataHandler = null;\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        final Handler handler = new Handler();\n\n        // To receive data back from the sports watch-app, Android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        //\n        // In this example, we're registering a receiver to listen for\n        // changes in the activity state sent from the watch, allowing\n        // us the pause/resume the activity when the user presses a\n        // button in the watch-app.\n        sportsDataHandler = new PebbleKit.PebbleDataReceiver(Constants.SPORTS_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                int newState = data.getInteger(Constants.SPORTS_STATE_KEY).intValue();\n                sportsState = newState;\n\n                PebbleKit.sendAckToPebble(context, transactionId);\n\n                handler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        updateUi();\n                    }\n                });\n            }\n        };\n        PebbleKit.registerReceivedDataHandler(this, sportsDataHandler);\n    }\n\n    public void updateUi() {\n        TextView statusText = (TextView) findViewById(R.id.status);\n        if (sportsState == Constants.SPORTS_STATE_RUNNING) {\n            statusText.setText(\"Running\");\n        } else {\n            statusText.setText(\"Paused\");\n        }\n    }\n\n    // Send a broadcast to launch the specified application on the connected Pebble\n    public void startWatchApp(View view) {\n        PebbleKit.startAppOnPebble(getApplicationContext(), Constants.SPORTS_UUID);\n    }\n\n    // Send a broadcast to close the specified application on the connected Pebble\n    public void stopWatchApp(View view) {\n        PebbleKit.closeAppOnPebble(getApplicationContext(), Constants.SPORTS_UUID);\n    }\n\n    // A custom icon and name can be applied to the sports-app to\n    // provide some support for \"branding\" your Pebble-enabled sports\n    // application on the watch.\n    //\n    // It is recommended that applications customize the sports\n    // application before launching it. Only one application may\n    // customize the sports application at a time on a first-come,\n    // first-serve basis.\n    public void customizeWatchApp(View view) {\n        final String customAppName = \"My Sports App\";\n        final Bitmap customIcon = BitmapFactory.decodeResource(getResources(), R.drawable.watch);\n\n        PebbleKit.customizeWatchApp(\n                getApplicationContext(), Constants.PebbleAppType.SPORTS, customAppName, customIcon);\n    }\n\n    // Push (distance, time, pace) data to be displayed on Pebble's Sports app.\n    //\n    // To simplify formatting, values are transmitted to the watch as strings.\n    public void updateWatchApp(View view) {\n        String time = String.format(\"%02d:%02d\", rand.nextInt(60), rand.nextInt(60));\n        String distance = String.format(\"%02.02f\", 32 * rand.nextDouble());\n\tString addl_data = String.format(\"%02d:%02d\", rand.nextInt(10), rand.nextInt(60));\n\n        PebbleDictionary data = new PebbleDictionary();\n        data.addString(Constants.SPORTS_TIME_KEY, time);\n        data.addString(Constants.SPORTS_DISTANCE_KEY, distance);\n\tdata.addString(Constants.SPORTS_DATA_KEY, addl_data);\n\tdata.addUint8(Constants.SPORTS_LABEL_KEY, (byte) (isPaceLabel ? Constants.SPORTS_DATA_SPEED : Constants.SPORTS_DATA_PACE));\n\n        PebbleKit.sendDataToPebble(getApplicationContext(), Constants.SPORTS_UUID, data);\n\tisPaceLabel = !isPaceLabel;\n    }\n\n    // The units in the sports app can be toggled between Metric (1) and Imperial (0)\n    // by sending the following message to Pebble once the sports app is running.\n    public void changeUnitsOnWatch(View view) {\n        PebbleDictionary data = new PebbleDictionary();\n        data.addUint8(Constants.SPORTS_UNITS_KEY,\n                (byte) (useMetric ? Constants.SPORTS_UNITS_METRIC : Constants.SPORTS_UNITS_IMPERIAL));\n\n        PebbleKit.sendDataToPebble(getApplicationContext(), Constants.SPORTS_UUID, data);\n        useMetric = !useMetric;\n    }\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/app/src/main/res/layout/activity_sports.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:orientation=\"vertical\"\n  android:layout_width=\"fill_parent\"\n  android:layout_height=\"fill_parent\"\n  android:padding=\"10dp\">\n\n  <ImageView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:id=\"@+id/imageView\"\n    android:layout_gravity=\"center\"\n    android:src=\"@drawable/running\" />\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Paused\"\n    android:id=\"@+id/status\"\n    android:layout_gravity=\"center\"\n    android:typeface=\"sans\"\n    android:textStyle=\"bold\"\n    android:textSize=\"32sp\"\n    android:layout_marginTop=\"5dp\" />\n\n  <LinearLayout\n    android:orientation=\"horizontal\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\"\n    android:layout_marginTop=\"20dp\">\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"fill_parent\"\n      android:text=\"Start App\"\n      android:id=\"@+id/button\"\n      android:onClick=\"startWatchApp\" />\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Stop App\"\n      android:id=\"@+id/button2\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"stopWatchApp\" />\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Customize App\"\n      android:id=\"@+id/button1\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"customizeWatchApp\" />\n  </LinearLayout>\n\n  <Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Update Data\"\n    android:id=\"@+id/button3\"\n    android:layout_gravity=\"center\"\n    android:onClick=\"updateWatchApp\" />\n\n  <Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Change Units\"\n    android:id=\"@+id/button4\"\n    android:layout_gravity=\"center\"\n    android:onClick=\"changeUnitsOnWatch\" />\n\n</LinearLayout>\n\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/app/src/main/res/menu/options_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n  <!-- FIXME is there a way to avoid using the condensed titles here, perhaps by stacking the items? -->\n    <item android:id=\"@+id/add_mi\" android:title=\"Add\" android:visible=\"true\" android:enabled=\"true\" android:titleCondensed=\"+\"></item>\n    <item android:id=\"@+id/remove_all_checked_mi\" android:enabled=\"true\" android:titleCondensed=\"X\" android:title=\"Remove Checked\" android:visible=\"true\"></item>\n</menu>"
  },
  {
    "path": "sports-demo/SportsDemo-Android/app/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"item_height\">67dp</dimen>\n    <dimen name=\"section_div_height\">20dp</dimen>\n</resources>\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/app/src/main/res/values/dslv_attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<resources>\n  <declare-styleable name=\"DragSortListView\">\n    <attr name=\"collapsed_height\" format=\"dimension\" />\n    <attr name=\"drag_scroll_start\" format=\"float\" />\n    <attr name=\"max_drag_scroll_speed\" format=\"float\" />\n    <attr name=\"float_background_color\" format=\"color\" />\n    <attr name=\"remove_mode\">\n      <enum name=\"clickRemove\" value=\"0\" />\n      <enum name=\"flingRemove\" value=\"1\" />\n    </attr>\n    <attr name=\"track_drag_sort\" format=\"boolean\"/>\n    <attr name=\"float_alpha\" format=\"float\"/>\n    <attr name=\"slide_shuffle_speed\" format=\"float\"/>\n    <attr name=\"remove_animation_duration\" format=\"integer\"/>\n    <attr name=\"drop_animation_duration\" format=\"integer\"/>\n    <attr name=\"drag_enabled\" format=\"boolean\" />\n    <attr name=\"sort_enabled\" format=\"boolean\" />\n    <attr name=\"remove_enabled\" format=\"boolean\" />\n    <attr name=\"drag_start_mode\">\n      <enum name=\"onDown\" value=\"0\" />\n      <enum name=\"onMove\" value=\"1\" />\n      <enum name=\"onLongPress\" value=\"2\"/>\n    </attr>\n    <attr name=\"drag_handle_id\" format=\"integer\" />\n    <attr name=\"fling_handle_id\" format=\"integer\" />\n    <attr name=\"click_remove_id\" format=\"integer\" />\n    <attr name=\"use_default_controller\" format=\"boolean\" />\n  </declare-styleable>\n</resources>\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/app/src/main/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item type=\"id\" name=\"drag_handle\" />\n    <item type=\"id\" name=\"click_remove\" />\n</resources>\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"app_name\">PebbleKit Sports Example</string>\n  <string name=\"activity_sports\">Sports App Example</string>\n</resources>\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n    repositories {\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:1.0.1'\n    }\n}\n\nallprojects {\n    repositories {\n        jcenter()\n    }\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/build.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project name=\"PebbleKitExample\" default=\"help\">\n\n    <!-- The local.properties file is created and updated by the 'android' tool.\n         It contains the path to the SDK. It should *NOT* be checked into\n         Version Control Systems. -->\n    <property file=\"local.properties\" />\n\n    <!-- The ant.properties file can be created by you. It is only edited by the\n         'android' tool to add properties to it.\n         This is the place to change some Ant specific build properties.\n         Here are some properties you may want to change/update:\n\n         source.dir\n             The name of the source directory. Default is 'src'.\n         out.dir\n             The name of the output directory. Default is 'bin'.\n\n         For other overridable properties, look at the beginning of the rules\n         files in the SDK, at tools/ant/build.xml\n\n         Properties related to the SDK location or the project target should\n         be updated using the 'android' tool with the 'update' action.\n\n         This file is an integral part of the build system for your\n         application and should be checked into Version Control Systems.\n\n         -->\n    <property file=\"ant.properties\" />\n\n    <!-- if sdk.dir was not set from one of the property file, then\n         get it from the ANDROID_HOME env var.\n         This must be done before we load project.properties since\n         the proguard config can use sdk.dir -->\n    <property environment=\"env\" />\n    <condition property=\"sdk.dir\" value=\"${env.ANDROID_HOME}\">\n        <isset property=\"env.ANDROID_HOME\" />\n    </condition>\n\n    <!-- The project.properties file is created and updated by the 'android'\n         tool, as well as ADT.\n\n         This contains project specific properties such as project target, and library\n         dependencies. Lower level build properties are stored in ant.properties\n         (or in .classpath for Eclipse projects).\n\n         This file is an integral part of the build system for your\n         application and should be checked into Version Control Systems. -->\n    <loadproperties srcFile=\"project.properties\" />\n\n    <!-- quick check on sdk.dir -->\n    <fail\n            message=\"sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable.\"\n            unless=\"sdk.dir\"\n    />\n\n    <!--\n        Import per project custom build rules if present at the root of the project.\n        This is the place to put custom intermediary targets such as:\n            -pre-build\n            -pre-compile\n            -post-compile (This is typically used for code obfuscation.\n                           Compiled code location: ${out.classes.absolute.dir}\n                           If this is not done in place, override ${out.dex.input.absolute.dir})\n            -post-package\n            -post-build\n            -pre-clean\n    -->\n    <import file=\"custom_rules.xml\" optional=\"true\" />\n\n    <!-- Import the actual build file.\n\n         To customize existing targets, there are two options:\n         - Customize only one target:\n             - copy/paste the target into this file, *before* the\n               <import> task.\n             - customize it to your needs.\n         - Customize the whole content of build.xml\n             - copy/paste the content of the rules files (minus the top node)\n               into this file, replacing the <import> task.\n             - customize to your needs.\n\n         ***********************\n         ****** IMPORTANT ******\n         ***********************\n         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,\n         in order to avoid having your file be overridden by tools such as \"android update project\"\n    -->\n    <!-- version-tag: 1 -->\n    <import file=\"${sdk.dir}/tools/ant/build.xml\" />\n\n</project>\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Mon Feb 09 13:18:26 PST 2015\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-2.2.1-all.zip\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# For Cygwin, ensure paths are in UNIX format before anything is touched.\nif $cygwin ; then\n    [ -n \"$JAVA_HOME\" ] && JAVA_HOME=`cygpath --unix \"$JAVA_HOME\"`\nfi\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >&-\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >&-\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\r\nset CMD_LINE_ARGS=%$\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/proguard-project.txt",
    "content": "# To enable ProGuard in your project, edit project.properties\n# to define the proguard.config property as described in that file.\n#\n# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in ${sdk.dir}/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the ProGuard\n# include property in project.properties.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/project.properties",
    "content": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# This file must be checked in Version Control Systems.\n#\n# To customize properties used by the Ant build system edit\n# \"ant.properties\", and override values to adapt the script to your\n# project structure.\n#\n# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):\n#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt\n\n# Project target.\ntarget=android-14\nandroid.library.reference.1=../../../PebbleKit-Android/PebbleKit\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/res/layout/activity_gcm.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:orientation=\"vertical\"\n  android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Run this Activity on the other phone you want to pair with, then tap.\"\n    android:id=\"@+id/textGcmStatus\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"24sp\" />\n\n</LinearLayout>"
  },
  {
    "path": "sports-demo/SportsDemo-Android/res/layout/activity_golf.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:orientation=\"vertical\"\n  android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"New Text\"\n    android:id=\"@+id/textBack\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"24sp\" />\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"New Text\"\n    android:id=\"@+id/textMiddle\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"32sp\"\n    android:textStyle=\"bold\" />\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"New Text\"\n    android:id=\"@+id/textFront\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"24sp\" />\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"New Text\"\n    android:id=\"@+id/textHole\"\n    android:layout_gravity=\"center\"\n    android:layout_marginTop=\"15dp\"\n    android:textSize=\"24sp\" />\n\n  <LinearLayout\n    android:orientation=\"horizontal\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\"\n    android:layout_margin=\"5dp\">\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Start App\"\n      android:id=\"@+id/button\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"startWatchApp\"/>\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Stop App\"\n      android:id=\"@+id/button1\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"stopWatchApp\"/>\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Customize App\"\n      android:id=\"@+id/button2\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"customizeWatchApp\"/>\n\n  </LinearLayout>\n\n  <Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Prev Hole\"\n    android:id=\"@+id/button4\"\n    android:layout_gravity=\"center\"\n    android:onClick=\"goPrevious\"/>\n\n  <Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Next Hole\"\n    android:id=\"@+id/button3\"\n    android:layout_gravity=\"center\"\n    android:onClick=\"goNext\"/>\n\n</LinearLayout>"
  },
  {
    "path": "sports-demo/SportsDemo-Android/res/layout/activity_sms.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:orientation=\"vertical\"\n  android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Number to send text to\"\n    android:id=\"@+id/textBack\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"24sp\" />\n\n  <EditText\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"\"\n    android:id=\"@+id/destinationNumber\"\n    android:layout_gravity=\"center\"/>\n\n    <LinearLayout\n            android:orientation=\"horizontal\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_margin=\"5dp\">\n\n        <Button\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"Select Contact\"\n                android:id=\"@+id/pickContactButton\"\n                android:layout_gravity=\"center\"\n                android:onClick=\"pickContact\"/>\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "sports-demo/SportsDemo-Android/res/layout/activity_sports.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:orientation=\"vertical\"\n  android:layout_width=\"fill_parent\"\n  android:layout_height=\"fill_parent\"\n  android:padding=\"10dp\">\n\n  <ImageView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:id=\"@+id/imageView\"\n    android:layout_gravity=\"center\"\n    android:src=\"@drawable/running\" />\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Paused\"\n    android:id=\"@+id/status\"\n    android:layout_gravity=\"center\"\n    android:typeface=\"sans\"\n    android:textStyle=\"bold\"\n    android:textSize=\"32sp\"\n    android:layout_marginTop=\"5dp\" />\n\n  <LinearLayout\n    android:orientation=\"horizontal\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\"\n    android:layout_marginTop=\"20dp\">\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"fill_parent\"\n      android:text=\"Start App\"\n      android:id=\"@+id/button\"\n      android:onClick=\"startWatchApp\" />\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Stop App\"\n      android:id=\"@+id/button2\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"stopWatchApp\" />\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Customize App\"\n      android:id=\"@+id/button1\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"customizeWatchApp\" />\n  </LinearLayout>\n\n  <Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Update Data\"\n    android:id=\"@+id/button3\"\n    android:layout_gravity=\"center\"\n    android:onClick=\"updateWatchApp\" />\n\n  <Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Change Units\"\n    android:id=\"@+id/button4\"\n    android:layout_gravity=\"center\"\n    android:onClick=\"changeUnitsOnWatch\" />\n\n</LinearLayout>\n\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/res/layout/activity_todo_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<com.mobeta.android.dslv.DragSortListView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:dslv=\"http://schemas.android.com/apk/res/com.example.PebbleKitExample\"\n  android:id=\"@android:id/list\"\n  android:layout_width=\"fill_parent\"\n  android:layout_height=\"fill_parent\"\n  android:layout_margin=\"3dp\"\n  android:choiceMode=\"multipleChoice\"\n  android:dividerHeight=\"1px\"\n  android:padding=\"3dp\"\n  dslv:click_remove_id=\"@id/click_remove\"\n  dslv:collapsed_height=\"1px\"\n  dslv:drag_enabled=\"true\"\n  dslv:drag_handle_id=\"@id/drag_handle\"\n  dslv:drag_scroll_start=\"0.33\"\n  dslv:drag_start_mode=\"onDown\"\n  dslv:float_alpha=\"0.6\"\n  dslv:remove_enabled=\"true\"\n  dslv:remove_mode=\"clickRemove\"\n  dslv:slide_shuffle_speed=\"0.3\" />"
  },
  {
    "path": "sports-demo/SportsDemo-Android/res/layout/activity_weather.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:orientation=\"vertical\"\n  android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n\n  <Button\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Update Weather\"\n    android:id=\"@+id/button\"\n    android:onClick=\"updateWeather\"/>\n\n</LinearLayout>"
  },
  {
    "path": "sports-demo/SportsDemo-Android/res/layout/checkable_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mobeta.android.dslv.DragSortListView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:dslv=\"http://schemas.android.com/apk/res/com.example.PebbleKitExample\"\n    android:id=\"@android:id/list\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"fill_parent\"\n    android:layout_margin=\"3dp\"\n    android:choiceMode=\"multipleChoice\"\n    android:dividerHeight=\"1px\"\n    android:padding=\"3dp\"\n    dslv:click_remove_id=\"@id/click_remove\"\n    dslv:collapsed_height=\"1px\"\n    dslv:drag_enabled=\"true\"\n    dslv:drag_handle_id=\"@id/drag_handle\"\n    dslv:drag_scroll_start=\"0.33\"\n    dslv:drag_start_mode=\"onDown\"\n    dslv:float_alpha=\"0.6\"\n    dslv:remove_enabled=\"true\"\n    dslv:remove_mode=\"clickRemove\"\n    dslv:slide_shuffle_speed=\"0.3\" />\n\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/res/layout/dialog_add_todo_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\" >\n    \n    <EditText\n        android:id=\"@+id/todo_list_add_item_dialog_description\"\n        android:inputType=\"text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"16dp\"\n        android:layout_marginLeft=\"4dp\"\n        android:layout_marginRight=\"4dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:hint=\"@string/todo_list_add_item_dialog_description_hint\" />\n\n</LinearLayout>"
  },
  {
    "path": "sports-demo/SportsDemo-Android/res/layout/list_item_checkable.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.example.PebbleKitExample.TodoList.CheckableLinearLayout\n  xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"fill_parent\"\n  android:layout_height=\"@dimen/item_height\"\n  android:orientation=\"horizontal\">\n  <ImageView\n    android:id=\"@id/drag_handle\"\n    android:background=\"@drawable/drag\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"@dimen/item_height\"\n    android:layout_weight=\"0\" />\n  <CheckedTextView\n    android:checkMark=\"?android:attr/listChoiceIndicatorMultiple\"\n    android:id=\"@+id/text\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"@dimen/item_height\"\n    android:layout_weight=\"1\"\n    android:textAppearance=\"?android:attr/textAppearanceMedium\"\n    android:gravity=\"center_vertical\"\n    android:paddingLeft=\"8dp\" />\n  <ImageView\n    android:id=\"@id/click_remove\"\n    android:background=\"@drawable/delete_x\"\n    android:layout_width=\"@dimen/item_height\"\n    android:layout_height=\"@dimen/item_height\"\n    android:layout_weight=\"0\" />\n</com.example.PebbleKitExample.TodoList.CheckableLinearLayout>\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/res/menu/options_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n  <!-- FIXME is there a way to avoid using the condensed titles here, perhaps by stacking the items? -->\n    <item android:id=\"@+id/add_mi\" android:title=\"Add\" android:visible=\"true\" android:enabled=\"true\" android:titleCondensed=\"+\"></item>\n    <item android:id=\"@+id/remove_all_checked_mi\" android:enabled=\"true\" android:titleCondensed=\"X\" android:title=\"Remove Checked\" android:visible=\"true\"></item>\n</menu>"
  },
  {
    "path": "sports-demo/SportsDemo-Android/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"item_height\">67dp</dimen>\n    <dimen name=\"section_div_height\">20dp</dimen>\n</resources>\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/res/values/dslv_attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<resources>\n  <declare-styleable name=\"DragSortListView\">\n    <attr name=\"collapsed_height\" format=\"dimension\" />\n    <attr name=\"drag_scroll_start\" format=\"float\" />\n    <attr name=\"max_drag_scroll_speed\" format=\"float\" />\n    <attr name=\"float_background_color\" format=\"color\" />\n    <attr name=\"remove_mode\">\n      <enum name=\"clickRemove\" value=\"0\" />\n      <enum name=\"flingRemove\" value=\"1\" />\n    </attr>\n    <attr name=\"track_drag_sort\" format=\"boolean\"/>\n    <attr name=\"float_alpha\" format=\"float\"/>\n    <attr name=\"slide_shuffle_speed\" format=\"float\"/>\n    <attr name=\"remove_animation_duration\" format=\"integer\"/>\n    <attr name=\"drop_animation_duration\" format=\"integer\"/>\n    <attr name=\"drag_enabled\" format=\"boolean\" />\n    <attr name=\"sort_enabled\" format=\"boolean\" />\n    <attr name=\"remove_enabled\" format=\"boolean\" />\n    <attr name=\"drag_start_mode\">\n      <enum name=\"onDown\" value=\"0\" />\n      <enum name=\"onMove\" value=\"1\" />\n      <enum name=\"onLongPress\" value=\"2\"/>\n    </attr>\n    <attr name=\"drag_handle_id\" format=\"integer\" />\n    <attr name=\"fling_handle_id\" format=\"integer\" />\n    <attr name=\"click_remove_id\" format=\"integer\" />\n    <attr name=\"use_default_controller\" format=\"boolean\" />\n  </declare-styleable>\n</resources>\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item type=\"id\" name=\"drag_handle\" />\n    <item type=\"id\" name=\"click_remove\" />\n</resources>\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"app_name\">ExamplePebbleKitActivity</string>\n  <string name=\"activity_golf\">Golf App Example</string>\n  <string name=\"activity_sports\">Sports App Example</string>\n  <string name=\"activity_weather\">Weather App Example</string>\n  <string name=\"activity_todo_list\">To-Do List Example</string>\n  <string-array name=\"jazz_artist_names\">\n      <item>Brad Mehldau</item>\n      <item>Joshua Redman</item>\n      <item>Chick Corea</item>\n      <item>Kurt Rosenwinkel</item>\n      <item>Miles Davis</item>\n      <item>Wayne Shorter</item>\n      <item>Michael Brecker</item>\n      <item>Herbie Hancock</item>\n      <item>Joe Zawinul</item>\n      <item>Brian Blade</item>\n      <item>Jeff Ballard</item>\n      <item>Larry Grenadier</item>\n      <item>Keith Jarrett</item>\n      <item>McCoy Tyner</item>\n      <item>Stephon Harris</item>\n      <item>Mark Turner</item>\n  </string-array>\n  <string name=\"todo_list_add_item_dialog_description_hint\">Short description</string>\n  <string name=\"todo_list_add_dialog_ok_button\">Append</string>\n  <string name=\"todo_list_add_dialog_cancel_button\">Cancel</string>\n  <string name=\"activity_sms\">Sms App Example</string>\n  <string name=\"activity_gcm\">GCM App Example</string>\n</resources>\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/settings.gradle",
    "content": "include ':app'\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/example/PebbleKitExample/ExampleGCMActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.content.SharedPreferences;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.nfc.NdefMessage;\nimport android.nfc.NdefRecord;\nimport android.nfc.NfcAdapter;\nimport android.nfc.NfcAdapter.*;\nimport android.nfc.NfcEvent;\nimport android.os.AsyncTask;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Message;\nimport android.os.Parcelable;\nimport android.text.format.Time;\n\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.google.android.gcm.GCMRegistrar;\n\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\n\nimport java.util.Random;\nimport java.util.UUID;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.IOException;\nimport java.nio.charset.Charset;\n\nimport org.apache.http.client.ClientProtocolException;\nimport org.apache.http.client.HttpClient;\nimport org.apache.http.client.methods.HttpPost;\nimport org.apache.http.entity.BasicHttpEntity;\nimport org.apache.http.HttpResponse;\nimport org.apache.http.impl.client.DefaultHttpClient;\n\n\n/**\n * Allows for sending messages between two Android-paired Pebbles via Google Cloud Messaging.\n * Uses NFC to exchange GCM registration IDs.\n *\n * Pressing a button on the Pebble running the companion app (app_vibrate_paired_pebble in watch examples) will\n * cause this to send a message via GCM to a phone paired via NFC.  That phone will use app_messages to\n * vibrate the Pebble it's paired with.\n *\n * @author matt.hornyak@getpebble.com\n *\n */\npublic class ExampleGCMActivity extends Activity implements CreateNdefMessageCallback,\n        OnNdefPushCompleteCallback {\n\n    AsyncTask<Void, Void, Void> mRegisterTask;\n\n    NfcAdapter mNfcAdapter;\n    private static final int MESSAGE_SENT = 1;\n\n    private final String TAG = \"ExampleGCMActivity\";\n    private final String PREF_GCM_ACTIVITY = \"pref_gcm\";\n    private final String PREF_PAIRED_ID = \"paired_gcm_id\";\n\n    static final String SENDER_ID = \"501014417325\";\n    static final String API_KEY = \"AIzaSyAg9KiFRSkQtvaOCA6ESesVawkmm7OnVUk\";\n\n    private final Random rand = new Random();\n    private final static UUID PEBBLE_APP_UUID = UUID.fromString(\"7BD103D3-0F87-4D31-AEF8-F5237A79C72E\");\n    private final static int MSG_CMD_OUT_KEY = 0x00;\n    private final static int MSG_CMD_IN_KEY = 0x01;\n\n    private final static int MSG_CMD_VIBRATE = 0x00;\n    private final static int MSG_CMD_UP = 0x01;\n\n    private PebbleKit.PebbleDataReceiver dataReceiver;\n\n    public static String myGcmId = \"\";\n    private String mPairedGcmId;\n    private TextView mInfoText;\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_gcm);\n\n        mInfoText = (TextView) findViewById(R.id.textGcmStatus);\n        loadPairedId();\n\n        if (mPairedGcmId != null && !mPairedGcmId.equals(\"\")) {\n            mInfoText.setText(\"Paired to another phone. Ready to use.\");\n        }  else {\n            mInfoText.setText(\"Run this Activity on the other phone you want to pair with, then tap them together.\");\n        }\n\n        // Check for available NFC Adapter\n        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);\n        if (mNfcAdapter == null) {\n            mInfoText.setText(\"NFC is not available on this device.\");\n        } else {\n            // Register callback to set NDEF message\n            mNfcAdapter.setNdefPushMessageCallback(this, this);\n            // Register callback to listen for message-sent success\n            mNfcAdapter.setOnNdefPushCompleteCallback(this, this);\n        }\n\n        // GCM\n\n        // Make sure the device has the proper dependencies.\n        GCMRegistrar.checkDevice(this);\n//        GCMRegistrar.checkManifest(this);\n\n        final String regId = GCMRegistrar.getRegistrationId(this);\n        if (regId.equals(\"\")) {\n            // Automatically registers application on startup.\n            GCMRegistrar.register(this, SENDER_ID);\n        } else {\n            myGcmId = regId;\n            // Device is already registered on GCM, check server.\n            if (!GCMRegistrar.isRegisteredOnServer(this)) {\n                GCMRegistrar.setRegisteredOnServer(this, true);\n            }\n        }\n\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (dataReceiver != null) {\n            unregisterReceiver(dataReceiver);\n            dataReceiver = null;\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        // In order to interact with the UI thread from a broadcast receiver, we need to perform any updates through\n        // an Android handler. For more information, see: http://developer.android.com/reference/android/os/Handler.html\n\n        // To receive data back from the app, android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        //\n        // In this example, we're registering a receiver to listen for\n        // button presses sent from the watch\n\n        dataReceiver = new PebbleKit.PebbleDataReceiver(PEBBLE_APP_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                final int cmd = data.getUnsignedInteger(MSG_CMD_IN_KEY).intValue();\n\n                mHandler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        // All data received from the Pebble must be ACK'd, otherwise you'll hit time-outs in the\n                        // watch-app which will cause the watch to feel \"laggy\" during periods of frequent\n                        // communication.\n                        PebbleKit.sendAckToPebble(context, transactionId);\n\n                        switch (cmd) {\n                            // send GCM message when the up button is pressed\n                            case MSG_CMD_UP:\n                                sendGCMMessageToPairedDevice();\n                                break;\n                            default:\n                                break;\n                        }\n                    }\n                });\n            }\n        };\n        PebbleKit.registerReceivedDataHandler(this, dataReceiver);\n        startWatchApp(getApplicationContext());\n\n        // Check to see that the Activity started due to an Android Beam\n        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {\n            processIntent(getIntent());\n        }\n    }\n\n    protected void onDestroy() {\n        GCMRegistrar.onDestroy(this);\n        super.onDestroy();\n    }\n\n    @Override\n    public void onNewIntent(Intent intent) {\n        // onResume gets called after this to handle the intent\n        setIntent(intent);\n    }\n\n    /**\n     * On an NFC tap, retrieve the GCM ID of the other device & save it\n     */\n    void processIntent(Intent intent) {\n        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(\n                NfcAdapter.EXTRA_NDEF_MESSAGES);\n\n        NdefMessage msg = (NdefMessage) rawMsgs[0];\n        // record 0 contains the MIME type, record 1 is the AAR, if present\n        String otherDeviceId = new String(msg.getRecords()[0].getPayload());\n        mInfoText.setText(\"Paired successfully. Pressing the up button on your Pebble while running the app will now vibrate the Pebble paired to that phone.\");\n\n        setPairedId(otherDeviceId);\n        sendGCMMessageToPairedDevice();\n    }\n\n    public NdefMessage createNdefMessage(NfcEvent event) {\n        Time time = new Time();\n        time.setToNow();\n        String text;\n        if (ExampleGCMActivity.myGcmId.equals(\"\")) {\n            text = \"NO-GCM-ID\";\n        } else {\n            text = ExampleGCMActivity.myGcmId;\n        }\n        NdefMessage msg = new NdefMessage(\n                new NdefRecord[] { createMimeRecord(\n                        \"application/com.example.android.beam\", text.getBytes())\n                });\n        return msg;\n    }\n\n    /**\n     * Creates a custom MIME type encapsulated in an NDEF record\n     *\n     * @param mimeType\n     */\n    public NdefRecord createMimeRecord(String mimeType, byte[] payload) {\n        byte[] mimeBytes = mimeType.getBytes(Charset.forName(\"US-ASCII\"));\n        NdefRecord mimeRecord = new NdefRecord(\n                NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload);\n        return mimeRecord;\n    }\n\n    /**\n     * Implementation for the OnNdefPushCompleteCallback interface\n     */\n    @Override\n    public void onNdefPushComplete(NfcEvent arg0) {\n        // A handler is needed to send messages to the activity when this\n        // callback occurs, because it happens from a binder thread\n        mHandler.obtainMessage(MESSAGE_SENT).sendToTarget();\n    }\n\n    /** This handler receives a message from onNdefPushComplete */\n    private final Handler mHandler = new Handler() {\n        @Override\n        public void handleMessage(Message msg) {\n            switch (msg.what) {\n                case MESSAGE_SENT:\n                    Toast.makeText(getApplicationContext(), \"GCM id sent\", Toast.LENGTH_LONG).show();\n                    break;\n            }\n        }\n    };\n\n    protected void loadPairedId() {\n        SharedPreferences settings = getSharedPreferences(PREF_GCM_ACTIVITY, 0);\n        mPairedGcmId = settings.getString(PREF_PAIRED_ID, null);\n    }\n\n    protected void setPairedId(String id) {\n        mPairedGcmId = id;\n        SharedPreferences settings = getSharedPreferences(PREF_GCM_ACTIVITY, 0);\n        SharedPreferences.Editor editor = settings.edit();\n        editor.putString(PREF_PAIRED_ID, mPairedGcmId);\n\n        editor.commit();\n    }\n\n    private void sendGCMMessageToPairedDevice() {\n        HttpClient httpclient = new DefaultHttpClient();\n\n        HttpPost httppost = new HttpPost(\"https://android.googleapis.com/gcm/send\");\n        httppost.setHeader(\"Authorization\", \"key=\" + API_KEY);\n        httppost.setHeader(\"Content-Type\", \"application/json\");\n\n        try {\n            String reqBody = String.format(\"{\\\"registration_ids\\\" : [\\\"%s\\\"],\\\"data\\\" : { \\\"hi\\\":\\\"pebble\\\"}}\", mPairedGcmId);\n            BasicHttpEntity e = new BasicHttpEntity();\n\n            ByteArrayInputStream is = new ByteArrayInputStream(reqBody.getBytes());\n            e.setContent(is);\n            httppost.setEntity(e);\n//            Log.e(TAG, \"Data being sent via push : \" + reqBody);\n\n            HttpResponse response = httpclient.execute(httppost);\n\n            Log.e(TAG, response.toString());\n        } catch (ClientProtocolException e) {\n            Log.e(TAG, e.getMessage());\n        } catch (IOException e) {\n            Log.e(TAG, e.getMessage());\n        }\n    }\n\n    public static void vibrateWatch(Context c) {\n        ExampleGCMActivity.startWatchApp(c);\n        PebbleDictionary data = new PebbleDictionary();\n        data.addUint8(MSG_CMD_OUT_KEY, (byte) MSG_CMD_VIBRATE);\n        PebbleKit.sendDataToPebble(c, PEBBLE_APP_UUID, data);\n    }\n\n    // Send a broadcast to launch the specified application on the connected Pebble\n    public static void startWatchApp(Context c) {\n        PebbleKit.startAppOnPebble(c, PEBBLE_APP_UUID);\n    }\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/example/PebbleKitExample/ExampleGolfActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.view.View;\nimport android.widget.TextView;\nimport com.getpebble.android.kit.Constants;\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\n\nimport java.util.Random;\n\n/**\n * Sample code demonstrating how Android applications can send+receive data using the 'Golf' app,\n * one of Pebble's built-in sports watch-apps.\n */\npublic class ExampleGolfActivity extends Activity {\n\n    private final Random rand = new Random();\n    private PebbleKit.PebbleDataReceiver dataReceiver;\n    private int appData[][] = new int[18][4];\n    private int selection = 0;\n\n    // Generate random (but somewhat believable) values to be displayed on the watch.\n    private void generateGolfData() {\n        for (int i = 0; i < appData.length; ++i) {\n            int backDistance = rand.nextInt(800) + 50;\n            appData[i][0] = 1 + rand.nextInt(5); // par\n            appData[i][1] = backDistance; // back of the green\n            appData[i][2] = backDistance - 15; // middle of the green\n            appData[i][3] = backDistance - 30; // front of the green\n        }\n    }\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_golf);\n        generateGolfData();\n        selection = 0;\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (dataReceiver != null) {\n            unregisterReceiver(dataReceiver);\n            dataReceiver = null;\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n\n        updateUi();\n\n        // In order to interact with the UI thread from a broadcast receiver, we need to perform any updates through\n        // an Android handler. For more information, see: http://developer.android.com/reference/android/os/Handler.html\n        final Handler handler = new Handler();\n\n        // To receive data back from the sports watch-app, android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        //\n        // In this example, we're registering a receiver to listen for\n        // button presses sent from the watch, allowing us to page\n        // through the holes displayed on the phone and watch.\n        dataReceiver = new PebbleKit.PebbleDataReceiver(Constants.GOLF_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                final int cmd = data.getUnsignedInteger(Constants.GOLF_CMD_KEY).intValue();\n\n                handler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        // All data received from the Pebble must be ACK'd, otherwise you'll hit time-outs in the\n                        // watch-app which will cause the watch to feel \"laggy\" during periods of frequent\n                        // communication.\n                        PebbleKit.sendAckToPebble(context, transactionId);\n\n                        switch (cmd) {\n                            case Constants.GOLF_CMD_NEXT:\n                                next();\n                                break;\n                            case Constants.GOLF_CMD_PREV:\n                                previous();\n                                break;\n                        }\n                    }\n                });\n            }\n        };\n        PebbleKit.registerReceivedDataHandler(this, dataReceiver);\n    }\n\n    // Send a broadcast to launch the specified application on the connected Pebble\n    public void startWatchApp(View view) {\n        PebbleKit.startAppOnPebble(getApplicationContext(), Constants.GOLF_UUID);\n    }\n\n    // Send a broadcast to close the specified application on the connected Pebble\n    public void stopWatchApp(View view) {\n        PebbleKit.closeAppOnPebble(getApplicationContext(), Constants.GOLF_UUID);\n    }\n\n    // A custom icon and name can be applied to the golf-app to\n    // provide some support for \"branding\" your Pebble-enabled sports\n    // application on the watch.\n    //\n    // It is recommended that applications customize the sports\n    // application before launching it. Only one application may\n    // customize the sports application at a time on a first-come,\n    // first-serve basis.\n    public void customizeWatchApp(View view) {\n        final String customAppName = \"My Golf App\";\n        final Bitmap customIcon = BitmapFactory.decodeResource(getResources(), R.drawable.watch);\n\n        PebbleKit.customizeWatchApp(\n                getApplicationContext(), Constants.PebbleAppType.GOLF, customAppName, customIcon);\n    }\n\n    // Update the Activity with the data for a given hole\n    public void updateUi() {\n        int holeInfo[] = appData[selection];\n\n        String holePar = String.format(\"Hole: %d Par: %d\", selection + 1, holeInfo[0]);\n        String back = String.format(\"%d\", holeInfo[1]);\n        String mid = String.format(\"%d\", holeInfo[2]);\n        String front = String.format(\"%d\", holeInfo[3]);\n\n        TextView parText = (TextView) findViewById(R.id.textHole);\n        parText.setText(holePar);\n\n        TextView backText = (TextView) findViewById(R.id.textBack);\n        backText.setText(back);\n\n        TextView midText = (TextView) findViewById(R.id.textMiddle);\n        midText.setText(mid);\n\n        TextView frontText = (TextView) findViewById(R.id.textFront);\n        frontText.setText(front);\n    }\n\n    // Push {range, hole, par} data to be displayed on Pebble's Golf app.\n    // To simplify formatting, values are transmitted to Pebble as null-terminated strings.\n    public void updateWatch() {\n        int holeInfo[] = appData[selection];\n\n        String hole = String.format(\"%d\", selection + 1);\n        String par = String.format(\"%d\", holeInfo[0]);\n        String back = String.format(\"%d\", holeInfo[1]);\n        String mid = String.format(\"%d\", holeInfo[2]);\n        String front = String.format(\"%d\", holeInfo[3]);\n\n        // All data sent handled by PebbleKit is wrapped in a PebbleDictionary. The interface is somewhat similar to\n        // Map<Integer, Object>, as PebbleDictionaries may contain heterogeneous types.\n        //\n        // Here we are building up a Dictionary that maps integer keys to String values that will be interpreted &\n        // displayed by the watch.\n        PebbleDictionary data = new PebbleDictionary();\n        data.addString(Constants.GOLF_HOLE_KEY, hole);\n        data.addString(Constants.GOLF_PAR_KEY, par);\n        data.addString(Constants.GOLF_BACK_KEY, back);\n        data.addString(Constants.GOLF_MID_KEY, mid);\n        data.addString(Constants.GOLF_FRONT_KEY, front);\n\n        // Once the dictionary has been populated, it is scheduled to be sent to the watch. The sender/recipient of\n        // all PebbleKit messages is determined by the UUID. In this case, since we're sending the data to the golf app,\n        // we specify the Golf UUID.\n        PebbleKit.sendDataToPebble(getApplicationContext(), Constants.GOLF_UUID, data);\n    }\n\n    private void previous() {\n        if (selection > 0) {\n            selection -= 1;\n        }\n\n        updateUi();\n        updateWatch();\n    }\n\n    public void goPrevious(View view) {\n        previous();\n    }\n\n    public void next() {\n        if (selection < 17) {\n            selection += 1;\n        }\n\n        updateUi();\n        updateWatch();\n    }\n\n    public void goNext(View view) {\n        next();\n    }\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/example/PebbleKitExample/ExampleSmsActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.database.Cursor;\nimport android.location.*;\nimport android.telephony.PhoneNumberUtils;\nimport android.text.format.DateUtils;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.provider.ContactsContract;\nimport android.provider.ContactsContract.Contacts;\nimport android.provider.ContactsContract.CommonDataKinds.Phone;\nimport android.telephony.SmsManager;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.EditText;\n\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\n\nimport java.util.Random;\nimport java.util.UUID;\nimport java.util.List;\n\n/**\n * Sample activity that sends an SMS containing the user's location when the user presses a button on the watch *\n */\npublic class ExampleSmsActivity extends Activity {\n\n    private final String TAG = \"ExampleSmsActivity\";\n    private final String PREF_SMS_ACTIVITY = \"pref_sms\";\n    private final String PREF_NUMBER = \"phone_number\";\n\n    private final Random rand = new Random();\n    private final static UUID PEBBLE_APP_UUID = UUID.fromString(\"EC7EE5C6-8DDF-4089-AA84-C3396A11CC95\");\n    private final static int CMD_KEY = 0x00;\n    private final static int CMD_UP = 0x01;\n\n    private final static int REQUEST_CONTACT = 0x01;\n\n    private PebbleKit.PebbleDataReceiver dataReceiver;\n\n    private LocationManager mLocationManager;\n    private String mProviderName;\n    private Handler mHandler;\n\n    private boolean mLocationPending;\n\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_sms);\n\n        // allocate instance of the LocationManager\n        mLocationManager =\n                (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);\n\n        Criteria criteria = new Criteria();\n        criteria.setAccuracy(Criteria.ACCURACY_FINE);\n        criteria.setCostAllowed(false);\n\n        mProviderName = mLocationManager.getBestProvider(criteria, true);\n\n        mHandler = new Handler();\n\n        loadLastNumber();\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (dataReceiver != null) {\n            unregisterReceiver(dataReceiver);\n            dataReceiver = null;\n        }\n\n        mLocationManager.removeUpdates(mLocationListener);\n        saveLastNumber();\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        // In order to interact with the UI thread from a broadcast receiver, we need to perform any updates through\n        // an Android handler. For more information, see: http://developer.android.com/reference/android/os/Handler.html\n\n        // To receive data back from the app, android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        //\n        // In this example, we're registering a receiver to listen for\n        // button presses sent from the watch\n\n        dataReceiver = new PebbleKit.PebbleDataReceiver(PEBBLE_APP_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                final int cmd = data.getUnsignedInteger(CMD_KEY).intValue();\n\n                mHandler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        // All data received from the Pebble must be ACK'd, otherwise you'll hit time-outs in the\n                        // watch-app which will cause the watch to feel \"laggy\" during periods of frequent\n                        // communication.\n                        PebbleKit.sendAckToPebble(context, transactionId);\n\n                        switch (cmd) {\n                            // send SMS when the up button is pressed\n                            case CMD_UP:\n                                requestLocationForSms();\n                                break;\n                            default:\n                                break;\n                        }\n                    }\n                });\n            }\n        };\n        PebbleKit.registerReceivedDataHandler(this, dataReceiver);\n        startWatchApp(null);\n    }\n\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        if (resultCode == RESULT_OK) {\n            if(data != null && requestCode == REQUEST_CONTACT) {\n                Uri uriOfPhoneNumberRecord = data.getData();\n                String idOfPhoneRecord = uriOfPhoneNumberRecord.getLastPathSegment();\n                Cursor cursor = getContentResolver().query(Phone.CONTENT_URI, new String[]{Phone.NUMBER}, Phone._ID + \"=?\", new String[]{idOfPhoneRecord}, null);\n                if(cursor != null) {\n                    if(cursor.getCount() > 0) {\n                        cursor.moveToFirst();\n                        String formattedPhoneNumber = cursor.getString( cursor.getColumnIndex(Phone.NUMBER) );\n                        if (formattedPhoneNumber != null) {\n                            EditText destinationEditText = (EditText)findViewById(R.id.destinationNumber);\n                            destinationEditText.setText(PhoneNumberUtils.stripSeparators(formattedPhoneNumber));\n                        }\n                    }\n                    cursor.close();\n                }\n            }\n        }\n    }\n\n    public void pickContact(View view) {\n        Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);\n        intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);\n        startActivityForResult(intent, 1);\n    }\n\n    protected void loadLastNumber() {\n        SharedPreferences settings = getSharedPreferences(PREF_SMS_ACTIVITY, 0);\n        String number = settings.getString(PREF_NUMBER, \"\");\n\n        EditText destinationEditText = (EditText)findViewById(R.id.destinationNumber);\n        destinationEditText.setText(number);\n    }\n\n    protected void saveLastNumber() {\n        EditText destinationEditText = (EditText)findViewById(R.id.destinationNumber);\n        String destinationNumber = destinationEditText.getText().toString();\n        if (destinationNumber == null || destinationNumber.equals(\"\")) {\n            return;\n        }\n\n        SharedPreferences settings = getSharedPreferences(PREF_SMS_ACTIVITY, 0);\n        SharedPreferences.Editor editor = settings.edit();\n        editor.putString(PREF_NUMBER, destinationNumber);\n\n        editor.commit();\n    }\n\n    // Send a broadcast to launch the specified application on the connected Pebble\n    public void startWatchApp(View view) {\n        PebbleKit.startAppOnPebble(getApplicationContext(), PEBBLE_APP_UUID);\n    }\n\n    // Send a broadcast to close the specified application on the connected Pebble\n    public void stopWatchApp(View view) {\n        PebbleKit.closeAppOnPebble(getApplicationContext(), PEBBLE_APP_UUID);\n    }\n\n    private final LocationListener mLocationListener = new LocationListener() {\n        @Override\n        public void onLocationChanged(Location location) {\n            sendLocationSms(location);\n            mLocationManager.removeUpdates(this);\n        }\n\n        @Override\n        public void onStatusChanged(String provider, int status, Bundle bundle) {\n            Log.e(TAG, \"onStatusChanged\");\n        }\n\n        @Override\n        public void onProviderEnabled(String provider) {\n            Log.e(TAG, \"onProviderEnabled\");\n        }\n\n        @Override\n        public void onProviderDisabled(String provider) {\n            Log.e(TAG, \"onProviderDisabled\");\n        }\n    };\n\n    public void requestLocationForSms() {\n        if (mProviderName != null && mLocationPending == false) {\n            mLocationPending = true;\n\n            Location lastLocation = mLocationManager.getLastKnownLocation(mProviderName);\n             // if we have a location that's newer than 10 minutes, use it; otherwise get a new location\n            if (lastLocation != null && (System.currentTimeMillis() - lastLocation.getTime() > DateUtils.MINUTE_IN_MILLIS * 10)) {\n                mLocationManager.requestLocationUpdates(mProviderName,\n                    10000,\n                    10,\n                    mLocationListener);\n            } else {\n                 sendLocationSms(lastLocation);\n            }\n        }\n    }\n\n    public void sendLocationSms(Location l) {\n        if (mLocationPending) {\n            mLocationPending = false;\n\n            EditText destinationEditText = (EditText)findViewById(R.id.destinationNumber);\n            String destinationNumber = destinationEditText.getText().toString();\n            if (destinationNumber == null || destinationNumber.equals(\"\")) {\n                return;\n            }\n\n            // send SMS with GPS coordinates\n            SmsManager smsManager = SmsManager.getDefault();\n            String locationString = \"Get me: \" + l.getLatitude() + \", \" + l.getLongitude();\n            smsManager.sendTextMessage(destinationNumber, null, locationString, null, null);\n\n            // get address text if we can\n            Geocoder geocoder = new Geocoder(ExampleSmsActivity.this);\n\n            try {\n                List<Address> addresses = geocoder.getFromLocation(l.getLatitude(), l.getLongitude(), 1);\n\n                if (addresses.size() > 0) {\n                    Address a = addresses.get(0);\n                    String addressText = \"\";\n                    for (int i = 0; i <= a.getMaxAddressLineIndex(); i++) {\n                        addressText += a.getAddressLine(i) + \" \";\n                    }\n                    vibrateWatch(getApplicationContext());\n                    smsManager.sendTextMessage(destinationNumber, null, addressText, null, null);\n                }\n            } catch (Exception e) {\n                // unable to geocode\n            }\n        }\n    }\n\n    public static void vibrateWatch(Context c) {\n        PebbleDictionary data = new PebbleDictionary();\n        data.addUint8(CMD_KEY, (byte) CMD_UP);\n        PebbleKit.sendDataToPebble(c, PEBBLE_APP_UUID, data);\n    }\n\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/example/PebbleKitExample/ExampleSportsActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.view.View;\nimport android.widget.TextView;\nimport com.getpebble.android.kit.Constants;\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\n\nimport java.util.Random;\n\n/**\n * Sample code demonstrating how Android applications can send+receive data using the 'Sports' app, one of Pebble's\n * built-in watch-apps that supports app messaging.\n */\npublic class ExampleSportsActivity extends Activity {\n\n    private static final String TAG = \"ExampleSportsActivity\";\n\n    private final Random rand = new Random();\n    private PebbleKit.PebbleDataReceiver sportsDataHandler = null;\n    private int sportsState = Constants.SPORTS_STATE_INIT;\n    private boolean useMetric = false;\n    private boolean isPaceLabel = true;\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_sports);\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (sportsDataHandler != null) {\n            unregisterReceiver(sportsDataHandler);\n            sportsDataHandler = null;\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        final Handler handler = new Handler();\n\n        // To receive data back from the sports watch-app, Android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        //\n        // In this example, we're registering a receiver to listen for\n        // changes in the activity state sent from the watch, allowing\n        // us the pause/resume the activity when the user presses a\n        // button in the watch-app.\n        sportsDataHandler = new PebbleKit.PebbleDataReceiver(Constants.SPORTS_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                int newState = data.getUnsignedInteger(Constants.SPORTS_STATE_KEY).intValue();\n                sportsState = newState;\n\n                PebbleKit.sendAckToPebble(context, transactionId);\n\n                handler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        updateUi();\n                    }\n                });\n            }\n        };\n        PebbleKit.registerReceivedDataHandler(this, sportsDataHandler);\n    }\n\n    public void updateUi() {\n        TextView statusText = (TextView) findViewById(R.id.status);\n        if (sportsState == Constants.SPORTS_STATE_RUNNING) {\n            statusText.setText(\"Running\");\n        } else {\n            statusText.setText(\"Paused\");\n        }\n    }\n\n    // Send a broadcast to launch the specified application on the connected Pebble\n    public void startWatchApp(View view) {\n        PebbleKit.startAppOnPebble(getApplicationContext(), Constants.SPORTS_UUID);\n    }\n\n    // Send a broadcast to close the specified application on the connected Pebble\n    public void stopWatchApp(View view) {\n        PebbleKit.closeAppOnPebble(getApplicationContext(), Constants.SPORTS_UUID);\n    }\n\n    // A custom icon and name can be applied to the sports-app to\n    // provide some support for \"branding\" your Pebble-enabled sports\n    // application on the watch.\n    //\n    // It is recommended that applications customize the sports\n    // application before launching it. Only one application may\n    // customize the sports application at a time on a first-come,\n    // first-serve basis.\n    public void customizeWatchApp(View view) {\n        final String customAppName = \"My Sports App\";\n        final Bitmap customIcon = BitmapFactory.decodeResource(getResources(), R.drawable.watch);\n\n        PebbleKit.customizeWatchApp(\n                getApplicationContext(), Constants.PebbleAppType.SPORTS, customAppName, customIcon);\n    }\n\n    // Push (distance, time, pace) data to be displayed on Pebble's Sports app.\n    //\n    // To simplify formatting, values are transmitted to the watch as strings.\n    public void updateWatchApp(View view) {\n        String time = String.format(\"%02d:%02d\", rand.nextInt(60), rand.nextInt(60));\n        String distance = String.format(\"%02.02f\", 32 * rand.nextDouble());\n\tString addl_data = String.format(\"%02d:%02d\", rand.nextInt(10), rand.nextInt(60));\n\n        PebbleDictionary data = new PebbleDictionary();\n        data.addString(Constants.SPORTS_TIME_KEY, time);\n        data.addString(Constants.SPORTS_DISTANCE_KEY, distance);\n\tdata.addString(Constants.SPORTS_DATA_KEY, addl_data);\n\tdata.addUint8(Constants.SPORTS_LABEL_KEY, (byte) (isPaceLabel ? Constants.SPORTS_DATA_SPEED : Constants.SPORTS_DATA_PACE));\n\n        PebbleKit.sendDataToPebble(getApplicationContext(), Constants.SPORTS_UUID, data);\n\tisPaceLabel = !isPaceLabel;\n    }\n\n    // The units in the sports app can be toggled between Metric (1) and Imperial (0)\n    // by sending the following message to Pebble once the sports app is running.\n    public void changeUnitsOnWatch(View view) {\n        PebbleDictionary data = new PebbleDictionary();\n        data.addUint8(Constants.SPORTS_UNITS_KEY,\n                (byte) (useMetric ? Constants.SPORTS_UNITS_METRIC : Constants.SPORTS_UNITS_IMPERIAL));\n\n        PebbleKit.sendDataToPebble(getApplicationContext(), Constants.SPORTS_UUID, data);\n        useMetric = !useMetric;\n    }\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/example/PebbleKitExample/ExampleWeatherActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.location.Location;\nimport android.location.LocationListener;\nimport android.location.LocationManager;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.View;\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\nimport org.json.JSONObject;\n\nimport java.io.BufferedReader;\nimport java.io.InputStreamReader;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.util.UUID;\n\n/**\n * Sample activity demonstrating how to send data to a \"weather\" watch-app.\n *\n * The watch-app in question is available here:\n * https://github.com/pebble/pebble-apps/tree/master/demos/feature_app_messages\n *\n * @author zulak@getpebble.com\n */\npublic class ExampleWeatherActivity extends Activity {\n    // the tuple key corresponding to the weather icon displayed on the watch\n    private static final int ICON_KEY = 0;\n    // the tuple key corresponding to the temperature displayed on the watch\n    private static final int TEMP_KEY = 1;\n    // This UUID identifies the weather app\n    private static final UUID WEATHER_UUID = UUID.fromString(\"42c86ea4-1c3e-4a07-b889-2cccca914198\");\n\n    private LocationManager mLocationManager;\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_weather);\n        mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);\n    }\n\n    public void updateWeather(View view) {\n        // when this button is clicked, get the handset's approximate location and request weather data from a\n        // third-party web service\n        LocationListener locationListener = new LocationListener() {\n            public void onLocationChanged(Location location) {\n                mLocationManager.removeUpdates(this);\n                doWeatherUpdate(location);\n            }\n\n            public void onStatusChanged(String provider, int status, Bundle extras) {\n            }\n\n            public void onProviderEnabled(String provider) {\n            }\n\n            public void onProviderDisabled(String provider) {\n            }\n        };\n\n        mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);\n    }\n\n    public void sendWeatherDataToWatch(int weatherIconId, int temperatureCelsius) {\n        // Build up a Pebble dictionary containing the weather icon and the current temperature in degrees celsius\n        PebbleDictionary data = new PebbleDictionary();\n        data.addUint8(ICON_KEY, (byte) weatherIconId);\n        data.addString(TEMP_KEY, String.format(\"%d\\u00B0C\", temperatureCelsius));\n\n        // Send the assembled dictionary to the weather watch-app; this is a no-op if the app isn't running or is not\n        // installed\n        PebbleKit.sendDataToPebble(getApplicationContext(), WEATHER_UUID, data);\n    }\n\n    public void doWeatherUpdate(Location location) {\n        // A very sketchy, rough way of getting the local weather forecast from the phone's approximate location\n        // using the OpenWeatherMap webservice: http://openweathermap.org/wiki/API/JSON_API\n        double latitude = location.getLatitude();\n        double longitude = location.getLongitude();\n\n        try {\n            URL u = new URL(String.format(\"http://api.openweathermap.org/data/2.1/find/city?lat=%f&lon=%f&cnt=1\",\n                    latitude,\n                    longitude));\n\n            HttpURLConnection urlConnection = (HttpURLConnection) u.openConnection();\n            try {\n                BufferedReader reader =\n                        new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), \"UTF-8\"));\n                String json = reader.readLine();\n\n                JSONObject jsonObject = new JSONObject(json);\n                JSONObject l = jsonObject.getJSONArray(\"list\").getJSONObject(0);\n                JSONObject m = l.getJSONObject(\"main\");\n                double temperature = m.getDouble(\"temp\");\n                int wtype = l.getJSONArray(\"weather\").getJSONObject(0).getInt(\"id\");\n\n                int weatherIcon = getIconFromWeatherId(wtype);\n                int temp = (int) (temperature - 273.15);\n\n                sendWeatherDataToWatch(weatherIcon, temp);\n            } finally {\n                urlConnection.disconnect();\n            }\n\n            Log.d(\"WeatherActivity\", String.format(\"%f, %f\", latitude, longitude));\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    private int getIconFromWeatherId(int weatherId) {\n        if (weatherId < 600) {\n            return 2;\n        } else if (weatherId < 700) {\n            return 3;\n        } else if (weatherId > 800) {\n            return 1;\n        } else {\n            return 0;\n        }\n    }\n\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/example/PebbleKitExample/GCMIntentService.java",
    "content": "\npackage com.example.PebbleKitExample;\n\nimport android.app.Notification;\nimport android.app.NotificationManager;\nimport android.app.PendingIntent;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.util.Log;\n\nimport com.google.android.gcm.GCMBaseIntentService;\nimport com.google.android.gcm.GCMRegistrar;\n\n/**\n * IntentService responsible for handling GCM messages.\n */\npublic class GCMIntentService extends GCMBaseIntentService {\n\n    @SuppressWarnings(\"hiding\")\n    private static final String TAG = \"GCMIntentService\";\n\n    public GCMIntentService() {\n        super(ExampleGCMActivity.SENDER_ID);\n    }\n\n    @Override\n    protected void onRegistered(Context context, String registrationId) {\n        Log.i(TAG, \"Device registered: regId = \" + registrationId);\n        ExampleGCMActivity.myGcmId = registrationId;\n        GCMRegistrar.setRegisteredOnServer(context, true);\n    }\n\n    @Override\n    protected void onUnregistered(Context context, String registrationId) {\n         Log.i(TAG, \"Ignoring unregister callback\");\n    }\n\n    @Override\n    protected void onMessage(Context context, Intent intent) {\n        Log.i(TAG, \"Received message\");\n//        generateNotification(context, \"GCM message received!\");\n        vibrateWatch(context);\n    }\n\n    @Override\n    protected void onDeletedMessages(Context context, int total) {\n        Log.i(TAG, \"Received deleted messages notification\");\n    }\n\n    @Override\n    public void onError(Context context, String errorId) {\n        Log.i(TAG, \"Received error: \" + errorId);\n    }\n\n    @Override\n    protected boolean onRecoverableError(Context context, String errorId) {\n        // log message\n        Log.i(TAG, \"Received recoverable error: \" + errorId);\n        return super.onRecoverableError(context, errorId);\n    }\n\n    /**\n     * Issues a notification to inform the user that server has sent a message.\n     */\n    private static void generateNotification(Context context, String message) {\n        int icon = R.drawable.watch;\n        long when = System.currentTimeMillis();\n        NotificationManager notificationManager = (NotificationManager)\n                context.getSystemService(Context.NOTIFICATION_SERVICE);\n        Notification notification = new Notification(icon, message, when);\n        String title = context.getString(R.string.app_name);\n        Intent notificationIntent = new Intent(context, ExampleGCMActivity.class);\n        // set intent so it does not start a new activity\n        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |\n                Intent.FLAG_ACTIVITY_SINGLE_TOP);\n        PendingIntent intent =\n                PendingIntent.getActivity(context, 0, notificationIntent, 0);\n        notification.setLatestEventInfo(context, title, message, intent);\n        notification.flags |= Notification.FLAG_AUTO_CANCEL;\n        notificationManager.notify(0, notification);\n    }\n\n    private void vibrateWatch(Context c) {\n        ExampleGCMActivity.vibrateWatch(c);\n    }\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/example/PebbleKitExample/MainActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.R;\nimport android.app.ListActivity;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.view.View;\nimport android.widget.ArrayAdapter;\nimport android.widget.ListView;\nimport com.example.PebbleKitExample.TodoList.ExampleTodoListActivity;\n\npublic class MainActivity extends ListActivity {\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        String[] menu = {\n                \"Sports App Example\",\n                \"Golf App Example\",\n                \"Weather App Example\",\n                \"To-Do List Example\",\n                \"GPS/SMS App Example\",\n                \"GCM Activity\"\n        };\n\n        setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_1, menu));\n    }\n\n    @Override\n    protected void onListItemClick(final ListView l, final View v, final int position, final long id) {\n        Intent intent = null;\n        switch (position) {\n            case 0:\n                intent = new Intent(this, ExampleSportsActivity.class);\n                break;\n            case 1:\n                intent = new Intent(this, ExampleGolfActivity.class);\n                break;\n            case 2:\n                intent = new Intent(this, ExampleWeatherActivity.class);\n                break;\n            case 3:\n                intent = new Intent(this, ExampleTodoListActivity.class);\n                break;\n            case 4:\n                intent = new Intent(this, ExampleSmsActivity.class);\n                break;\n            case 5:\n                intent = new Intent(this, ExampleGCMActivity.class);\n                break;\n        }\n\n        if (intent != null) {\n            startActivity(intent);\n        }\n    }\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/example/PebbleKitExample/TodoList/CheckableLinearLayout.java",
    "content": "package com.example.PebbleKitExample.TodoList;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.widget.Checkable;\nimport android.widget.LinearLayout;\n\npublic class CheckableLinearLayout extends LinearLayout implements Checkable {\n\n    private static final int CHECKABLE_CHILD_INDEX = 1;\n    private Checkable child;\n\n    public CheckableLinearLayout(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    @Override\n    protected void onFinishInflate() {\n        super.onFinishInflate();\n        child = (Checkable) getChildAt(CHECKABLE_CHILD_INDEX);\n    }\n\n    @Override\n    public boolean isChecked() {\n        return child.isChecked();\n    }\n\n    @Override\n    public void setChecked(boolean checked) {\n        child.setChecked(checked);\n    }\n\n    @Override\n    public void toggle() {\n        child.toggle();\n    }\n\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/example/PebbleKitExample/TodoList/ExampleTodoListActivity.java",
    "content": "package com.example.PebbleKitExample.TodoList;\n\nimport android.app.AlertDialog;\nimport android.app.Dialog;\nimport android.app.ListActivity;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.os.*;\nimport android.util.Log;\nimport android.view.*;\nimport android.widget.AdapterView;\nimport android.widget.EditText;\nimport com.example.PebbleKitExample.R;\nimport com.getpebble.android.kit.PebbleKit;\n import com.getpebble.android.kit.util.PebbleDictionary;\nimport com.mobeta.android.dslv.DragSortListView;\n\nimport java.util.HashSet;\nimport java.util.UUID;\nimport java.util.concurrent.BlockingQueue;\nimport java.util.concurrent.LinkedBlockingQueue;\n\n/**\n * Sample activity demonstrating how to synchronize data with a \"To-Do List\" watch-app.\n */\npublic class ExampleTodoListActivity extends ListActivity {\n    private PebbleKit.PebbleDataReceiver dataReceiver;\n    private PebbleKit.PebbleAckReceiver ackReceiver;\n    private PebbleKit.PebbleNackReceiver nackReceiver;\n\n    private static final int APPEND_KEY = 0;\n    private static final int DELETE_KEY = 1;\n    private static final int MOVE_KEY = 2;\n    private static final int TOGGLE_KEY = 3;\n    private static final int FETCH_KEY = 4;\n\n    private static final UUID TODO_LIST_UUID = UUID.fromString(\"e0ca665a-cf96-4c09-bbea-aa113e8cc18f\");\n\n    private TodoListAdapter todoListAdapter;\n    private DialogManager dialogManager = new DialogManager();\n    private final MessageManager messageManager = new MessageManager();\n\n    /**\n     * Manages a thread-safe message queue using a Looper worker thread to complete blocking tasks.\n     */\n    public class MessageManager implements Runnable {\n        public Handler messageHandler;\n        private final BlockingQueue<PebbleDictionary> messageQueue = new LinkedBlockingQueue<PebbleDictionary>();\n        private Boolean isMessagePending = Boolean.valueOf(false);\n\n        @Override\n        public void run() {\n            Looper.prepare();\n            messageHandler = new Handler() {\n                @Override\n                public void handleMessage(Message msg) {\n                    Log.w(this.getClass().getSimpleName(), \"Please post() your blocking runnables to Mr Manager, \" +\n                            \"don't use sendMessage()\");\n                }\n\n            };\n            Looper.loop();\n        }\n\n        private void consumeAsync() {\n            messageHandler.post(new Runnable() {\n                @Override\n                public void run() {\n                    synchronized (isMessagePending) {\n                        if (isMessagePending.booleanValue()) {\n                            return;\n                        }\n\n                        synchronized (messageQueue) {\n                            if (messageQueue.size() == 0) {\n                                return;\n                            }\n                            PebbleKit.sendDataToPebble(getApplicationContext(), TODO_LIST_UUID, messageQueue.peek());\n                        }\n\n                        isMessagePending = Boolean.valueOf(true);\n                    }\n                }\n            });\n        }\n\n        public void notifyAckReceivedAsync() {\n            messageHandler.post(new Runnable() {\n                @Override\n                public void run() {\n                    synchronized (isMessagePending) {\n                        isMessagePending = Boolean.valueOf(false);\n                    }\n                    messageQueue.remove();\n                }\n            });\n            consumeAsync();\n        }\n\n        public void notifyNackReceivedAsync() {\n            messageHandler.post(new Runnable() {\n                @Override\n                public void run() {\n                    synchronized (isMessagePending) {\n                        isMessagePending = Boolean.valueOf(false);\n                    }\n                }\n            });\n            consumeAsync();\n        }\n\n        public boolean offer(final PebbleDictionary data) {\n            final boolean success = messageQueue.offer(data);\n\n            if (success) {\n                consumeAsync();\n            }\n\n            return success;\n        }\n    }\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_todo_list);\n\n        todoListAdapter = TodoListAdapter.createTodoListAdapter(getApplicationContext());\n\n        // Populate list before starting app on the Pebble\n        String[] dummyItems = getResources().getStringArray(R.array.jazz_artist_names);\n        todoListAdapter.addItems(dummyItems);\n\n        setListAdapter(todoListAdapter);\n        final DragSortListView dslv = getListViewAsDSLV();\n\n        dslv.setDropListener(new DragSortListView.DropListener() {\n            @Override\n            public void drop(final int from, final int to) {\n                if (from == to) {\n                    return;\n                }\n                todoListAdapter.moveItemFromIndexToIndex(from, to);\n                dslv.moveCheckState(from, to);\n\n                PebbleDictionary data = new PebbleDictionary();\n                data.addBytes(MOVE_KEY, new byte[]{(byte) from, (byte) to});\n                messageManager.offer(data);\n            }\n        });\n\n        dslv.setRemoveListener(new DragSortListView.RemoveListener() {\n            @Override\n            public void remove(final int which) {\n                final TodoListItem item = todoListAdapter.removeItemAtIndex(which);\n                if (item == null) {\n                    return;\n                }\n\n                dslv.removeCheckState(which);\n\n                // Notify the watch\n                PebbleDictionary data = new PebbleDictionary();\n                data.addUint8(DELETE_KEY, (byte) which);\n                messageManager.offer(data);\n            }\n        });\n\n        dslv.setOnItemClickListener(new AdapterView.OnItemClickListener() {\n            @Override\n            public void onItemClick(final AdapterView<?> parentAdapterView, final View view, final int position,\n                                    final long rowId) {\n                todoListAdapter.toggleItemCompletenessAtIndex(position);\n                PebbleDictionary data = new PebbleDictionary();\n                data.addUint8(TOGGLE_KEY, (byte) position);\n                messageManager.offer(data);\n            }\n        });\n\n        PebbleKit.startAppOnPebble(getApplicationContext(), TODO_LIST_UUID);\n    }\n\n    @Override\n    public void onStart() {\n        // FIXME do I need to do any cleanup in onStop()?\n        super.onStart();\n        new Thread(messageManager).start();\n\n    }\n\n    private DragSortListView getListViewAsDSLV() {\n        return (DragSortListView) super.getListView();\n    }\n\n    @Override\n    public DragSortListView getListView() {\n        return getListViewAsDSLV();\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (dataReceiver != null) {\n            unregisterReceiver(dataReceiver);\n            dataReceiver = null;\n        }\n\n        if (ackReceiver != null) {\n            unregisterReceiver(ackReceiver);\n            ackReceiver = null;\n        }\n\n        if (nackReceiver != null) {\n            unregisterReceiver(nackReceiver);\n            nackReceiver = null;\n        }\n\n        dialogManager.dismissAll();\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        // In order to interact with the UI thread from a broadcast receiver, we need to perform any updates through\n        // an Android handler. For more information, see: http://developer.android.com/reference/android/os/Handler\n        // .html\n        final Handler handler = new Handler();\n\n        // To receive data back from a watch-app, android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        dataReceiver = new PebbleKit.PebbleDataReceiver(TODO_LIST_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                handler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        // All data received from the Pebble must be ACK'd, otherwise you'll hit time-outs in the\n                        // watch-app which will cause the watch to feel \"laggy\" during periods of frequent\n                        // communication.\n                        PebbleKit.sendAckToPebble(context, transactionId);\n\n                        if (!data.iterator().hasNext()) {\n                            return;\n                        }\n\n                        final DragSortListView dslv = getListViewAsDSLV();\n\n                        final Long deleteValue = data.getUnsignedInteger(DELETE_KEY);\n                        if (deleteValue != null) {\n                            final int value = deleteValue.intValue();\n                            final TodoListItem item = todoListAdapter.removeItemAtIndex(value);\n                            if (item == null) {\n                                return;\n                            }\n\n                            dslv.removeCheckState(value);\n                        }\n\n                        final Long toggleValue = data.getUnsignedInteger(TOGGLE_KEY);\n                        if (toggleValue != null) {\n                            final int value = toggleValue.intValue();\n                            todoListAdapter.toggleItemCompletenessAtIndex(value);\n                            dslv.setItemChecked(value, todoListAdapter.getItem(value).isComplete());\n                        }\n\n                        final Long fetchValue = data.getUnsignedInteger(FETCH_KEY);\n                        if (fetchValue != null) {\n                            // Add entire list to messageQueue\n                            for (int i = 0; i < todoListAdapter.getCount(); i++) {\n                                PebbleDictionary data = new PebbleDictionary();\n                                TodoListItem item = todoListAdapter.getItem(i);\n                                data.addString(APPEND_KEY, item.getDescription());\n\n                                if (item.isComplete()) {\n                                    data.addUint8(TOGGLE_KEY, (byte) i);\n                                }\n                                if (!messageManager.offer(data)) {\n                                    return;\n                                }\n                            }\n                        }\n                    }\n                });\n            }\n        };\n\n        PebbleKit.registerReceivedDataHandler(this, dataReceiver);\n\n        ackReceiver = new PebbleKit.PebbleAckReceiver(TODO_LIST_UUID) {\n            @Override\n            public void receiveAck(final Context context, final int transactionId) {\n                messageManager.notifyAckReceivedAsync();\n            }\n        };\n\n        PebbleKit.registerReceivedAckHandler(this, ackReceiver);\n\n\n        nackReceiver = new PebbleKit.PebbleNackReceiver(TODO_LIST_UUID) {\n            @Override\n            public void receiveNack(final Context context, final int transactionId) {\n                messageManager.notifyNackReceivedAsync();\n            }\n        };\n\n        PebbleKit.registerReceivedNackHandler(this, nackReceiver);\n    }\n\n    private static class DialogManager {\n        public void showDialog(Dialog d) {\n            if (mDialogs.contains(d) == false) {\n                mDialogs.add(d);\n            }\n            d.show();\n        }\n\n        public void dismissAll() {\n            for (Dialog d : mDialogs) {\n                if (d != null) {\n                    if (d.isShowing()) {\n                        d.dismiss();\n                    }\n                }\n            }\n            mDialogs.clear();\n        }\n\n        public HashSet<Dialog> mDialogs = new HashSet<Dialog>();\n    }\n\n    private void removeAllCompletedItems() {\n        for (int i = todoListAdapter.getCount() - 1; i >= 0; i--) {\n            final TodoListItem item = todoListAdapter.getItem(i);\n            if (!item.isComplete()) {\n                continue;\n            }\n\n            getListViewAsDSLV().removeCheckState(i);\n            todoListAdapter.remove(item);\n\n            PebbleDictionary data = new PebbleDictionary();\n            data.addUint8(DELETE_KEY, (byte) i);\n            if (!messageManager.offer(data)) {\n                return;\n            }\n        }\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        // Handle item selection\n        switch (item.getItemId()) {\n            case (R.id.add_mi):\n                dialogManager.showDialog(createDialog());\n                return true;\n            case (R.id.remove_all_checked_mi):\n                removeAllCompletedItems();\n                return true;\n            default:\n                return super.onOptionsItemSelected(item);\n        }\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        MenuInflater inflater = getMenuInflater();\n        inflater.inflate(R.menu.options_menu, menu);\n        return true;\n    }\n\n    public Dialog createDialog() {\n        AlertDialog.Builder builder = new AlertDialog.Builder(this);\n        final LayoutInflater inflater = getLayoutInflater();\n\n        // Inflate and set the layout for the dialog\n        // Pass null as the parent view because its going in the dialog layout\n        final View rootView = inflater.inflate(R.layout.dialog_add_todo_item, null);\n        builder.setView(rootView)\n                // Add action buttons\n                .setPositiveButton(R.string.todo_list_add_dialog_ok_button, new DialogInterface.OnClickListener() {\n                    @Override\n                    public void onClick(DialogInterface dialog, int id) {\n                        final EditText editTextWidget = ((EditText) rootView.findViewById(R.id.todo_list_add_item_dialog_description));\n                        final String description = editTextWidget.getText().toString();\n                        final TodoListItem item = todoListAdapter.addItem(description);\n\n                        if (item == null) {\n                            dialog.dismiss();\n                            return;\n                        }\n\n                        final PebbleDictionary data = new PebbleDictionary();\n                        data.addString(APPEND_KEY, item.getDescription());\n                        messageManager.offer(data);\n                        dialog.dismiss();\n                    }\n                })\n                .setNegativeButton(R.string.todo_list_add_dialog_cancel_button, new DialogInterface.OnClickListener() {\n                    public void onClick(DialogInterface dialog, int id) {\n                        dialog.cancel();\n                    }\n                });\n        return builder.create();\n    }\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/example/PebbleKitExample/TodoList/TodoListAdapter.java",
    "content": "package com.example.PebbleKitExample.TodoList;\n\nimport android.content.Context;\nimport android.util.Log;\nimport android.widget.ArrayAdapter;\nimport com.example.PebbleKitExample.R;\n\nimport java.util.LinkedList;\nimport java.util.List;\n\npublic class TodoListAdapter extends ArrayAdapter<TodoListItem> {\n    private final Context mContext;\n    private static final int MAX_TODO_LIST_LENGTH = 10;\n    private static final int MAX_DESCRIPTION_LENGTH = 15;\n\n    private TodoListAdapter(final Context context, final int resource, final int textViewResourceId,\n                            final List<TodoListItem> items) {\n        super(context, resource, textViewResourceId, items);\n        mContext = context;\n    }\n\n    public static TodoListAdapter createTodoListAdapter(final Context context) {\n        final List<TodoListItem> items = new LinkedList<TodoListItem>();\n        // FIXME can getContext() be used here?\n        return new TodoListAdapter(context, R.layout.list_item_checkable, R.id.text, items);\n    }\n\n    public TodoListItem addItem(String description) {\n        if (getCount() >= MAX_TODO_LIST_LENGTH) {\n            return null;\n        }\n\n        if (description == null || description.length() == 0) {\n            return null;\n        }\n\n        // FIXME Can you make this UTF-8 safe? :)\n        if (description.length() >= MAX_DESCRIPTION_LENGTH) {\n            description = description.substring(0, MAX_DESCRIPTION_LENGTH);\n        }\n\n        final TodoListItem item = TodoListItem.getItemWithDescription(description);\n        this.add(item);\n\n        return item;\n    }\n\n    public LinkedList<TodoListItem> addItems(String[] descriptions) {\n        LinkedList<TodoListItem> itemsAdded = new LinkedList<TodoListItem>();\n\n        if (descriptions == null) {\n            Log.w(\"TodoList\", \"Null descriptions...\");\n            return null;\n        }\n\n        for (String description : descriptions) {\n            if (description == null) {\n                continue;\n            }\n\n            final TodoListItem item = addItem(description);\n            if (item != null) {\n                itemsAdded.add(item);\n            }\n        }\n\n        return itemsAdded;\n    }\n\n    public TodoListItem removeItemAtIndex(final int index) {\n        if (index >= getCount()) {\n            return null;\n        }\n        final TodoListItem item = getItem(index);\n        remove(item);\n        return item;\n    }\n\n    public void moveItemFromIndexToIndex(final int sourceIndex, final int destIndex) {\n        if (sourceIndex >= getCount() || destIndex >= getCount()) {\n            return;\n        }\n\n        if (sourceIndex == destIndex) {\n            return;\n        }\n\n        TodoListItem toAdd = getItem(sourceIndex);\n        remove(toAdd);\n\n        if (sourceIndex < destIndex) {\n            insert(toAdd, destIndex + 1);\n            return;\n        }\n\n        insert(toAdd, destIndex);\n    }\n\n    public void toggleItemCompletenessAtIndex(final int index) {\n        if (index >= getCount()) {\n            return;\n        }\n\n        TodoListItem item = getItem(index);\n        item.setComplete(!item.isComplete());\n    }\n\n    public List<String> getDescriptions() {\n        LinkedList<String> descriptions = new LinkedList<String>();\n        for (int i = 0; i < getCount(); i++) {\n            descriptions.add(getItem(i).getDescription());\n        }\n        return descriptions;\n    }\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/example/PebbleKitExample/TodoList/TodoListItem.java",
    "content": "package com.example.PebbleKitExample.TodoList;\n\npublic class TodoListItem {\n    private boolean mIsComplete;\n    private String mDescription;\n\n\n    private TodoListItem(final boolean isComplete, final String description) {\n        mIsComplete = isComplete;\n        mDescription = description;\n    }\n\n    public static TodoListItem getItemWithDescription(final String description) {\n        return new TodoListItem(false, description);\n    }\n\n\n    public boolean isComplete() {\n        return mIsComplete;\n    }\n\n    public void setComplete(final boolean isComplete) {\n        mIsComplete = isComplete;\n    }\n\n    public String getDescription() {\n        return mDescription;\n    }\n\n    public void setDescription(final String description) {\n        mDescription = description;\n    }\n\n    @Override\n    public String toString() {\n        return mDescription;\n    }\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/mobeta/android/dslv/DragSortController.java",
    "content": "package com.mobeta.android.dslv;\n\nimport android.graphics.Point;\nimport android.view.GestureDetector;\nimport android.view.HapticFeedbackConstants;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewConfiguration;\nimport android.widget.AdapterView;\n\n/**\n * Class that starts and stops item drags on a {@link DragSortListView}\n * based on touch gestures. This class also inherits from\n * {@link SimpleFloatViewManager}, which provides basic float View\n * creation.\n *\n * An instance of this class is meant to be passed to the methods\n * {@link DragSortListView#setTouchListener()} and\n * {@link DragSortListView#setFloatViewManager()} of your\n * {@link DragSortListView} instance.\n */\npublic class DragSortController extends SimpleFloatViewManager implements View.OnTouchListener, GestureDetector.OnGestureListener {\n\n    /**\n     * Drag init mode enum.\n     */\n    public static final int ON_DOWN = 0;\n    public static final int ON_DRAG = 1;\n    public static final int ON_LONG_PRESS = 2;\n\n    private int mDragInitMode = ON_DOWN;\n\n    private boolean mSortEnabled = true;\n\n    /**\n     * Remove mode enum.\n     */\n    public static final int CLICK_REMOVE = 0;\n    public static final int FLING_REMOVE = 1;\n\n    /**\n     * The current remove mode.\n     */\n    private int mRemoveMode;\n\n    private boolean mRemoveEnabled = false;\n    private boolean mIsRemoving = false;\n\n    private GestureDetector mDetector;\n\n    private GestureDetector mFlingRemoveDetector;\n\n    private int mTouchSlop;\n\n    public static final int MISS = -1;\n\n    private int mHitPos = MISS;\n    private int mFlingHitPos = MISS;\n\n    private int mClickRemoveHitPos = MISS;\n\n    private int[] mTempLoc = new int[2];\n\n    private int mItemX;\n    private int mItemY;\n\n    private int mCurrX;\n    private int mCurrY;\n\n    private boolean mDragging = false;\n\n    private float mFlingSpeed = 500f;\n\n    private int mDragHandleId;\n\n    private int mClickRemoveId;\n\n    private int mFlingHandleId;\n    private boolean mCanDrag;\n\n    private DragSortListView mDslv;\n    private int mPositionX;\n\n    /**\n     * Calls {@link #DragSortController(DragSortListView, int)} with a\n     * 0 drag handle id, FLING_RIGHT_REMOVE remove mode,\n     * and ON_DOWN drag init. By default, sorting is enabled, and\n     * removal is disabled.\n     *\n     * @param dslv The DSLV instance\n     */\n    public DragSortController(DragSortListView dslv) {\n        this(dslv, 0, ON_DOWN, FLING_REMOVE);\n    }\n\n    public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitMode, int removeMode) {\n        this(dslv, dragHandleId, dragInitMode, removeMode, 0);\n    }\n\n    public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitMode, int removeMode, int clickRemoveId) {\n        this(dslv, dragHandleId, dragInitMode, removeMode, clickRemoveId, 0);\n    }\n\n    /**\n     * By default, sorting is enabled, and removal is disabled.\n     *\n     * @param dslv The DSLV instance\n     * @param dragHandleId The resource id of the View that represents\n     * the drag handle in a list item.\n     */\n    public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitMode,\n            int removeMode, int clickRemoveId, int flingHandleId) {\n        super(dslv);\n        mDslv = dslv;\n        mDetector = new GestureDetector(dslv.getContext(), this);\n        mFlingRemoveDetector = new GestureDetector(dslv.getContext(), mFlingRemoveListener);\n        mFlingRemoveDetector.setIsLongpressEnabled(false);\n        mTouchSlop = ViewConfiguration.get(dslv.getContext()).getScaledTouchSlop();\n        mDragHandleId = dragHandleId;\n        mClickRemoveId = clickRemoveId;\n        mFlingHandleId = flingHandleId;\n        setRemoveMode(removeMode);\n        setDragInitMode(dragInitMode);\n    }\n\n\n    public int getDragInitMode() {\n        return mDragInitMode;\n    }\n\n    /**\n     * Set how a drag is initiated. Needs to be one of\n     * {@link ON_DOWN}, {@link ON_DRAG}, or {@link ON_LONG_PRESS}.\n     *\n     * @param mode The drag init mode.\n     */\n    public void setDragInitMode(int mode) {\n        mDragInitMode = mode;\n    }\n\n    /**\n     * Enable/Disable list item sorting. Disabling is useful if only item\n     * removal is desired. Prevents drags in the vertical direction.\n     *\n     * @param enabled Set <code>true</code> to enable list\n     * item sorting.\n     */\n    public void setSortEnabled(boolean enabled) {\n        mSortEnabled = enabled;\n    }\n\n    public boolean isSortEnabled() {\n        return mSortEnabled;\n    }\n\n    /**\n     * One of {@link CLICK_REMOVE}, {@link FLING_RIGHT_REMOVE},\n     * {@link FLING_LEFT_REMOVE},\n     * {@link SLIDE_RIGHT_REMOVE}, or {@link SLIDE_LEFT_REMOVE}.\n     */\n    public void setRemoveMode(int mode) {\n        mRemoveMode = mode;\n    }\n\n    public int getRemoveMode() {\n        return mRemoveMode;\n    }\n\n    /**\n     * Enable/Disable item removal without affecting remove mode.\n     */\n    public void setRemoveEnabled(boolean enabled) {\n        mRemoveEnabled = enabled;\n    }\n\n    public boolean isRemoveEnabled() {\n        return mRemoveEnabled;\n    }\n\n    /**\n     * Set the resource id for the View that represents the drag\n     * handle in a list item.\n     *\n     * @param id An android resource id.\n     */\n    public void setDragHandleId(int id) {\n        mDragHandleId = id;\n    }\n\n    /**\n     * Set the resource id for the View that represents the fling\n     * handle in a list item.\n     *\n     * @param id An android resource id.\n     */\n    public void setFlingHandleId(int id) {\n        mFlingHandleId = id;\n    }\n\n    /**\n     * Set the resource id for the View that represents click\n     * removal button.\n     *\n     * @param id An android resource id.\n     */\n    public void setClickRemoveId(int id) {\n        mClickRemoveId = id;\n    }\n\n    /**\n     * Sets flags to restrict certain motions of the floating View\n     * based on DragSortController settings (such as remove mode).\n     * Starts the drag on the DragSortListView.\n     *\n     * @param position The list item position (includes headers).\n     * @param deltaX Touch x-coord minus left edge of floating View.\n     * @param deltaY Touch y-coord minus top edge of floating View.\n     *\n     * @return True if drag started, false otherwise.\n     */\n    public boolean startDrag(int position, int deltaX, int deltaY) {\n\n        int dragFlags = 0;\n        if (mSortEnabled && !mIsRemoving) {\n            dragFlags |= DragSortListView.DRAG_POS_Y | DragSortListView.DRAG_NEG_Y;\n        }\n        if (mRemoveEnabled && mIsRemoving) {\n            dragFlags |= DragSortListView.DRAG_POS_X;\n            dragFlags |= DragSortListView.DRAG_NEG_X;\n        }\n\n        mDragging = mDslv.startDrag(position - mDslv.getHeaderViewsCount(), dragFlags, deltaX,\n                deltaY);\n        return mDragging;\n    }\n\n    @Override\n    public boolean onTouch(View v, MotionEvent ev) {\n        if (!mDslv.isDragEnabled() || mDslv.listViewIntercepted()) {\n            return false;\n        }\n\n        mDetector.onTouchEvent(ev);\n        if (mRemoveEnabled && mDragging && mRemoveMode == FLING_REMOVE) {\n            mFlingRemoveDetector.onTouchEvent(ev);\n        }\n\n        int action = ev.getAction() & MotionEvent.ACTION_MASK;\n        switch (action) {\n            case MotionEvent.ACTION_DOWN:\n                mCurrX = (int) ev.getX();\n                mCurrY = (int) ev.getY();\n                break;\n            case MotionEvent.ACTION_UP:\n                if (mRemoveEnabled && mIsRemoving) {\n                    int x = mPositionX >= 0 ? mPositionX : -mPositionX;\n                    int removePoint = mDslv.getWidth() / 2;\n                    if (x > removePoint) {\n                        mDslv.stopDragWithVelocity(true, 0);\n                    }\n                }\n            case MotionEvent.ACTION_CANCEL:\n                mIsRemoving = false;\n                mDragging = false;\n                break;\n        }\n\n        return false;\n    }\n\n    /**\n     * Overrides to provide fading when slide removal is enabled.\n     */\n    @Override\n    public void onDragFloatView(View floatView, Point position, Point touch) {\n\n        if (mRemoveEnabled && mIsRemoving) {\n            mPositionX = position.x;\n        }\n    }\n\n    /**\n     * Get the position to start dragging based on the ACTION_DOWN\n     * MotionEvent. This function simply calls\n     * {@link #dragHandleHitPosition(MotionEvent)}. Override\n     * to change drag handle behavior;\n     * this function is called internally when an ACTION_DOWN\n     * event is detected.\n     *\n     * @param ev The ACTION_DOWN MotionEvent.\n     *\n     * @return The list position to drag if a drag-init gesture is\n     * detected; MISS if unsuccessful.\n     */\n    public int startDragPosition(MotionEvent ev) {\n        return dragHandleHitPosition(ev);\n    }\n\n    public int startFlingPosition(MotionEvent ev) {\n        return mRemoveMode == FLING_REMOVE ? flingHandleHitPosition(ev) : MISS;\n    }\n\n    /**\n     * Checks for the touch of an item's drag handle (specified by\n     * {@link #setDragHandleId(int)}), and returns that item's position\n     * if a drag handle touch was detected.\n     *\n     * @param ev The ACTION_DOWN MotionEvent.\n\n     * @return The list position of the item whose drag handle was\n     * touched; MISS if unsuccessful.\n     */\n    public int dragHandleHitPosition(MotionEvent ev) {\n        return viewIdHitPosition(ev, mDragHandleId);\n    }\n\n    public int flingHandleHitPosition(MotionEvent ev) {\n        return viewIdHitPosition(ev, mFlingHandleId);\n    }\n\n    public int viewIdHitPosition(MotionEvent ev, int id) {\n        final int x = (int) ev.getX();\n        final int y = (int) ev.getY();\n\n        int touchPos = mDslv.pointToPosition(x, y); // includes headers/footers\n\n        final int numHeaders = mDslv.getHeaderViewsCount();\n        final int numFooters = mDslv.getFooterViewsCount();\n        final int count = mDslv.getCount();\n\n        // Log.d(\"mobeta\", \"touch down on position \" + itemnum);\n        // We're only interested if the touch was on an\n        // item that's not a header or footer.\n        if (touchPos != AdapterView.INVALID_POSITION && touchPos >= numHeaders\n                && touchPos < (count - numFooters)) {\n            final View item = mDslv.getChildAt(touchPos - mDslv.getFirstVisiblePosition());\n            final int rawX = (int) ev.getRawX();\n            final int rawY = (int) ev.getRawY();\n\n            View dragBox = id == 0 ? item : (View) item.findViewById(id);\n            if (dragBox != null) {\n                dragBox.getLocationOnScreen(mTempLoc);\n\n                if (rawX > mTempLoc[0] && rawY > mTempLoc[1] &&\n                        rawX < mTempLoc[0] + dragBox.getWidth() &&\n                        rawY < mTempLoc[1] + dragBox.getHeight()) {\n\n                    mItemX = item.getLeft();\n                    mItemY = item.getTop();\n\n                    return touchPos;\n                }\n            }\n        }\n\n        return MISS;\n    }\n\n    @Override\n    public boolean onDown(MotionEvent ev) {\n        if (mRemoveEnabled && mRemoveMode == CLICK_REMOVE) {\n            mClickRemoveHitPos = viewIdHitPosition(ev, mClickRemoveId);\n        }\n\n        mHitPos = startDragPosition(ev);\n        if (mHitPos != MISS && mDragInitMode == ON_DOWN) {\n            startDrag(mHitPos, (int) ev.getX() - mItemX, (int) ev.getY() - mItemY);\n        }\n\n        mIsRemoving = false;\n        mCanDrag = true;\n        mPositionX = 0;\n        mFlingHitPos = startFlingPosition(ev);\n\n        return true;\n    }\n\n    @Override\n    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {\n\n        final int x1 = (int) e1.getX();\n        final int y1 = (int) e1.getY();\n        final int x2 = (int) e2.getX();\n        final int y2 = (int) e2.getY();\n        final int deltaX = x2 - mItemX;\n        final int deltaY = y2 - mItemY;\n\n        if (mCanDrag && !mDragging && (mHitPos != MISS || mFlingHitPos != MISS)) {\n            if (mHitPos != MISS) {\n                if (mDragInitMode == ON_DRAG && Math.abs(y2 - y1) > mTouchSlop && mSortEnabled) {\n                    startDrag(mHitPos, deltaX, deltaY);\n                }\n                else if (mDragInitMode != ON_DOWN && Math.abs(x2 - x1) > mTouchSlop && mRemoveEnabled)\n                {\n                    mIsRemoving = true;\n                    startDrag(mFlingHitPos, deltaX, deltaY);\n                }\n            } else if (mFlingHitPos != MISS) {\n                if (Math.abs(x2 - x1) > mTouchSlop && mRemoveEnabled) {\n                    mIsRemoving = true;\n                    startDrag(mFlingHitPos, deltaX, deltaY);\n                } else if (Math.abs(y2 - y1) > mTouchSlop) {\n                    mCanDrag = false; // if started to scroll the list then\n                                      // don't allow sorting nor fling-removing\n                }\n            }\n        }\n        // return whatever\n        return false;\n    }\n\n    @Override\n    public void onLongPress(MotionEvent e) {\n        // Log.d(\"mobeta\", \"lift listener long pressed\");\n        if (mHitPos != MISS && mDragInitMode == ON_LONG_PRESS) {\n            mDslv.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);\n            startDrag(mHitPos, mCurrX - mItemX, mCurrY - mItemY);\n        }\n    }\n\n    // complete the OnGestureListener interface\n    @Override\n    public final boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {\n        return false;\n    }\n\n    // complete the OnGestureListener interface\n    @Override\n    public boolean onSingleTapUp(MotionEvent ev) {\n        if (mRemoveEnabled && mRemoveMode == CLICK_REMOVE) {\n            if (mClickRemoveHitPos != MISS) {\n                mDslv.removeItem(mClickRemoveHitPos - mDslv.getHeaderViewsCount());\n            }\n        }\n        return true;\n    }\n\n    // complete the OnGestureListener interface\n    @Override\n    public void onShowPress(MotionEvent ev) {\n        // do nothing\n    }\n\n    private GestureDetector.OnGestureListener mFlingRemoveListener =\n            new GestureDetector.SimpleOnGestureListener() {\n                @Override\n                public final boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,\n                        float velocityY) {\n                    // Log.d(\"mobeta\", \"on fling remove called\");\n                    if (mRemoveEnabled && mIsRemoving) {\n                        int w = mDslv.getWidth();\n                        int minPos = w / 5;\n                        if (velocityX > mFlingSpeed) {\n                            if (mPositionX > -minPos) {\n                                mDslv.stopDragWithVelocity(true, velocityX);\n                            }\n                        } else if (velocityX < -mFlingSpeed) {\n                            if (mPositionX < minPos) {\n                                mDslv.stopDragWithVelocity(true, velocityX);\n                            }\n                        }\n                        mIsRemoving = false;\n                    }\n                    return false;\n                }\n            };\n\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/mobeta/android/dslv/DragSortCursorAdapter.java",
    "content": "package com.mobeta.android.dslv;\n\nimport java.util.ArrayList;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.util.SparseIntArray;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.support.v4.widget.CursorAdapter;\n\n\n/**\n * A subclass of {@link android.widget.CursorAdapter} that provides\n * reordering of the elements in the Cursor based on completed\n * drag-sort operations. The reordering is a simple mapping of\n * list positions into Cursor positions (the Cursor is unchanged).\n * To persist changes made by drag-sorts, one can retrieve the\n * mapping with the {@link #getCursorPositions()} method, which\n * returns the reordered list of Cursor positions.\n *\n * An instance of this class is passed\n * to {@link DragSortListView#setAdapter(ListAdapter)} and, since\n * this class implements the {@link DragSortListView.DragSortListener}\n * interface, it is automatically set as the DragSortListener for\n * the DragSortListView instance.\n */\npublic abstract class DragSortCursorAdapter extends CursorAdapter implements DragSortListView.DragSortListener {\n\n    public static final int REMOVED = -1;\n\n    /**\n     * Key is ListView position, value is Cursor position\n     */\n    private SparseIntArray mListMapping = new SparseIntArray();\n\n    private ArrayList<Integer> mRemovedCursorPositions = new ArrayList<Integer>();\n    \n    public DragSortCursorAdapter(Context context, Cursor c) {\n        super(context, c);\n    }\n\n    public DragSortCursorAdapter(Context context, Cursor c, boolean autoRequery) {\n        super(context, c, autoRequery);\n    }\n\n    public DragSortCursorAdapter(Context context, Cursor c, int flags) {\n        super(context, c, flags);\n    }\n\n    /**\n     * Swaps Cursor and clears list-Cursor mapping.\n     *\n     * @see android.widget.CursorAdapter#swapCursor(android.database.Cursor)\n     */\n    @Override\n    public Cursor swapCursor(Cursor newCursor) {\n        Cursor old = super.swapCursor(newCursor);\n        resetMappings();\n        return old;\n    }\n\n    /**\n     * Changes Cursor and clears list-Cursor mapping.\n     *\n     * @see android.widget.CursorAdapter#changeCursor(android.database.Cursor)\n     */\n    @Override\n    public void changeCursor(Cursor cursor) {\n        super.changeCursor(cursor);\n        resetMappings();\n    }\n\n    /**\n     * Resets list-cursor mapping.\n     */\n    public void reset() {\n        resetMappings();\n        notifyDataSetChanged();\n    }\n\n    private void resetMappings() {\n        mListMapping.clear();\n        mRemovedCursorPositions.clear();\n    }\n\n    @Override\n    public Object getItem(int position) {\n        return super.getItem(mListMapping.get(position, position));\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return super.getItemId(mListMapping.get(position, position));\n    }\n\n    @Override\n    public View getDropDownView(int position, View convertView, ViewGroup parent) {\n        return super.getDropDownView(mListMapping.get(position, position), convertView, parent);\n    }\n\n    @Override\n    public View getView(int position, View convertView, ViewGroup parent) {\n        return super.getView(mListMapping.get(position, position), convertView, parent);\n    }\n\n    /**\n     * On drop, this updates the mapping between Cursor positions\n     * and ListView positions. The Cursor is unchanged. Retrieve\n     * the current mapping with {@link getCursorPositions()}.\n     *\n     * @see DragSortListView.DropListener#drop(int, int)\n     */\n    @Override\n    public void drop(int from, int to) {\n        if (from != to) {\n            int cursorFrom = mListMapping.get(from, from);\n\n            if (from > to) {\n                for (int i = from; i > to; --i) {\n                    mListMapping.put(i, mListMapping.get(i - 1, i - 1));\n                }\n            } else {\n                for (int i = from; i < to; ++i) {\n                    mListMapping.put(i, mListMapping.get(i + 1, i + 1));\n                }\n            }\n            mListMapping.put(to, cursorFrom);\n\n            cleanMapping();        \n            notifyDataSetChanged();\n        }\n    }\n\n    /**\n     * On remove, this updates the mapping between Cursor positions\n     * and ListView positions. The Cursor is unchanged. Retrieve\n     * the current mapping with {@link getCursorPositions()}.\n     *\n     * @see DragSortListView.RemoveListener#remove(int)\n     */\n    @Override\n    public void remove(int which) {\n        int cursorPos = mListMapping.get(which, which);\n        if (!mRemovedCursorPositions.contains(cursorPos)) {\n            mRemovedCursorPositions.add(cursorPos);\n        }\n\n        int newCount = getCount();\n        for (int i = which; i < newCount; ++i) {\n            mListMapping.put(i, mListMapping.get(i + 1, i + 1));\n        }\n\n        mListMapping.delete(newCount);\n\n        cleanMapping();\n        notifyDataSetChanged();\n    }\n\n    /**\n     * Does nothing. Just completes DragSortListener interface.\n     */\n    @Override\n    public void drag(int from, int to) {\n        // do nothing\n    }\n\n    /**\n     * Remove unnecessary mappings from sparse array.\n     */\n    private void cleanMapping() {\n        ArrayList<Integer> toRemove = new ArrayList<Integer>();\n\n        int size = mListMapping.size();\n        for (int i = 0; i < size; ++i) {\n            if (mListMapping.keyAt(i) == mListMapping.valueAt(i)) {\n                toRemove.add(mListMapping.keyAt(i));\n            }\n        }\n\n        size = toRemove.size();\n        for (int i = 0; i < size; ++i) {\n            mListMapping.delete(toRemove.get(i));\n        }\n    }\n\n    @Override\n    public int getCount() {\n        return super.getCount() - mRemovedCursorPositions.size();\n    }\n\n    /**\n     * Get the Cursor position mapped to by the provided list position\n     * (given all previously handled drag-sort\n     * operations).\n     *\n     * @param position List position\n     *\n     * @return The mapped-to Cursor position\n     */\n    public int getCursorPosition(int position) {\n        return mListMapping.get(position, position);\n    }\n\n    /**\n     * Get the current order of Cursor positions presented by the\n     * list.\n     */\n    public ArrayList<Integer> getCursorPositions() {\n        ArrayList<Integer> result = new ArrayList<Integer>();\n\n        for (int i = 0; i < getCount(); ++i) {\n            result.add(mListMapping.get(i, i));\n        }\n\n        return result;\n    }\n\n    /**\n     * Get the list position mapped to by the provided Cursor position.\n     * If the provided Cursor position has been removed by a drag-sort,\n     * this returns {@link #REMOVED}.\n     *\n     * @param cursorPosition A Cursor position\n     * @return The mapped-to list position or REMOVED\n     */\n    public int getListPosition(int cursorPosition) {\n        if (mRemovedCursorPositions.contains(cursorPosition)) {\n            return REMOVED;\n        }\n\n        int index = mListMapping.indexOfValue(cursorPosition);\n        if (index < 0) {\n            return cursorPosition;\n        } else {\n            return mListMapping.keyAt(index);\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/mobeta/android/dslv/DragSortItemView.java",
    "content": "package com.mobeta.android.dslv;\n\nimport android.content.Context;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.View.MeasureSpec;\nimport android.view.ViewGroup;\nimport android.widget.AbsListView;\nimport android.util.Log;\n\n/**\n * Lightweight ViewGroup that wraps list items obtained from user's\n * ListAdapter. ItemView expects a single child that has a definite\n * height (i.e. the child's layout height is not MATCH_PARENT).\n * The width of\n * ItemView will always match the width of its child (that is,\n * the width MeasureSpec given to ItemView is passed directly\n * to the child, and the ItemView measured width is set to the\n * child's measured width). The height of ItemView can be anything;\n * the \n * \n *\n * The purpose of this class is to optimize slide\n * shuffle animations.\n */\npublic class DragSortItemView extends ViewGroup {\n\n    private int mGravity = Gravity.TOP;\n\n    public DragSortItemView(Context context) {\n        super(context);\n\n        // always init with standard ListView layout params\n        setLayoutParams(new AbsListView.LayoutParams(\n                ViewGroup.LayoutParams.FILL_PARENT,\n                ViewGroup.LayoutParams.WRAP_CONTENT));\n\n        //setClipChildren(true);\n    }\n\n    public void setGravity(int gravity) {\n        mGravity = gravity;\n    }\n\n    public int getGravity() {\n        return mGravity;\n    }\n\n    @Override\n    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {\n        final View child = getChildAt(0);\n\n        if (child == null) {\n            return;\n        }\n\n        if (mGravity == Gravity.TOP) {\n            child.layout(0, 0, getMeasuredWidth(), child.getMeasuredHeight());\n        } else {\n            child.layout(0, getMeasuredHeight() - child.getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight());\n        }\n    }\n\n    /**\n     * \n     */\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        \n        int height = MeasureSpec.getSize(heightMeasureSpec);\n        int width = MeasureSpec.getSize(widthMeasureSpec);\n\n        int heightMode = MeasureSpec.getMode(heightMeasureSpec);\n\n        final View child = getChildAt(0);\n        if (child == null) {\n            setMeasuredDimension(0, width);\n            return;\n        }\n\n        if (child.isLayoutRequested()) {\n            // Always let child be as tall as it wants.\n            measureChild(child, widthMeasureSpec,\n                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));\n        }\n\n        if (heightMode == MeasureSpec.UNSPECIFIED) {\n            ViewGroup.LayoutParams lp = getLayoutParams();\n\n            if (lp.height > 0) {\n                height = lp.height;\n            } else {\n                height = child.getMeasuredHeight();\n            }\n        }\n\n        setMeasuredDimension(width, height);\n    }\n\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/mobeta/android/dslv/DragSortItemViewCheckable.java",
    "content": "package com.mobeta.android.dslv;\n\nimport android.content.Context;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.View.MeasureSpec;\nimport android.view.ViewGroup;\nimport android.widget.AbsListView;\nimport android.widget.Checkable;\nimport android.util.Log;\n\n/**\n * Lightweight ViewGroup that wraps list items obtained from user's\n * ListAdapter. ItemView expects a single child that has a definite\n * height (i.e. the child's layout height is not MATCH_PARENT).\n * The width of\n * ItemView will always match the width of its child (that is,\n * the width MeasureSpec given to ItemView is passed directly\n * to the child, and the ItemView measured width is set to the\n * child's measured width). The height of ItemView can be anything;\n * the \n * \n *\n * The purpose of this class is to optimize slide\n * shuffle animations.\n */\npublic class DragSortItemViewCheckable extends DragSortItemView implements Checkable {\n\n    public DragSortItemViewCheckable(Context context) {\n        super(context);\n    }\n\n    @Override\n    public boolean isChecked() {\n        View child = getChildAt(0);\n        if (child instanceof Checkable)\n            return ((Checkable) child).isChecked();\n        else\n            return false;\n    }\n\n    @Override\n    public void setChecked(boolean checked) {\n        View child = getChildAt(0);\n        if (child instanceof Checkable)\n            ((Checkable) child).setChecked(checked);\n    }\n\n    @Override\n    public void toggle() {\n        View child = getChildAt(0);\n        if (child instanceof Checkable)\n            ((Checkable) child).toggle();\n    }\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/mobeta/android/dslv/DragSortListView.java",
    "content": "/*\n * DragSortListView.\n *\n * A subclass of the Android ListView component that enables drag\n * and drop re-ordering of list items.\n *\n * Copyright 2012 Carl Bauer\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.mobeta.android.dslv;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.database.DataSetObserver;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Point;\nimport android.graphics.drawable.Drawable;\nimport android.os.Environment;\nimport android.os.SystemClock;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.util.SparseBooleanArray;\nimport android.util.SparseIntArray;\nimport android.view.Gravity;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.AbsListView;\nimport android.widget.BaseAdapter;\nimport android.widget.Checkable;\nimport android.widget.ListAdapter;\nimport android.widget.ListView;\n\nimport java.io.File;\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport com.example.PebbleKitExample.R;\n\n/**\n * ListView subclass that mediates drag and drop resorting of items.\n * \n * \n * @author heycosmo\n *\n */\npublic class DragSortListView extends ListView {\n    \n    \n    /**\n     * The View that floats above the ListView and represents\n     * the dragged item.\n     */\n    private View mFloatView;\n\n    /**\n     * The float View location. First based on touch location\n     * and given deltaX and deltaY. Then restricted by callback\n     * to FloatViewManager.onDragFloatView(). Finally restricted\n     * by bounds of DSLV.\n     */\n    private Point mFloatLoc = new Point();\n\n    private Point mTouchLoc = new Point();\n\n    /**\n     * The middle (in the y-direction) of the floating View.\n     */\n    private int mFloatViewMid;\n\n    /**\n     * Flag to make sure float View isn't measured twice\n     */\n    private boolean mFloatViewOnMeasured = false;\n\n    /**\n     * Watch the Adapter for data changes. Cancel a drag if\n     * coincident with a change.\n     */ \n    private DataSetObserver mObserver;\n\n    /**\n     * Transparency for the floating View (XML attribute).\n     */\n    private float mFloatAlpha = 1.0f;\n    private float mCurrFloatAlpha = 1.0f;\n\n    /**\n     * While drag-sorting, the current position of the floating\n     * View. If dropped, the dragged item will land in this position.\n     */\n    private int mFloatPos;\n\n    /**\n     * The first expanded ListView position that helps represent\n     * the drop slot tracking the floating View.\n     */\n    private int mFirstExpPos;\n\n    /**\n     * The second expanded ListView position that helps represent\n     * the drop slot tracking the floating View. This can equal\n     * mFirstExpPos if there is no slide shuffle occurring; otherwise\n     * it is equal to mFirstExpPos + 1.\n     */\n    private int mSecondExpPos;\n\n    /**\n     * Flag set if slide shuffling is enabled.\n     */\n    private boolean mAnimate = false;\n\n    /**\n     * The user dragged from this position.\n     */\n    private int mSrcPos;\n\n    /**\n     * Offset (in x) within the dragged item at which the user\n     * picked it up (or first touched down with the digitalis).\n     */\n    private int mDragDeltaX;\n\n    /**\n     * Offset (in y) within the dragged item at which the user\n     * picked it up (or first touched down with the digitalis).\n     */\n    private int mDragDeltaY;\n\n\n    /**\n     * The difference (in x) between screen coordinates and coordinates\n     * in this view.\n     */\n    private int mOffsetX;\n\n    /**\n     * The difference (in y) between screen coordinates and coordinates\n     * in this view.\n     */\n    private int mOffsetY;\n\n    /**\n     * A listener that receives callbacks whenever the floating View\n     * hovers over a new position.\n     */\n    private DragListener mDragListener;\n\n    /**\n     * A listener that receives a callback when the floating View\n     * is dropped.\n     */\n    private DropListener mDropListener;\n\n    /**\n     * A listener that receives a callback when the floating View\n     * (or more precisely the originally dragged item) is removed\n     * by one of the provided gestures.\n     */\n    private RemoveListener mRemoveListener;\n\n    /**\n     * Enable/Disable item dragging\n     * \n     * @attr name dslv:drag_enabled\n     */\n    private boolean mDragEnabled = true;\n\n    /**\n     * Drag state enum.\n     */\n    private final static int IDLE = 0;\n    private final static int REMOVING = 1;\n    private final static int DROPPING = 2;\n    private final static int STOPPED = 3;\n    private final static int DRAGGING = 4;\n\n    private int mDragState = IDLE;\n\n    /**\n     * Height in pixels to which the originally dragged item\n     * is collapsed during a drag-sort. Currently, this value\n     * must be greater than zero.\n     */\n    private int mItemHeightCollapsed = 1;\n\n    /**\n     * Height of the floating View. Stored for the purpose of\n     * providing the tracking drop slot.\n     */\n    private int mFloatViewHeight;\n\n    /**\n     * Convenience member. See above.\n     */\n    private int mFloatViewHeightHalf;\n\n    /**\n     * Save the given width spec for use in measuring children\n     */\n    private int mWidthMeasureSpec = 0;\n\n    /**\n     * Sample Views ultimately used for calculating the height\n     * of ListView items that are off-screen.\n     */\n    private View[] mSampleViewTypes = new View[1];\n\n    /**\n     * Drag-scroll encapsulator!\n     */\n    private DragScroller mDragScroller;\n\n    /**\n     * Determines the start of the upward drag-scroll region\n     * at the top of the ListView. Specified by a fraction\n     * of the ListView height, thus screen resolution agnostic.\n     */\n    private float mDragUpScrollStartFrac = 1.0f / 3.0f;\n\n    /**\n     * Determines the start of the downward drag-scroll region\n     * at the bottom of the ListView. Specified by a fraction\n     * of the ListView height, thus screen resolution agnostic.\n     */\n    private float mDragDownScrollStartFrac = 1.0f / 3.0f;\n\n    /**\n     * The following are calculated from the above fracs.\n     */\n    private int mUpScrollStartY;\n    private int mDownScrollStartY;\n    private float mDownScrollStartYF;\n    private float mUpScrollStartYF;\n\n    /**\n     * Calculated from above above and current ListView height.\n     */\n    private float mDragUpScrollHeight;\n\n    /**\n     * Calculated from above above and current ListView height.\n     */\n    private float mDragDownScrollHeight;\n\n    /**\n     * Maximum drag-scroll speed in pixels per ms. Only used with\n     * default linear drag-scroll profile.\n     */\n    private float mMaxScrollSpeed = 0.5f;\n\n    /**\n     * Defines the scroll speed during a drag-scroll. User can\n     * provide their own; this default is a simple linear profile\n     * where scroll speed increases linearly as the floating View\n     * nears the top/bottom of the ListView.\n     */\n    private DragScrollProfile mScrollProfile = new DragScrollProfile() {\n        @Override\n        public float getSpeed(float w, long t) {\n            return mMaxScrollSpeed * w;\n        }\n    };\n\n    /**\n     * Current touch x.\n     */\n    private int mX;\n\n    /**\n     * Current touch y.\n     */\n    private int mY;\n\n    /**\n     * Last touch x.\n     */\n    private int mLastX;\n\n    /**\n     * Last touch y.\n     */\n    private int mLastY;\n\n    /**\n     * The touch y-coord at which drag started\n     */\n    private int mDragStartY;\n\n    /**\n     * Drag flag bit. Floating View can move in the positive\n     * x direction.\n     */\n    public final static int DRAG_POS_X = 0x1;\n\n    /**\n     * Drag flag bit. Floating View can move in the negative\n     * x direction.\n     */\n    public final static int DRAG_NEG_X = 0x2;\n\n    /**\n     * Drag flag bit. Floating View can move in the positive\n     * y direction. This is subtle. What this actually means is\n     * that, if enabled, the floating View can be dragged below its starting\n     * position. Remove in favor of upper-bounding item position?\n     */\n    public final static int DRAG_POS_Y = 0x4;\n\n    /**\n     * Drag flag bit. Floating View can move in the negative\n     * y direction. This is subtle. What this actually means is\n     * that the floating View can be dragged above its starting\n     * position. Remove in favor of lower-bounding item position?\n     */\n    public final static int DRAG_NEG_Y = 0x8;\n\n    /**\n     * Flags that determine limits on the motion of the\n     * floating View. See flags above.\n     */\n    private int mDragFlags = 0;\n\n    /**\n     * Last call to an on*TouchEvent was a call to\n     * onInterceptTouchEvent.\n     */\n    private boolean mLastCallWasIntercept = false;\n\n    /**\n     * A touch event is in progress.\n     */\n    private boolean mInTouchEvent = false;\n\n    /**\n     * Let the user customize the floating View.\n     */\n    private FloatViewManager mFloatViewManager = null;\n\n    /**\n     * Given to ListView to cancel its action when a drag-sort\n     * begins.\n     */\n    private MotionEvent mCancelEvent;\n\n    /**\n     * Enum telling where to cancel the ListView action when a\n     * drag-sort begins\n     */\n    private static final int NO_CANCEL = 0;\n    private static final int ON_TOUCH_EVENT = 1;\n    private static final int ON_INTERCEPT_TOUCH_EVENT = 2;\n\n    /**\n     * Where to cancel the ListView action when a\n     * drag-sort begins\n     */ \n    private int mCancelMethod = NO_CANCEL;\n\n    /**\n     * Determines when a slide shuffle animation starts. That is,\n     * defines how close to the edge of the drop slot the floating\n     * View must be to initiate the slide.\n     */\n    private float mSlideRegionFrac = 0.25f;\n\n    /**\n     * Number between 0 and 1 indicating the relative location of\n     * a sliding item (only used if drag-sort animations\n     * are turned on). Nearly 1 means the item is \n     * at the top of the slide region (nearly full blank item\n     * is directly below).\n     */\n    private float mSlideFrac = 0.0f;\n\n    /**\n     * Wraps the user-provided ListAdapter. This is used to wrap each\n     * item View given by the user inside another View (currenly\n     * a RelativeLayout) which\n     * expands and collapses to simulate the item shuffling.\n     */\n    private AdapterWrapper mAdapterWrapper;\n\n    /**\n     * Turn on custom debugger.\n     */\n    private boolean mTrackDragSort = false;\n\n    /**\n     * Debugging class.\n     */\n    private DragSortTracker mDragSortTracker;\n\n    /**\n     * Needed for adjusting item heights from within layoutChildren\n     */\n    private boolean mBlockLayoutRequests = false;\n\n    /**\n     * Set to true when a down event happens during drag sort;\n     * for example, when drag finish animations are\n     * playing.\n     */\n    private boolean mIgnoreTouchEvent = false;\n\n    /**\n     * Caches DragSortItemView child heights. Sometimes DSLV has to\n     * know the height of an offscreen item. Since ListView virtualizes\n     * these, DSLV must get the item from the ListAdapter to obtain\n     * its height. That process can be expensive, but often the same\n     * offscreen item will be requested many times in a row. Once an\n     * offscreen item height is calculated, we cache it in this guy.\n     * Actually, we cache the height of the child of the\n     * DragSortItemView since the item height changes often during a\n     * drag-sort.\n     */\n    private static final int sCacheSize = 3;\n    private HeightCache mChildHeightCache = new HeightCache(sCacheSize);\n\n    private RemoveAnimator mRemoveAnimator;\n\n    private LiftAnimator mLiftAnimator;\n\n    private DropAnimator mDropAnimator;\n\n    private boolean mUseRemoveVelocity;\n    private float mRemoveVelocityX = 0;\n\n    public DragSortListView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n\n        int defaultDuration = 150;\n        int removeAnimDuration = defaultDuration; // ms\n        int dropAnimDuration = defaultDuration; // ms\n\n        if (attrs != null) {\n            TypedArray a = getContext().obtainStyledAttributes(attrs,\n                    R.styleable.DragSortListView, 0, 0);\n\n            mItemHeightCollapsed = Math.max(1, a.getDimensionPixelSize(\n                    R.styleable.DragSortListView_collapsed_height, 1));\n\n            mTrackDragSort = a.getBoolean(\n                    R.styleable.DragSortListView_track_drag_sort, false);\n\n            if (mTrackDragSort) {\n                mDragSortTracker = new DragSortTracker();\n            }\n\n            // alpha between 0 and 255, 0=transparent, 255=opaque\n            mFloatAlpha = a.getFloat(R.styleable.DragSortListView_float_alpha, mFloatAlpha);\n            mCurrFloatAlpha = mFloatAlpha;\n\n            mDragEnabled = a.getBoolean(R.styleable.DragSortListView_drag_enabled, mDragEnabled);\n\n            mSlideRegionFrac = Math.max(0.0f,\n                    Math.min(1.0f, 1.0f - a.getFloat(\n                            R.styleable.DragSortListView_slide_shuffle_speed,\n                            0.75f)));\n\n            mAnimate = mSlideRegionFrac > 0.0f;\n\n            float frac = a.getFloat(\n                    R.styleable.DragSortListView_drag_scroll_start,\n                    mDragUpScrollStartFrac);\n\n            setDragScrollStart(frac);\n\n            mMaxScrollSpeed = a.getFloat(\n                    R.styleable.DragSortListView_max_drag_scroll_speed,\n                    mMaxScrollSpeed);\n\n            removeAnimDuration = a.getInt(\n                    R.styleable.DragSortListView_remove_animation_duration,\n                    removeAnimDuration);\n\n            dropAnimDuration = a.getInt(\n                    R.styleable.DragSortListView_drop_animation_duration,\n                    dropAnimDuration);\n\n            boolean useDefault = a.getBoolean(\n                    R.styleable.DragSortListView_use_default_controller,\n                    true);\n\n            if (useDefault) {\n                boolean removeEnabled = a.getBoolean(\n                        R.styleable.DragSortListView_remove_enabled,\n                        false);\n                int removeMode = a.getInt(\n                        R.styleable.DragSortListView_remove_mode,\n                        DragSortController.FLING_REMOVE);\n                boolean sortEnabled = a.getBoolean(\n                        R.styleable.DragSortListView_sort_enabled,\n                        true);\n                int dragInitMode = a.getInt(\n                        R.styleable.DragSortListView_drag_start_mode,\n                        DragSortController.ON_DOWN);\n                int dragHandleId = a.getResourceId(\n                        R.styleable.DragSortListView_drag_handle_id,\n                        0);\n                int flingHandleId = a.getResourceId(\n                        R.styleable.DragSortListView_fling_handle_id,\n                        0);\n                int clickRemoveId = a.getResourceId(\n                        R.styleable.DragSortListView_click_remove_id,\n                        0);\n                int bgColor = a.getColor(\n                        R.styleable.DragSortListView_float_background_color,\n                        Color.BLACK);\n\n                DragSortController controller = new DragSortController(\n                        this, dragHandleId, dragInitMode, removeMode,\n                        clickRemoveId, flingHandleId);\n                controller.setRemoveEnabled(removeEnabled);\n                controller.setSortEnabled(sortEnabled);\n                controller.setBackgroundColor(bgColor);\n\n                mFloatViewManager = controller;\n                setOnTouchListener(controller);\n            }\n\n            a.recycle();\n        }\n\n        mDragScroller = new DragScroller();\n\n        float smoothness = 0.5f;\n        if (removeAnimDuration > 0) {\n            mRemoveAnimator = new RemoveAnimator(smoothness, removeAnimDuration);\n        }\n        // mLiftAnimator = new LiftAnimator(smoothness, 100);\n        if (dropAnimDuration > 0) {\n            mDropAnimator = new DropAnimator(smoothness, dropAnimDuration);\n        }\n\n        mCancelEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0f, 0f, 0f, 0f, 0, 0f,\n                0f, 0, 0);\n\n        // construct the dataset observer\n        mObserver = new DataSetObserver() {\n            private void cancel() {\n                if (mDragState == DRAGGING) {\n                    cancelDrag();\n                }\n            }\n\n            @Override\n            public void onChanged() {\n                cancel();\n            }\n\n            @Override\n            public void onInvalidated() {\n                cancel();\n            }\n        };\n    }\n\n    /**\n     * Usually called from a FloatViewManager. The float alpha\n     * will be reset to the xml-defined value every time a drag\n     * is stopped.\n     */\n    public void setFloatAlpha(float alpha) {\n        mCurrFloatAlpha = alpha;\n    }\n\n    public float getFloatAlpha() {\n        return mCurrFloatAlpha;\n    }\n\n    /**\n     * Set maximum drag scroll speed in positions/second. Only applies\n     * if using default ScrollSpeedProfile.\n     * \n     * @param max Maximum scroll speed.\n     */\n    public void setMaxScrollSpeed(float max) {\n        mMaxScrollSpeed = max;\n    }\n\n    /**\n     * For each DragSortListView Listener interface implemented by\n     * <code>adapter</code>, this method calls the appropriate\n     * set*Listener method with <code>adapter</code> as the argument.\n     * \n     * @param adapter The ListAdapter providing data to back\n     * DragSortListView.\n     *\n     * @see android.widget.ListView#setAdapter(android.widget.ListAdapter)\n     */\n    @Override\n    public void setAdapter(ListAdapter adapter) {\n        if (adapter != null) {\n            mAdapterWrapper = new AdapterWrapper(adapter);\n            adapter.registerDataSetObserver(mObserver);\n\n            if (adapter instanceof DropListener) {\n                setDropListener((DropListener) adapter);\n            }\n            if (adapter instanceof DragListener) {\n                setDragListener((DragListener) adapter);\n            }\n            if (adapter instanceof RemoveListener) {\n                setRemoveListener((RemoveListener) adapter);\n            }\n        } else {\n            mAdapterWrapper = null;\n        }\n\n        super.setAdapter(mAdapterWrapper);\n    }\n\n    /**\n     * As opposed to {@link ListView#getAdapter()}, which returns\n     * a heavily wrapped ListAdapter (DragSortListView wraps the\n     * input ListAdapter {\\emph and} ListView wraps the wrapped one).\n     *\n     * @return The ListAdapter set as the argument of {@link setAdapter()}\n     */\n    public ListAdapter getInputAdapter() {\n        if (mAdapterWrapper == null) {\n            return null;\n        } else {\n            return mAdapterWrapper.getAdapter();\n        }\n    }\n\n    private class AdapterWrapper extends BaseAdapter {\n        private ListAdapter mAdapter;\n\n        public AdapterWrapper(ListAdapter adapter) {\n            super();\n            mAdapter = adapter;\n            \n            mAdapter.registerDataSetObserver(new DataSetObserver() {\n                public void onChanged() {\n                    notifyDataSetChanged();\n                }\n\n                public void onInvalidated() {\n                    notifyDataSetInvalidated();\n                }\n            });\n        }\n\n        public ListAdapter getAdapter() {\n            return mAdapter;\n        }\n\n        @Override\n        public long getItemId(int position) {\n            return mAdapter.getItemId(position);\n        }\n\n        @Override\n        public Object getItem(int position) {\n            return mAdapter.getItem(position);\n        }\n\n        @Override\n        public int getCount() {\n            return mAdapter.getCount();\n        }\n\n        @Override\n        public boolean areAllItemsEnabled() {\n            return mAdapter.areAllItemsEnabled();\n        }\n\n        @Override\n        public boolean isEnabled(int position) {\n            return mAdapter.isEnabled(position);\n        }\n        \n        @Override\n        public int getItemViewType(int position) {\n            return mAdapter.getItemViewType(position);\n        }\n\n        @Override\n        public int getViewTypeCount() {\n            return mAdapter.getViewTypeCount();\n        }\n        \n        @Override\n        public boolean hasStableIds() {\n            return mAdapter.hasStableIds();\n        }\n        \n        @Override\n        public boolean isEmpty() {\n            return mAdapter.isEmpty();\n        }\n\n\n        @Override\n        public View getView(int position, View convertView, ViewGroup parent) {\n\n            DragSortItemView v;\n            View child;\n            // Log.d(\"mobeta\",\n            // \"getView: position=\"+position+\" convertView=\"+convertView);\n            if (convertView != null) {\n                v = (DragSortItemView) convertView;\n                View oldChild = v.getChildAt(0);\n\n                child = mAdapter.getView(position, oldChild, DragSortListView.this);\n                if (child != oldChild) {\n                    // shouldn't get here if user is reusing convertViews\n                    // properly\n                    if (oldChild != null) {\n                        v.removeViewAt(0);\n                    }\n                    v.addView(child);\n                }\n            } else {\n                child = mAdapter.getView(position, null, DragSortListView.this);\n                if (child instanceof Checkable) {\n                    v = new DragSortItemViewCheckable(getContext());\n                } else {\n                    v = new DragSortItemView(getContext());\n                }\n                v.setLayoutParams(new AbsListView.LayoutParams(\n                        ViewGroup.LayoutParams.FILL_PARENT,\n                        ViewGroup.LayoutParams.WRAP_CONTENT));\n                v.addView(child);\n            }\n\n            // Set the correct item height given drag state; passed\n            // View needs to be measured if measurement is required.\n            adjustItem(position + getHeaderViewsCount(), v, true);\n\n            return v;\n        }\n    }\n\n    private void drawDivider(int expPosition, Canvas canvas) {\n\n        final Drawable divider = getDivider();\n        final int dividerHeight = getDividerHeight();\n        // Log.d(\"mobeta\", \"div=\"+divider+\" divH=\"+dividerHeight);\n\n        if (divider != null && dividerHeight != 0) {\n            final ViewGroup expItem = (ViewGroup) getChildAt(expPosition\n                    - getFirstVisiblePosition());\n            if (expItem != null) {\n                final int l = getPaddingLeft();\n                final int r = getWidth() - getPaddingRight();\n                final int t;\n                final int b;\n\n                final int childHeight = expItem.getChildAt(0).getHeight();\n\n                if (expPosition > mSrcPos) {\n                    t = expItem.getTop() + childHeight;\n                    b = t + dividerHeight;\n                } else {\n                    b = expItem.getBottom() - childHeight;\n                    t = b - dividerHeight;\n                }\n                // Log.d(\"mobeta\", \"l=\"+l+\" t=\"+t+\" r=\"+r+\" b=\"+b);\n\n                // Have to clip to support ColorDrawable on <= Gingerbread\n                canvas.save();\n                canvas.clipRect(l, t, r, b);\n                divider.setBounds(l, t, r, b);\n                divider.draw(canvas);\n                canvas.restore();\n            }\n        }\n    }\n\n    @Override\n    protected void dispatchDraw(Canvas canvas) {\n        super.dispatchDraw(canvas);\n\n        if (mDragState != IDLE) {\n            // draw the divider over the expanded item\n            if (mFirstExpPos != mSrcPos) {\n                drawDivider(mFirstExpPos, canvas);\n            }\n            if (mSecondExpPos != mFirstExpPos && mSecondExpPos != mSrcPos) {\n                drawDivider(mSecondExpPos, canvas);\n            }\n        }\n\n        if (mFloatView != null) {\n            // draw the float view over everything\n            final int w = mFloatView.getWidth();\n            final int h = mFloatView.getHeight();\n\n            int x = mFloatLoc.x;\n\n            int width = getWidth();\n            if (x < 0)\n                x = -x;\n            float alphaMod;\n            if (x < width) {\n                alphaMod = ((float) (width - x)) / ((float) width);\n                alphaMod *= alphaMod;\n            } else {\n                alphaMod = 0;\n            }\n\n            final int alpha = (int) (255f * mCurrFloatAlpha * alphaMod);\n\n            canvas.save();\n            // Log.d(\"mobeta\", \"clip rect bounds: \" + canvas.getClipBounds());\n            canvas.translate(mFloatLoc.x, mFloatLoc.y);\n            canvas.clipRect(0, 0, w, h);\n\n            // Log.d(\"mobeta\", \"clip rect bounds: \" + canvas.getClipBounds());\n            canvas.saveLayerAlpha(0, 0, w, h, alpha, Canvas.ALL_SAVE_FLAG);\n            mFloatView.draw(canvas);\n            canvas.restore();\n            canvas.restore();\n        }\n    }\n\n    private int getItemHeight(int position) {\n        View v = getChildAt(position - getFirstVisiblePosition());\n\n        if (v != null) {\n            // item is onscreen, just get the height of the View\n            return v.getHeight();\n        } else {\n            // item is offscreen. get child height and calculate\n            // item height based on current shuffle state\n            return calcItemHeight(position, getChildHeight(position));\n        }\n    }\n\n    private void printPosData() {\n        Log.d(\"mobeta\", \"mSrcPos=\" + mSrcPos + \" mFirstExpPos=\" + mFirstExpPos + \" mSecondExpPos=\"\n                + mSecondExpPos);\n    }\n\n    private class HeightCache {\n\n        private SparseIntArray mMap;\n        private ArrayList<Integer> mOrder;\n        private int mMaxSize;\n\n        public HeightCache(int size) {\n            mMap = new SparseIntArray(size);\n            mOrder = new ArrayList<Integer>(size);\n            mMaxSize = size;\n        }\n\n        /**\n         * Add item height at position if doesn't already exist.\n         */\n        public void add(int position, int height) {\n            int currHeight = mMap.get(position, -1);\n            if (currHeight != height) {\n                if (currHeight == -1) {\n                    if (mMap.size() == mMaxSize) {\n                        // remove oldest entry\n                        mMap.delete(mOrder.remove(0));\n                    }\n                } else {\n                    // move position to newest slot\n                    mOrder.remove((Integer) position);\n                }\n                mMap.put(position, height);\n                mOrder.add(position);\n            }\n        }\n\n        public int get(int position) {\n            return mMap.get(position, -1);\n        }\n\n        public void clear() {\n            mMap.clear();\n            mOrder.clear();\n        }\n\n    }\n\n    /**\n     * Get the shuffle edge for item at position when top of\n     * item is at y-coord top. Assumes that current item heights\n     * are consistent with current float view location and\n     * thus expanded positions and slide fraction. i.e. Should not be\n     * called between update of expanded positions/slide fraction\n     * and layoutChildren.\n     *\n     * @param position \n     * @param top\n     * @param height Height of item at position. If -1, this function\n     * calculates this height.\n     *\n     * @return Shuffle line between position-1 and position (for\n     * the given view of the list; that is, for when top of item at\n     * position has y-coord of given `top`). If\n     * floating View (treated as horizontal line) is dropped\n     * immediately above this line, it lands in position-1. If\n     * dropped immediately below this line, it lands in position.\n     */\n    private int getShuffleEdge(int position, int top) {\n\n        final int numHeaders = getHeaderViewsCount();\n        final int numFooters = getFooterViewsCount();\n\n        // shuffle edges are defined between items that can be\n        // dragged; there are N-1 of them if there are N draggable\n        // items.\n\n        if (position <= numHeaders || (position >= getCount() - numFooters)) {\n            return top;\n        }\n\n        int divHeight = getDividerHeight();\n\n        int edge;\n\n        int maxBlankHeight = mFloatViewHeight - mItemHeightCollapsed;\n        int childHeight = getChildHeight(position);\n        int itemHeight = getItemHeight(position);\n\n        // first calculate top of item given that floating View is\n        // centered over src position\n        int otop = top;\n        if (mSecondExpPos <= mSrcPos) {\n            // items are expanded on and/or above the source position\n\n            if (position == mSecondExpPos && mFirstExpPos != mSecondExpPos) {\n                if (position == mSrcPos) {\n                    otop = top + itemHeight - mFloatViewHeight;\n                } else {\n                    int blankHeight = itemHeight - childHeight;\n                    otop = top + blankHeight - maxBlankHeight;\n                }\n            } else if (position > mSecondExpPos && position <= mSrcPos) {\n                otop = top - maxBlankHeight;\n            }\n\n        } else {\n            // items are expanded on and/or below the source position\n\n            if (position > mSrcPos && position <= mFirstExpPos) {\n                otop = top + maxBlankHeight;\n            } else if (position == mSecondExpPos && mFirstExpPos != mSecondExpPos) {\n                int blankHeight = itemHeight - childHeight;\n                otop = top + blankHeight;\n            }\n        }\n\n        // otop is set\n        if (position <= mSrcPos) {\n            edge = otop + (mFloatViewHeight - divHeight - getChildHeight(position - 1)) / 2;\n        } else {\n            edge = otop + (childHeight - divHeight - mFloatViewHeight) / 2;\n        }\n\n        return edge;\n    }\n\n    private boolean updatePositions() {\n\n        final int first = getFirstVisiblePosition();\n        int startPos = mFirstExpPos;\n        View startView = getChildAt(startPos - first);\n\n        if (startView == null) {\n            startPos = first + getChildCount() / 2;\n            startView = getChildAt(startPos - first);\n        }\n        int startTop = startView.getTop();\n\n        int itemHeight = startView.getHeight();\n\n        int edge = getShuffleEdge(startPos, startTop);\n        int lastEdge = edge;\n\n        int divHeight = getDividerHeight();\n\n        // Log.d(\"mobeta\", \"float mid=\"+mFloatViewMid);\n\n        int itemPos = startPos;\n        int itemTop = startTop;\n        if (mFloatViewMid < edge) {\n            // scanning up for float position\n            // Log.d(\"mobeta\", \"    edge=\"+edge);\n            while (itemPos >= 0) {\n                itemPos--;\n                itemHeight = getItemHeight(itemPos);\n\n                if (itemPos == 0) {\n                    edge = itemTop - divHeight - itemHeight;\n                    break;\n                }\n\n                itemTop -= itemHeight + divHeight;\n                edge = getShuffleEdge(itemPos, itemTop);\n                // Log.d(\"mobeta\", \"    edge=\"+edge);\n\n                if (mFloatViewMid >= edge) {\n                    break;\n                }\n\n                lastEdge = edge;\n            }\n        } else {\n            // scanning down for float position\n            // Log.d(\"mobeta\", \"    edge=\"+edge);\n            final int count = getCount();\n            while (itemPos < count) {\n                if (itemPos == count - 1) {\n                    edge = itemTop + divHeight + itemHeight;\n                    break;\n                }\n\n                itemTop += divHeight + itemHeight;\n                itemHeight = getItemHeight(itemPos + 1);\n                edge = getShuffleEdge(itemPos + 1, itemTop);\n                // Log.d(\"mobeta\", \"    edge=\"+edge);\n\n                // test for hit\n                if (mFloatViewMid < edge) {\n                    break;\n                }\n\n                lastEdge = edge;\n                itemPos++;\n            }\n        }\n\n        final int numHeaders = getHeaderViewsCount();\n        final int numFooters = getFooterViewsCount();\n\n        boolean updated = false;\n\n        int oldFirstExpPos = mFirstExpPos;\n        int oldSecondExpPos = mSecondExpPos;\n        float oldSlideFrac = mSlideFrac;\n\n        if (mAnimate) {\n            int edgeToEdge = Math.abs(edge - lastEdge);\n\n            int edgeTop, edgeBottom;\n            if (mFloatViewMid < edge) {\n                edgeBottom = edge;\n                edgeTop = lastEdge;\n            } else {\n                edgeTop = edge;\n                edgeBottom = lastEdge;\n            }\n            // Log.d(\"mobeta\", \"edgeTop=\"+edgeTop+\" edgeBot=\"+edgeBottom);\n\n            int slideRgnHeight = (int) (0.5f * mSlideRegionFrac * edgeToEdge);\n            float slideRgnHeightF = (float) slideRgnHeight;\n            int slideEdgeTop = edgeTop + slideRgnHeight;\n            int slideEdgeBottom = edgeBottom - slideRgnHeight;\n\n            // Three regions\n            if (mFloatViewMid < slideEdgeTop) {\n                mFirstExpPos = itemPos - 1;\n                mSecondExpPos = itemPos;\n                mSlideFrac = 0.5f * ((float) (slideEdgeTop - mFloatViewMid)) / slideRgnHeightF;\n                // Log.d(\"mobeta\",\n                // \"firstExp=\"+mFirstExpPos+\" secExp=\"+mSecondExpPos+\" slideFrac=\"+mSlideFrac);\n            } else if (mFloatViewMid < slideEdgeBottom) {\n                mFirstExpPos = itemPos;\n                mSecondExpPos = itemPos;\n            } else {\n                mFirstExpPos = itemPos;\n                mSecondExpPos = itemPos + 1;\n                mSlideFrac = 0.5f * (1.0f + ((float) (edgeBottom - mFloatViewMid))\n                        / slideRgnHeightF);\n                // Log.d(\"mobeta\",\n                // \"firstExp=\"+mFirstExpPos+\" secExp=\"+mSecondExpPos+\" slideFrac=\"+mSlideFrac);\n            }\n\n        } else {\n            mFirstExpPos = itemPos;\n            mSecondExpPos = itemPos;\n        }\n\n        // correct for headers and footers\n        if (mFirstExpPos < numHeaders) {\n            itemPos = numHeaders;\n            mFirstExpPos = itemPos;\n            mSecondExpPos = itemPos;\n        } else if (mSecondExpPos >= getCount() - numFooters) {\n            itemPos = getCount() - numFooters - 1;\n            mFirstExpPos = itemPos;\n            mSecondExpPos = itemPos;\n        }\n\n        if (mFirstExpPos != oldFirstExpPos || mSecondExpPos != oldSecondExpPos\n                || mSlideFrac != oldSlideFrac) {\n            updated = true;\n        }\n\n        if (itemPos != mFloatPos) {\n            if (mDragListener != null) {\n                mDragListener.drag(mFloatPos - numHeaders, itemPos - numHeaders);\n            }\n\n            mFloatPos = itemPos;\n            updated = true;\n        }\n\n        return updated;\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n\n        if (mTrackDragSort) {\n            mDragSortTracker.appendState();\n        }\n    }\n\n    private class SmoothAnimator implements Runnable {\n        protected long mStartTime;\n\n        private float mDurationF;\n\n        private float mAlpha;\n        private float mA, mB, mC, mD;\n\n        private boolean mCanceled;\n\n        public SmoothAnimator(float smoothness, int duration) {\n            mAlpha = smoothness;\n            mDurationF = (float) duration;\n            mA = mD = 1f / (2f * mAlpha * (1f - mAlpha));\n            mB = mAlpha / (2f * (mAlpha - 1f));\n            mC = 1f / (1f - mAlpha);\n        }\n\n        public float transform(float frac) {\n            if (frac < mAlpha) {\n                return mA * frac * frac;\n            } else if (frac < 1f - mAlpha) {\n                return mB + mC * frac;\n            } else {\n                return 1f - mD * (frac - 1f) * (frac - 1f);\n            }\n        }\n\n        public void start() {\n            mStartTime = SystemClock.uptimeMillis();\n            mCanceled = false;\n            onStart();\n            post(this);\n        }\n\n        public void cancel() {\n            mCanceled = true;\n        }\n\n        public void onStart() {\n            // stub\n        }\n\n        public void onUpdate(float frac, float smoothFrac) {\n            // stub\n        }\n\n        public void onStop() {\n            // stub\n        }\n\n        @Override\n        public void run() {\n            if (mCanceled) {\n                return;\n            }\n\n            float fraction = ((float) (SystemClock.uptimeMillis() - mStartTime)) / mDurationF;\n\n            if (fraction >= 1f) {\n                onUpdate(1f, 1f);\n                onStop();\n            } else {\n                onUpdate(fraction, transform(fraction));\n                post(this);\n            }\n        }\n    }\n\n    /**\n     * Centers floating View under touch point.\n     */\n    private class LiftAnimator extends SmoothAnimator {\n\n        private float mInitDragDeltaY;\n        private float mFinalDragDeltaY;\n\n        public LiftAnimator(float smoothness, int duration) {\n            super(smoothness, duration);\n        }\n\n        @Override\n        public void onStart() {\n            mInitDragDeltaY = mDragDeltaY;\n            mFinalDragDeltaY = mFloatViewHeightHalf;\n        }\n\n        @Override\n        public void onUpdate(float frac, float smoothFrac) {\n            if (mDragState != DRAGGING) {\n                cancel();\n            } else {\n                mDragDeltaY = (int) (smoothFrac * mFinalDragDeltaY + (1f - smoothFrac)\n                        * mInitDragDeltaY);\n                mFloatLoc.y = mY - mDragDeltaY;\n                doDragFloatView(true);\n            }\n        }\n    }\n\n    /**\n     * Centers floating View over drop slot before destroying.\n     */\n    private class DropAnimator extends SmoothAnimator {\n\n        private int mDropPos;\n        private int srcPos;\n        private float mInitDeltaY;\n        private float mInitDeltaX;\n\n        public DropAnimator(float smoothness, int duration) {\n            super(smoothness, duration);\n        }\n\n        @Override\n        public void onStart() {\n            mDropPos = mFloatPos;\n            srcPos = mSrcPos;\n            mDragState = DROPPING;\n            mInitDeltaY = mFloatLoc.y - getTargetY();\n            mInitDeltaX = mFloatLoc.x - getPaddingLeft();\n        }\n\n        private int getTargetY() {\n            final int first = getFirstVisiblePosition();\n            final int otherAdjust = (mItemHeightCollapsed + getDividerHeight()) / 2;\n            View v = getChildAt(mDropPos - first);\n            int targetY = -1;\n            if (v != null) {\n                if (mDropPos == srcPos) {\n                    targetY = v.getTop();\n                } else if (mDropPos < srcPos) {\n                    // expanded down\n                    targetY = v.getTop() - otherAdjust;\n                } else {\n                    // expanded up\n                    targetY = v.getBottom() + otherAdjust - mFloatViewHeight;\n                }\n            } else {\n                // drop position is not on screen?? no animation\n                cancel();\n            }\n\n            return targetY;\n        }\n\n        @Override\n        public void onUpdate(float frac, float smoothFrac) {\n            final int targetY = getTargetY();\n            final int targetX = getPaddingLeft();\n            final float deltaY = mFloatLoc.y - targetY;\n            final float deltaX = mFloatLoc.x - targetX;\n            final float f = 1f - smoothFrac;\n            if (f < Math.abs(deltaY / mInitDeltaY) || f < Math.abs(deltaX / mInitDeltaX)) {\n                mFloatLoc.y = targetY + (int) (mInitDeltaY * f);\n                mFloatLoc.x = getPaddingLeft() + (int) (mInitDeltaX * f);\n                doDragFloatView(true);\n            }\n        }\n\n        @Override\n        public void onStop() {\n            dropFloatView();\n        }\n\n    }\n\n    /**\n     * Collapses expanded items.\n     */\n    private class RemoveAnimator extends SmoothAnimator {\n\n        private float mFloatLocX;\n        private float mFirstStartBlank;\n        private float mSecondStartBlank;\n\n        private int mFirstChildHeight = -1;\n        private int mSecondChildHeight = -1;\n\n        private int mFirstPos;\n        private int mSecondPos;\n        private int srcPos;\n\n        public RemoveAnimator(float smoothness, int duration) {\n            super(smoothness, duration);\n        }\n\n        @Override\n        public void onStart() {\n            mFirstChildHeight = -1;\n            mSecondChildHeight = -1;\n            mFirstPos = mFirstExpPos;\n            mSecondPos = mSecondExpPos;\n            srcPos = mSrcPos;\n            mDragState = REMOVING;\n\n            mFloatLocX = mFloatLoc.x;\n            if (mUseRemoveVelocity) {\n                float minVelocity = 2f * getWidth();\n                if (mRemoveVelocityX == 0) {\n                    mRemoveVelocityX = (mFloatLocX < 0 ? -1 : 1) * minVelocity;\n                } else {\n                    minVelocity *= 2;\n                    if (mRemoveVelocityX < 0 && mRemoveVelocityX > -minVelocity)\n                        mRemoveVelocityX = -minVelocity;\n                    else if (mRemoveVelocityX > 0 && mRemoveVelocityX < minVelocity)\n                        mRemoveVelocityX = minVelocity;\n                }\n            } else {\n                destroyFloatView();\n            }\n        }\n\n        @Override\n        public void onUpdate(float frac, float smoothFrac) {\n            float f = 1f - smoothFrac;\n\n            final int firstVis = getFirstVisiblePosition();\n            View item = getChildAt(mFirstPos - firstVis);\n            ViewGroup.LayoutParams lp;\n            int blank;\n\n            if (mUseRemoveVelocity) {\n                float dt = (float) (SystemClock.uptimeMillis() - mStartTime) / 1000;\n                if (dt == 0)\n                    return;\n                float dx = mRemoveVelocityX * dt;\n                int w = getWidth();\n                mRemoveVelocityX += (mRemoveVelocityX > 0 ? 1 : -1) * dt * w;\n                mFloatLocX += dx;\n                mFloatLoc.x = (int) mFloatLocX;\n                if (mFloatLocX < w && mFloatLocX > -w) {\n                    mStartTime = SystemClock.uptimeMillis();\n                    doDragFloatView(true);\n                    return;\n                }\n            }\n\n            if (item != null) {\n                if (mFirstChildHeight == -1) {\n                    mFirstChildHeight = getChildHeight(mFirstPos, item, false);\n                    mFirstStartBlank = (float) (item.getHeight() - mFirstChildHeight);\n                }\n                blank = Math.max((int) (f * mFirstStartBlank), 1);\n                lp = item.getLayoutParams();\n                lp.height = mFirstChildHeight + blank;\n                item.setLayoutParams(lp);\n            }\n            if (mSecondPos != mFirstPos) {\n                item = getChildAt(mSecondPos - firstVis);\n                if (item != null) {\n                    if (mSecondChildHeight == -1) {\n                        mSecondChildHeight = getChildHeight(mSecondPos, item, false);\n                        mSecondStartBlank = (float) (item.getHeight() - mSecondChildHeight);\n                    }\n                    blank = Math.max((int) (f * mSecondStartBlank), 1);\n                    lp = item.getLayoutParams();\n                    lp.height = mSecondChildHeight + blank;\n                    item.setLayoutParams(lp);\n                }\n            }\n        }\n\n        @Override\n        public void onStop() {\n            doRemoveItem();\n        }\n    }\n\n    public void removeItem(int which) {\n\n        mUseRemoveVelocity = false;\n        removeItem(which, 0);\n    }\n\n    /**\n     * Removes an item from the list and animates the removal.\n     *\n     * @param which Position to remove (NOTE: headers/footers ignored!\n     * this is a position in your input ListAdapter).\n     * @param velocityX \n     */\n    public void removeItem(int which, float velocityX) {\n        if (mDragState == IDLE || mDragState == DRAGGING) {\n\n            if (mDragState == IDLE) {\n                // called from outside drag-sort\n                mSrcPos = getHeaderViewsCount() + which;\n                mFirstExpPos = mSrcPos;\n                mSecondExpPos = mSrcPos;\n                mFloatPos = mSrcPos;\n                View v = getChildAt(mSrcPos - getFirstVisiblePosition());\n                if (v != null) {\n                    v.setVisibility(View.INVISIBLE);\n                }\n            }\n\n            mDragState = REMOVING;\n            mRemoveVelocityX = velocityX;\n\n            if (mInTouchEvent) {\n                switch (mCancelMethod) {\n                    case ON_TOUCH_EVENT:\n                        super.onTouchEvent(mCancelEvent);\n                        break;\n                    case ON_INTERCEPT_TOUCH_EVENT:\n                        super.onInterceptTouchEvent(mCancelEvent);\n                        break;\n                }\n            }\n\n            if (mRemoveAnimator != null) {\n                mRemoveAnimator.start();\n            } else {\n                doRemoveItem(which);\n            }\n        }\n    }\n\n    /**\n     * Move an item, bypassing the drag-sort process. Simply calls\n     * through to {@link DropListener#drop(int, int)}.\n     * \n     * @param from Position to move (NOTE: headers/footers ignored!\n     * this is a position in your input ListAdapter).\n     * @param to Target position (NOTE: headers/footers ignored!\n     * this is a position in your input ListAdapter).\n     */\n    public void moveItem(int from, int to) {\n        if (mDropListener != null) {\n            final int count = getInputAdapter().getCount();\n            if (from >= 0 && from < count && to >= 0 && to < count) {\n                mDropListener.drop(from, to);\n            }\n        }\n    }\n\n    /**\n     * Cancel a drag. Calls {@link #stopDrag(boolean, boolean)} with\n     * <code>true</code> as the first argument.\n     */\n    public void cancelDrag() {\n        if (mDragState == DRAGGING) {\n            mDragScroller.stopScrolling(true);\n            destroyFloatView();\n            clearPositions();\n            adjustAllItems();\n\n            if (mInTouchEvent) {\n                mDragState = STOPPED;\n            } else {\n                mDragState = IDLE;\n            }\n        }\n    }\n\n    private void clearPositions() {\n        mSrcPos = -1;\n        mFirstExpPos = -1;\n        mSecondExpPos = -1;\n        mFloatPos = -1;\n    }\n\n    private void dropFloatView() {\n        // must set to avoid cancelDrag being called from the\n        // DataSetObserver\n        mDragState = DROPPING;\n\n        if (mDropListener != null && mFloatPos >= 0 && mFloatPos < getCount()) {\n            final int numHeaders = getHeaderViewsCount();\n            mDropListener.drop(mSrcPos - numHeaders, mFloatPos - numHeaders);\n        }\n\n        destroyFloatView();\n\n        adjustOnReorder();\n        clearPositions();\n        adjustAllItems();\n\n        // now the drag is done\n        if (mInTouchEvent) {\n            mDragState = STOPPED;\n        } else {\n            mDragState = IDLE;\n        }\n    }\n\n    private void doRemoveItem() {\n        doRemoveItem(mSrcPos - getHeaderViewsCount());\n    }\n\n    /**\n     * Removes dragged item from the list. Calls RemoveListener.\n     */\n    private void doRemoveItem(int which) {\n        // must set to avoid cancelDrag being called from the\n        // DataSetObserver\n        mDragState = REMOVING;\n\n        // end it\n        if (mRemoveListener != null) {\n            mRemoveListener.remove(which);\n        }\n\n        destroyFloatView();\n\n        adjustOnReorder();\n        clearPositions();\n\n        // now the drag is done\n        if (mInTouchEvent) {\n            mDragState = STOPPED;\n        } else {\n            mDragState = IDLE;\n        }\n    }\n\n    private void adjustOnReorder() {\n        final int firstPos = getFirstVisiblePosition();\n        // Log.d(\"mobeta\", \"first=\"+firstPos+\" src=\"+mSrcPos);\n        if (mSrcPos < firstPos) {\n            // collapsed src item is off screen;\n            // adjust the scroll after item heights have been fixed\n            View v = getChildAt(0);\n            int top = 0;\n            if (v != null) {\n                top = v.getTop();\n            }\n            // Log.d(\"mobeta\", \"top=\"+top+\" fvh=\"+mFloatViewHeight);\n            setSelectionFromTop(firstPos - 1, top - getPaddingTop());\n        }\n    }\n\n    /**\n     * Stop a drag in progress. Pass <code>true</code> if you would\n     * like to remove the dragged item from the list.\n     *\n     * @param remove Remove the dragged item from the list. Calls\n     * a registered RemoveListener, if one exists. Otherwise, calls\n     * the DropListener, if one exists.\n     *\n     * @return True if the stop was successful. False if there is\n     * no floating View.\n     */\n    public boolean stopDrag(boolean remove) {\n        mUseRemoveVelocity = false;\n        return stopDrag(remove, 0);\n    }\n\n    public boolean stopDragWithVelocity(boolean remove, float velocityX) {\n\n        mUseRemoveVelocity = true;\n        return stopDrag(remove, velocityX);\n    }\n\n    public boolean stopDrag(boolean remove, float velocityX) {\n        if (mFloatView != null) {\n            mDragScroller.stopScrolling(true);\n\n            if (remove) {\n                removeItem(mSrcPos - getHeaderViewsCount(), velocityX);\n            } else {\n                if (mDropAnimator != null) {\n                    mDropAnimator.start();\n                } else {\n                    dropFloatView();\n                }\n            }\n\n            if (mTrackDragSort) {\n                mDragSortTracker.stopTracking();\n            }\n\n            return true;\n        } else {\n            // stop failed\n            return false;\n        }\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent ev) {\n        if (mIgnoreTouchEvent) {\n            mIgnoreTouchEvent = false;\n            return false;\n        }\n\n        if (!mDragEnabled) {\n            return super.onTouchEvent(ev);\n        }\n\n        boolean more = false;\n\n        boolean lastCallWasIntercept = mLastCallWasIntercept;\n        mLastCallWasIntercept = false;\n\n        if (!lastCallWasIntercept) {\n            saveTouchCoords(ev);\n        }\n\n        // if (mFloatView != null) {\n        if (mDragState == DRAGGING) {\n            onDragTouchEvent(ev);\n            more = true; // give us more!\n        } else {\n            // what if float view is null b/c we dropped in middle\n            // of drag touch event?\n\n            // if (mDragState != STOPPED) {\n            if (mDragState == IDLE) {\n                if (super.onTouchEvent(ev)) {\n                    more = true;\n                }\n            }\n\n            int action = ev.getAction() & MotionEvent.ACTION_MASK;\n\n            switch (action) {\n                case MotionEvent.ACTION_CANCEL:\n                case MotionEvent.ACTION_UP:\n                    doActionUpOrCancel();\n                    break;\n                default:\n                    if (more) {\n                        mCancelMethod = ON_TOUCH_EVENT;\n                    }\n            }\n        }\n\n        return more;\n    }\n\n    private void doActionUpOrCancel() {\n        mCancelMethod = NO_CANCEL;\n        mInTouchEvent = false;\n        if (mDragState == STOPPED) {\n            mDragState = IDLE;\n        }\n        mCurrFloatAlpha = mFloatAlpha;\n        mListViewIntercepted = false;\n        mChildHeightCache.clear();\n    }\n\n    private void saveTouchCoords(MotionEvent ev) {\n        int action = ev.getAction() & MotionEvent.ACTION_MASK;\n        if (action != MotionEvent.ACTION_DOWN) {\n            mLastX = mX;\n            mLastY = mY;\n        }\n        mX = (int) ev.getX();\n        mY = (int) ev.getY();\n        if (action == MotionEvent.ACTION_DOWN) {\n            mLastX = mX;\n            mLastY = mY;\n        }\n        mOffsetX = (int) ev.getRawX() - mX;\n        mOffsetY = (int) ev.getRawY() - mY;\n    }\n\n    public boolean listViewIntercepted() {\n        return mListViewIntercepted;\n    }\n\n    private boolean mListViewIntercepted = false;\n\n    @Override\n    public boolean onInterceptTouchEvent(MotionEvent ev) {\n        if (!mDragEnabled) {\n            return super.onInterceptTouchEvent(ev);\n        }\n\n        saveTouchCoords(ev);\n        mLastCallWasIntercept = true;\n\n        int action = ev.getAction() & MotionEvent.ACTION_MASK;\n\n        if (action == MotionEvent.ACTION_DOWN) {\n            if (mDragState != IDLE) {\n                // intercept and ignore\n                mIgnoreTouchEvent = true;\n                return true;\n            }\n            mInTouchEvent = true;\n        }\n\n        boolean intercept = false;\n\n        // the following deals with calls to super.onInterceptTouchEvent\n        if (mFloatView != null) {\n            // super's touch event canceled in startDrag\n            intercept = true;\n        } else {\n            if (super.onInterceptTouchEvent(ev)) {\n                mListViewIntercepted = true;\n                intercept = true;\n            }\n\n            switch (action) {\n                case MotionEvent.ACTION_CANCEL:\n                case MotionEvent.ACTION_UP:\n                    doActionUpOrCancel();\n                    break;\n                default:\n                    if (intercept) {\n                        mCancelMethod = ON_TOUCH_EVENT;\n                    } else {\n                        mCancelMethod = ON_INTERCEPT_TOUCH_EVENT;\n                    }\n            }\n        }\n\n        if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {\n            mInTouchEvent = false;\n        }\n\n        return intercept;\n    }\n\n    /**\n     * Set the width of each drag scroll region by specifying\n     * a fraction of the ListView height.\n     *\n     * @param heightFraction Fraction of ListView height. Capped at\n     * 0.5f.\n     * \n     */\n    public void setDragScrollStart(float heightFraction) {\n        setDragScrollStarts(heightFraction, heightFraction);\n    }\n\n    /**\n     * Set the width of each drag scroll region by specifying\n     * a fraction of the ListView height.\n     *\n     * @param upperFrac Fraction of ListView height for up-scroll bound.\n     * Capped at 0.5f.\n     * @param lowerFrac Fraction of ListView height for down-scroll bound.\n     * Capped at 0.5f.\n     * \n     */\n    public void setDragScrollStarts(float upperFrac, float lowerFrac) {\n        if (lowerFrac > 0.5f) {\n            mDragDownScrollStartFrac = 0.5f;\n        } else {\n            mDragDownScrollStartFrac = lowerFrac;\n        }\n\n        if (upperFrac > 0.5f) {\n            mDragUpScrollStartFrac = 0.5f;\n        } else {\n            mDragUpScrollStartFrac = upperFrac;\n        }\n\n        if (getHeight() != 0) {\n            updateScrollStarts();\n        }\n    }\n\n    private void continueDrag(int x, int y) {\n\n        // proposed position\n        mFloatLoc.x = x - mDragDeltaX;\n        mFloatLoc.y = y - mDragDeltaY;\n\n        doDragFloatView(true);\n\n        int minY = Math.min(y, mFloatViewMid + mFloatViewHeightHalf);\n        int maxY = Math.max(y, mFloatViewMid - mFloatViewHeightHalf);\n\n        // get the current scroll direction\n        int currentScrollDir = mDragScroller.getScrollDir();\n\n        if (minY > mLastY && minY > mDownScrollStartY && currentScrollDir != DragScroller.DOWN) {\n            // dragged down, it is below the down scroll start and it is not\n            // scrolling up\n\n            if (currentScrollDir != DragScroller.STOP) {\n                // moved directly from up scroll to down scroll\n                mDragScroller.stopScrolling(true);\n            }\n\n            // start scrolling down\n            mDragScroller.startScrolling(DragScroller.DOWN);\n        } else if (maxY < mLastY && maxY < mUpScrollStartY && currentScrollDir != DragScroller.UP) {\n            // dragged up, it is above the up scroll start and it is not\n            // scrolling up\n\n            if (currentScrollDir != DragScroller.STOP) {\n                // moved directly from down scroll to up scroll\n                mDragScroller.stopScrolling(true);\n            }\n\n            // start scrolling up\n            mDragScroller.startScrolling(DragScroller.UP);\n        }\n        else if (maxY >= mUpScrollStartY && minY <= mDownScrollStartY\n                && mDragScroller.isScrolling()) {\n            // not in the upper nor in the lower drag-scroll regions but it is\n            // still scrolling\n\n            mDragScroller.stopScrolling(true);\n        }\n    }\n\n    private void updateScrollStarts() {\n        final int padTop = getPaddingTop();\n        final int listHeight = getHeight() - padTop - getPaddingBottom();\n        float heightF = (float) listHeight;\n\n        mUpScrollStartYF = padTop + mDragUpScrollStartFrac * heightF;\n        mDownScrollStartYF = padTop + (1.0f - mDragDownScrollStartFrac) * heightF;\n\n        mUpScrollStartY = (int) mUpScrollStartYF;\n        mDownScrollStartY = (int) mDownScrollStartYF;\n\n        mDragUpScrollHeight = mUpScrollStartYF - padTop;\n        mDragDownScrollHeight = padTop + listHeight - mDownScrollStartYF;\n    }\n\n    @Override\n    protected void onSizeChanged(int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n        updateScrollStarts();\n    }\n\n    private void adjustAllItems() {\n        final int first = getFirstVisiblePosition();\n        final int last = getLastVisiblePosition();\n\n        int begin = Math.max(0, getHeaderViewsCount() - first);\n        int end = Math.min(last - first, getCount() - 1 - getFooterViewsCount() - first);\n\n        for (int i = begin; i <= end; ++i) {\n            View v = getChildAt(i);\n            if (v != null) {\n                adjustItem(first + i, v, false);\n            }\n        }\n    }\n\n    private void adjustItem(int position) {\n        View v = getChildAt(position - getFirstVisiblePosition());\n\n        if (v != null) {\n            adjustItem(position, v, false);\n        }\n    }\n\n    /**\n     * Sets layout param height, gravity, and visibility  on\n     * wrapped item.\n     */\n    private void adjustItem(int position, View v, boolean invalidChildHeight) {\n\n        // Adjust item height\n        ViewGroup.LayoutParams lp = v.getLayoutParams();\n        int height;\n        if (position != mSrcPos && position != mFirstExpPos && position != mSecondExpPos) {\n            height = ViewGroup.LayoutParams.WRAP_CONTENT;\n        } else {\n            height = calcItemHeight(position, v, invalidChildHeight);\n        }\n\n        if (height != lp.height) {\n            lp.height = height;\n            v.setLayoutParams(lp);\n        }\n\n        // Adjust item gravity\n        if (position == mFirstExpPos || position == mSecondExpPos) {\n            if (position < mSrcPos) {\n                ((DragSortItemView) v).setGravity(Gravity.BOTTOM);\n            } else if (position > mSrcPos) {\n                ((DragSortItemView) v).setGravity(Gravity.TOP);\n            }\n        }\n\n        // Finally adjust item visibility\n\n        int oldVis = v.getVisibility();\n        int vis = View.VISIBLE;\n\n        if (position == mSrcPos && mFloatView != null) {\n            vis = View.INVISIBLE;\n        }\n\n        if (vis != oldVis) {\n            v.setVisibility(vis);\n        }\n    }\n\n    private int getChildHeight(int position) {\n        if (position == mSrcPos) {\n            return 0;\n        }\n\n        View v = getChildAt(position - getFirstVisiblePosition());\n\n        if (v != null) {\n            // item is onscreen, therefore child height is valid,\n            // hence the \"true\"\n            return getChildHeight(position, v, false);\n        } else {\n            // item is offscreen\n            // first check cache for child height at this position\n            int childHeight = mChildHeightCache.get(position);\n            if (childHeight != -1) {\n                // Log.d(\"mobeta\", \"found child height in cache!\");\n                return childHeight;\n            }\n\n            final ListAdapter adapter = getAdapter();\n            int type = adapter.getItemViewType(position);\n\n            // There might be a better place for checking for the following\n            final int typeCount = adapter.getViewTypeCount();\n            if (typeCount != mSampleViewTypes.length) {\n                mSampleViewTypes = new View[typeCount];\n            }\n\n            if (type >= 0) {\n                if (mSampleViewTypes[type] == null) {\n                    v = adapter.getView(position, null, this);\n                    mSampleViewTypes[type] = v;\n                } else {\n                    v = adapter.getView(position, mSampleViewTypes[type], this);\n                }\n            } else {\n                // type is HEADER_OR_FOOTER or IGNORE\n                v = adapter.getView(position, null, this);\n            }\n\n            // current child height is invalid, hence \"true\" below\n            childHeight = getChildHeight(position, v, true);\n\n            // cache it because this could have been expensive\n            mChildHeightCache.add(position, childHeight);\n\n            return childHeight;\n        }\n    }\n\n    private int getChildHeight(int position, View item, boolean invalidChildHeight) {\n        if (position == mSrcPos) {\n            return 0;\n        }\n\n        View child;\n        if (position < getHeaderViewsCount() || position >= getCount() - getFooterViewsCount()) {\n            child = item;\n        } else {\n            child = ((ViewGroup) item).getChildAt(0);\n        }\n\n        ViewGroup.LayoutParams lp = child.getLayoutParams();\n\n        if (lp != null) {\n            if (lp.height > 0) {\n                return lp.height;\n            }\n        }\n\n        int childHeight = child.getHeight();\n\n        if (childHeight == 0 || invalidChildHeight) {\n            measureItem(child);\n            childHeight = child.getMeasuredHeight();\n        }\n\n        return childHeight;\n    }\n\n    private int calcItemHeight(int position, View item, boolean invalidChildHeight) {\n        return calcItemHeight(position, getChildHeight(position, item, invalidChildHeight));\n    }\n\n    private int calcItemHeight(int position, int childHeight) {\n\n        int divHeight = getDividerHeight();\n\n        boolean isSliding = mAnimate && mFirstExpPos != mSecondExpPos;\n        int maxNonSrcBlankHeight = mFloatViewHeight - mItemHeightCollapsed;\n        int slideHeight = (int) (mSlideFrac * maxNonSrcBlankHeight);\n\n        int height;\n\n        if (position == mSrcPos) {\n            if (mSrcPos == mFirstExpPos) {\n                if (isSliding) {\n                    height = slideHeight + mItemHeightCollapsed;\n                } else {\n                    height = mFloatViewHeight;\n                }\n            } else if (mSrcPos == mSecondExpPos) {\n                // if gets here, we know an item is sliding\n                height = mFloatViewHeight - slideHeight;\n            } else {\n                height = mItemHeightCollapsed;\n            }\n        } else if (position == mFirstExpPos) {\n            if (isSliding) {\n                height = childHeight + slideHeight;\n            } else {\n                height = childHeight + maxNonSrcBlankHeight;\n            }\n        } else if (position == mSecondExpPos) {\n            // we know an item is sliding (b/c 2ndPos != 1stPos)\n            height = childHeight + maxNonSrcBlankHeight - slideHeight;\n        } else {\n            height = childHeight;\n        }\n\n        return height;\n    }\n\n    @Override\n    public void requestLayout() {\n        if (!mBlockLayoutRequests) {\n            super.requestLayout();\n        }\n    }\n\n    private int adjustScroll(int movePos, View moveItem, int oldFirstExpPos, int oldSecondExpPos) {\n        int adjust = 0;\n\n        final int childHeight = getChildHeight(movePos);\n\n        int moveHeightBefore = moveItem.getHeight();\n        int moveHeightAfter = calcItemHeight(movePos, childHeight);\n\n        int moveBlankBefore = moveHeightBefore;\n        int moveBlankAfter = moveHeightAfter;\n        if (movePos != mSrcPos) {\n            moveBlankBefore -= childHeight;\n            moveBlankAfter -= childHeight;\n        }\n\n        int maxBlank = mFloatViewHeight;\n        if (mSrcPos != mFirstExpPos && mSrcPos != mSecondExpPos) {\n            maxBlank -= mItemHeightCollapsed;\n        }\n\n        if (movePos <= oldFirstExpPos) {\n            if (movePos > mFirstExpPos) {\n                adjust += maxBlank - moveBlankAfter;\n            }\n        } else if (movePos == oldSecondExpPos) {\n            if (movePos <= mFirstExpPos) {\n                adjust += moveBlankBefore - maxBlank;\n            } else if (movePos == mSecondExpPos) {\n                adjust += moveHeightBefore - moveHeightAfter;\n            } else {\n                adjust += moveBlankBefore;\n            }\n        } else {\n            if (movePos <= mFirstExpPos) {\n                adjust -= maxBlank;\n            } else if (movePos == mSecondExpPos) {\n                adjust -= moveBlankAfter;\n            }\n        }\n\n        return adjust;\n    }\n\n    private void measureItem(View item) {\n        ViewGroup.LayoutParams lp = item.getLayoutParams();\n        if (lp == null) {\n            lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);\n            item.setLayoutParams(lp);\n        }\n        int wspec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec, getListPaddingLeft()\n                + getListPaddingRight(), lp.width);\n        int hspec;\n        if (lp.height > 0) {\n            hspec = MeasureSpec.makeMeasureSpec(lp.height, MeasureSpec.EXACTLY);\n        } else {\n            hspec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);\n        }\n        item.measure(wspec, hspec);\n    }\n\n    private void measureFloatView() {\n        if (mFloatView != null) {\n            measureItem(mFloatView);\n            mFloatViewHeight = mFloatView.getMeasuredHeight();\n            mFloatViewHeightHalf = mFloatViewHeight / 2;\n        }\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec);\n        // Log.d(\"mobeta\", \"onMeasure called\");\n        if (mFloatView != null) {\n            if (mFloatView.isLayoutRequested()) {\n                measureFloatView();\n            }\n            mFloatViewOnMeasured = true; // set to false after layout\n        }\n        mWidthMeasureSpec = widthMeasureSpec;\n    }\n\n    @Override\n    protected void layoutChildren() {\n        super.layoutChildren();\n\n        if (mFloatView != null) {\n            if (mFloatView.isLayoutRequested() && !mFloatViewOnMeasured) {\n                // Have to measure here when usual android measure\n                // pass is skipped. This happens during a drag-sort\n                // when layoutChildren is called directly.\n                measureFloatView();\n            }\n            mFloatView.layout(0, 0, mFloatView.getMeasuredWidth(), mFloatView.getMeasuredHeight());\n            mFloatViewOnMeasured = false;\n        }\n    }\n\n    protected boolean onDragTouchEvent(MotionEvent ev) {\n        // we are in a drag\n        int action = ev.getAction() & MotionEvent.ACTION_MASK;\n\n        switch (ev.getAction() & MotionEvent.ACTION_MASK) {\n            case MotionEvent.ACTION_CANCEL:\n                if (mDragState == DRAGGING) {\n                    cancelDrag();\n                }\n                doActionUpOrCancel();\n                break;\n            case MotionEvent.ACTION_UP:\n                // Log.d(\"mobeta\", \"calling stopDrag from onDragTouchEvent\");\n                if (mDragState == DRAGGING) {\n                    stopDrag(false);\n                }\n                doActionUpOrCancel();\n                break;\n            case MotionEvent.ACTION_MOVE:\n                continueDrag((int) ev.getX(), (int) ev.getY());\n                break;\n        }\n\n        return true;\n    }\n\n    private boolean mFloatViewInvalidated = false;\n\n    private void invalidateFloatView() {\n        mFloatViewInvalidated = true;\n    }\n\n    /**\n     * Start a drag of item at <code>position</code> using the\n     * registered FloatViewManager. Calls through\n     * to {@link #startDrag(int,View,int,int,int)} after obtaining\n     * the floating View from the FloatViewManager.\n     *\n     * @param position Item to drag.\n     * @param dragFlags Flags that restrict some movements of the\n     * floating View. For example, set <code>dragFlags |= \n     * ~{@link #DRAG_NEG_X}</code> to allow dragging the floating\n     * View in all directions except off the screen to the left.\n     * @param deltaX Offset in x of the touch coordinate from the\n     * left edge of the floating View (i.e. touch-x minus float View\n     * left).\n     * @param deltaY Offset in y of the touch coordinate from the\n     * top edge of the floating View (i.e. touch-y minus float View\n     * top).\n     *\n     * @return True if the drag was started, false otherwise. This\n     * <code>startDrag</code> will fail if we are not currently in\n     * a touch event, there is no registered FloatViewManager,\n     * or the FloatViewManager returns a null View.\n     */\n    public boolean startDrag(int position, int dragFlags, int deltaX, int deltaY) {\n        if (!mInTouchEvent || mFloatViewManager == null) {\n            return false;\n        }\n\n        View v = mFloatViewManager.onCreateFloatView(position);\n\n        if (v == null) {\n            return false;\n        } else {\n            return startDrag(position, v, dragFlags, deltaX, deltaY);\n        }\n\n    }\n\n    /**\n     * Start a drag of item at <code>position</code> without using\n     * a FloatViewManager.\n     *\n     * @param position Item to drag.\n     * @param floatView Floating View.\n     * @param dragFlags Flags that restrict some movements of the\n     * floating View. For example, set <code>dragFlags |= \n     * ~{@link #DRAG_NEG_X}</code> to allow dragging the floating\n     * View in all directions except off the screen to the left.\n     * @param deltaX Offset in x of the touch coordinate from the\n     * left edge of the floating View (i.e. touch-x minus float View\n     * left).\n     * @param deltaY Offset in y of the touch coordinate from the\n     * top edge of the floating View (i.e. touch-y minus float View\n     * top).\n     *\n     * @return True if the drag was started, false otherwise. This\n     * <code>startDrag</code> will fail if we are not currently in\n     * a touch event, <code>floatView</code> is null, or there is\n     * a drag in progress.\n     */\n    public boolean startDrag(int position, View floatView, int dragFlags, int deltaX, int deltaY) {\n        if (mDragState != IDLE || !mInTouchEvent || mFloatView != null || floatView == null\n                || !mDragEnabled) {\n            return false;\n        }\n\n        if (getParent() != null) {\n            getParent().requestDisallowInterceptTouchEvent(true);\n        }\n\n        int pos = position + getHeaderViewsCount();\n        mFirstExpPos = pos;\n        mSecondExpPos = pos;\n        mSrcPos = pos;\n        mFloatPos = pos;\n\n        // mDragState = dragType;\n        mDragState = DRAGGING;\n        mDragFlags = 0;\n        mDragFlags |= dragFlags;\n\n        mFloatView = floatView;\n        measureFloatView(); // sets mFloatViewHeight\n\n        mDragDeltaX = deltaX;\n        mDragDeltaY = deltaY;\n        mDragStartY = mY;\n\n        // updateFloatView(mX - mDragDeltaX, mY - mDragDeltaY);\n        mFloatLoc.x = mX - mDragDeltaX;\n        mFloatLoc.y = mY - mDragDeltaY;\n\n        // set src item invisible\n        final View srcItem = getChildAt(mSrcPos - getFirstVisiblePosition());\n\n        if (srcItem != null) {\n            srcItem.setVisibility(View.INVISIBLE);\n        }\n\n        if (mTrackDragSort) {\n            mDragSortTracker.startTracking();\n        }\n\n        // once float view is created, events are no longer passed\n        // to ListView\n        switch (mCancelMethod) {\n            case ON_TOUCH_EVENT:\n                super.onTouchEvent(mCancelEvent);\n                break;\n            case ON_INTERCEPT_TOUCH_EVENT:\n                super.onInterceptTouchEvent(mCancelEvent);\n                break;\n        }\n\n        requestLayout();\n\n        if (mLiftAnimator != null) {\n            mLiftAnimator.start();\n        }\n\n        return true;\n    }\n\n    private void doDragFloatView(boolean forceInvalidate) {\n        int movePos = getFirstVisiblePosition() + getChildCount() / 2;\n        View moveItem = getChildAt(getChildCount() / 2);\n\n        if (moveItem == null) {\n            return;\n        }\n\n        doDragFloatView(movePos, moveItem, forceInvalidate);\n    }\n\n    private void doDragFloatView(int movePos, View moveItem, boolean forceInvalidate) {\n        mBlockLayoutRequests = true;\n\n        updateFloatView();\n\n        int oldFirstExpPos = mFirstExpPos;\n        int oldSecondExpPos = mSecondExpPos;\n\n        boolean updated = updatePositions();\n\n        if (updated) {\n            adjustAllItems();\n            int scroll = adjustScroll(movePos, moveItem, oldFirstExpPos, oldSecondExpPos);\n            // Log.d(\"mobeta\", \"  adjust scroll=\"+scroll);\n\n            setSelectionFromTop(movePos, moveItem.getTop() + scroll - getPaddingTop());\n            layoutChildren();\n        }\n\n        if (updated || forceInvalidate) {\n            invalidate();\n        }\n\n        mBlockLayoutRequests = false;\n    }\n\n    /**\n     * Sets float View location based on suggested values and\n     * constraints set in mDragFlags.\n     */\n    private void updateFloatView() {\n\n        if (mFloatViewManager != null) {\n            mTouchLoc.set(mX, mY);\n            mFloatViewManager.onDragFloatView(mFloatView, mFloatLoc, mTouchLoc);\n        }\n\n        final int floatX = mFloatLoc.x;\n        final int floatY = mFloatLoc.y;\n\n        // restrict x motion\n        int padLeft = getPaddingLeft();\n        if ((mDragFlags & DRAG_POS_X) == 0 && floatX > padLeft) {\n            mFloatLoc.x = padLeft;\n        } else if ((mDragFlags & DRAG_NEG_X) == 0 && floatX < padLeft) {\n            mFloatLoc.x = padLeft;\n        }\n\n        // keep floating view from going past bottom of last header view\n        final int numHeaders = getHeaderViewsCount();\n        final int numFooters = getFooterViewsCount();\n        final int firstPos = getFirstVisiblePosition();\n        final int lastPos = getLastVisiblePosition();\n\n        // Log.d(\"mobeta\",\n        // \"nHead=\"+numHeaders+\" nFoot=\"+numFooters+\" first=\"+firstPos+\" last=\"+lastPos);\n        int topLimit = getPaddingTop();\n        if (firstPos < numHeaders) {\n            topLimit = getChildAt(numHeaders - firstPos - 1).getBottom();\n        }\n        if ((mDragFlags & DRAG_NEG_Y) == 0) {\n            if (firstPos <= mSrcPos) {\n                topLimit = Math.max(getChildAt(mSrcPos - firstPos).getTop(), topLimit);\n            }\n        }\n        // bottom limit is top of first footer View or\n        // bottom of last item in list\n        int bottomLimit = getHeight() - getPaddingBottom();\n        if (lastPos >= getCount() - numFooters - 1) {\n            bottomLimit = getChildAt(getCount() - numFooters - 1 - firstPos).getBottom();\n        }\n        if ((mDragFlags & DRAG_POS_Y) == 0) {\n            if (lastPos >= mSrcPos) {\n                bottomLimit = Math.min(getChildAt(mSrcPos - firstPos).getBottom(), bottomLimit);\n            }\n        }\n\n        // Log.d(\"mobeta\", \"dragView top=\" + (y - mDragDeltaY));\n        // Log.d(\"mobeta\", \"limit=\" + limit);\n        // Log.d(\"mobeta\", \"mDragDeltaY=\" + mDragDeltaY);\n\n        if (floatY < topLimit) {\n            mFloatLoc.y = topLimit;\n        } else if (floatY + mFloatViewHeight > bottomLimit) {\n            mFloatLoc.y = bottomLimit - mFloatViewHeight;\n        }\n\n        // get y-midpoint of floating view (constrained to ListView bounds)\n        mFloatViewMid = mFloatLoc.y + mFloatViewHeightHalf;\n    }\n\n    private void destroyFloatView() {\n        if (mFloatView != null) {\n            mFloatView.setVisibility(GONE);\n            if (mFloatViewManager != null) {\n                mFloatViewManager.onDestroyFloatView(mFloatView);\n            }\n            mFloatView = null;\n            invalidate();\n        }\n    }\n\n    /**\n     * Interface for customization of the floating View appearance\n     * and dragging behavior. Implement\n     * your own and pass it to {@link #setFloatViewManager}. If\n     * your own is not passed, the default {@link SimpleFloatViewManager}\n     * implementation is used.\n     */\n    public interface FloatViewManager {\n        /**\n         * Return the floating View for item at <code>position</code>.\n         * DragSortListView will measure and layout this View for you,\n         * so feel free to just inflate it. You can help DSLV by\n         * setting some {@link ViewGroup.LayoutParams} on this View;\n         * otherwise it will set some for you (with a width of FILL_PARENT\n         * and a height of WRAP_CONTENT).\n         *\n         * @param position Position of item to drag (NOTE:\n         * <code>position</code> excludes header Views; thus, if you\n         * want to call {@link ListView#getChildAt(int)}, you will need\n         * to add {@link ListView#getHeaderViewsCount()} to the index).\n         *\n         * @return The View you wish to display as the floating View.\n         */\n        public View onCreateFloatView(int position);\n\n        /**\n         * Called whenever the floating View is dragged. Float View\n         * properties can be changed here. Also, the upcoming location\n         * of the float View can be altered by setting\n         * <code>location.x</code> and <code>location.y</code>.\n         *\n         * @param floatView The floating View.\n         * @param location The location (top-left; relative to DSLV\n         * top-left) at which the float\n         * View would like to appear, given the current touch location\n         * and the offset provided in {@link DragSortListView#startDrag}.\n         * @param touch The current touch location (relative to DSLV\n         * top-left).\n         * @param pendingScroll \n         */\n        public void onDragFloatView(View floatView, Point location, Point touch);\n\n        /**\n         * Called when the float View is dropped; lets you perform\n         * any necessary cleanup. The internal DSLV floating View\n         * reference is set to null immediately after this is called.\n         *\n         * @param floatView The floating View passed to\n         * {@link #onCreateFloatView(int)}.\n         */\n        public void onDestroyFloatView(View floatView);\n    }\n\n    public void setFloatViewManager(FloatViewManager manager) {\n        mFloatViewManager = manager;\n    }\n\n    public void setDragListener(DragListener l) {\n        mDragListener = l;\n    }\n\n    /**\n     * Allows for easy toggling between a DragSortListView\n     * and a regular old ListView. If enabled, items are\n     * draggable, where the drag init mode determines how\n     * items are lifted (see {@link setDragInitMode(int)}).\n     * If disabled, items cannot be dragged.\n     *\n     * @param enabled Set <code>true</code> to enable list\n     * item dragging\n     */\n    public void setDragEnabled(boolean enabled) {\n        mDragEnabled = enabled;\n    }\n\n    public boolean isDragEnabled() {\n        return mDragEnabled;\n    }\n\n    /**\n     * This better reorder your ListAdapter! DragSortListView does not do this\n     * for you; doesn't make sense to. Make sure\n     * {@link BaseAdapter#notifyDataSetChanged()} or something like it is called\n     * in your implementation. Furthermore, if you have a choiceMode other than\n     * none and the ListAdapter does not return true for\n     * {@link ListAdapter#hasStableIds()}, you will need to call\n     * {@link #moveCheckState(int, int)} to move the check boxes along with the\n     * list items.\n     * \n     * @param l\n     */\n    public void setDropListener(DropListener l) {\n        mDropListener = l;\n    }\n\n    /**\n     * Probably a no-brainer, but make sure that your remove listener\n     * calls {@link BaseAdapter#notifyDataSetChanged()} or something like it.\n     * When an item removal occurs, DragSortListView\n     * relies on a redraw of all the items to recover invisible views\n     * and such. Strictly speaking, if you remove something, your dataset\n     * has changed...\n     * \n     * @param l\n     */\n    public void setRemoveListener(RemoveListener l) {\n        mRemoveListener = l;\n    }\n\n    public interface DragListener {\n        public void drag(int from, int to);\n    }\n\n    /**\n     * Your implementation of this has to reorder your ListAdapter! \n     * Make sure to call\n     * {@link BaseAdapter#notifyDataSetChanged()} or something like it\n     * in your implementation.\n     * \n     * @author heycosmo\n     *\n     */\n    public interface DropListener {\n        public void drop(int from, int to);\n    }\n\n    /**\n     * Make sure to call\n     * {@link BaseAdapter#notifyDataSetChanged()} or something like it\n     * in your implementation.\n     * \n     * @author heycosmo\n     *\n     */\n    public interface RemoveListener {\n        public void remove(int which);\n    }\n\n    public interface DragSortListener extends DropListener, DragListener, RemoveListener {\n    }\n\n    public void setDragSortListener(DragSortListener l) {\n        setDropListener(l);\n        setDragListener(l);\n        setRemoveListener(l);\n    }\n\n    /**\n     * Completely custom scroll speed profile. Default increases linearly\n     * with position and is constant in time. Create your own by implementing\n     * {@link DragSortListView.DragScrollProfile}.\n     * \n     * @param ssp\n     */\n    public void setDragScrollProfile(DragScrollProfile ssp) {\n        if (ssp != null) {\n            mScrollProfile = ssp;\n        }\n    }\n\n    /**\n     * Use this to move the check state of an item from one position to another\n     * in a drop operation. If you have a choiceMode which is not none, this\n     * method must be called when the order of items changes in an underlying\n     * adapter which does not have stable IDs (see\n     * {@link ListAdapter#hasStableIds()}). This is because without IDs, the\n     * ListView has no way of knowing which items have moved where, and cannot\n     * update the check state accordingly.\n     * <p>\n     * A word of warning about a \"feature\" in Android that you may run into when\n     * dealing with movable list items: for an adapter that <em>does</em> have\n     * stable IDs, ListView will attempt to locate each item based on its ID and\n     * move the check state from the item's old position to the new position —\n     * which is all fine and good (and removes the need for calling this\n     * function), except for the half-baked approach. Apparently to save time in\n     * the naive algorithm used, ListView will only search for an ID in the\n     * close neighborhood of the old position. If the user moves an item too far\n     * (specifically, more than 20 rows away), ListView will give up and just\n     * force the item to be unchecked. So if there is a reasonable chance that\n     * the user will move items more than 20 rows away from the original\n     * position, you may wish to use an adapter with unstable IDs and call this\n     * method manually instead.\n     * \n     * @param from\n     * @param to\n     */\n    public void moveCheckState(int from, int to) {\n        // This method runs in O(n log n) time (n being the number of list\n        // items). The bottleneck is the call to AbsListView.setItemChecked,\n        // which is O(log n) because of the binary search involved in calling\n        // SparseBooleanArray.put().\n        //\n        // To improve on the average time, we minimize the number of calls to\n        // setItemChecked by only calling it for items that actually have a\n        // changed state. This is achieved by building a list containing the\n        // start and end of the \"runs\" of checked items, and then moving the\n        // runs. Note that moving an item from A to B is essentially a rotation\n        // of the range of items in [A, B]. Let's say we have\n        // . . U V X Y Z . .\n        // and move U after Z. This is equivalent to a rotation one step to the\n        // left within the range you are moving across:\n        // . . V X Y Z U . .\n        //\n        // So, to perform the move we enumerate all the runs within the move\n        // range, then rotate each run one step to the left or right (depending\n        // on move direction). For example, in the list:\n        // X X . X X X . X\n        // we have two runs. One begins at the last item of the list and wraps\n        // around to the beginning, ending at position 1. The second begins at\n        // position 3 and ends at position 5. To rotate a run, regardless of\n        // length, we only need to set a check mark at one end of the run, and\n        // clear a check mark at the other end:\n        // X . X X X . X X\n        SparseBooleanArray cip = getCheckedItemPositions();\n        int rangeStart = from;\n        int rangeEnd = to;\n        if (to < from) {\n            rangeStart = to;\n            rangeEnd = from;\n        }\n        rangeEnd += 1;\n\n        int[] runStart = new int[cip.size()];\n        int[] runEnd = new int[cip.size()];\n        int runCount = buildRunList(cip, rangeStart, rangeEnd, runStart, runEnd);\n        if (runCount == 1 && (runStart[0] == runEnd[0])) {\n            // Special case where all items are checked, we can never set any\n            // item to false like we do below.\n            return;\n        }\n\n        if (from < to) {\n            for (int i = 0; i != runCount; i++) {\n                setItemChecked(rotate(runStart[i], -1, rangeStart, rangeEnd), true);\n                setItemChecked(rotate(runEnd[i], -1, rangeStart, rangeEnd), false);\n            }\n\n        } else {\n            for (int i = 0; i != runCount; i++) {\n                setItemChecked(runStart[i], false);\n                setItemChecked(runEnd[i], true);\n            }\n        }\n    }\n\n    /**\n     * Use this when an item has been deleted, to move the check state of all\n     * following items up one step. If you have a choiceMode which is not none,\n     * this method must be called when the order of items changes in an\n     * underlying adapter which does not have stable IDs (see\n     * {@link ListAdapter#hasStableIds()}). This is because without IDs, the\n     * ListView has no way of knowing which items have moved where, and cannot\n     * update the check state accordingly.\n     * \n     * See also further comments on {@link #moveCheckState(int, int)}.\n     * \n     * @param position\n     */\n    public void removeCheckState(int position) {\n        SparseBooleanArray cip = getCheckedItemPositions();\n\n        if (cip.size() == 0)\n            return;\n        int[] runStart = new int[cip.size()];\n        int[] runEnd = new int[cip.size()];\n        int rangeStart = position;\n        int rangeEnd = cip.keyAt(cip.size() - 1) + 1;\n        int runCount = buildRunList(cip, rangeStart, rangeEnd, runStart, runEnd);\n        for (int i = 0; i != runCount; i++) {\n            if (!(runStart[i] == position || (runEnd[i] < runStart[i] && runEnd[i] > position))) {\n                // Only set a new check mark in front of this run if it does\n                // not contain the deleted position. If it does, we only need\n                // to make it one check mark shorter at the end.\n                setItemChecked(rotate(runStart[i], -1, rangeStart, rangeEnd), true);\n            }\n            setItemChecked(rotate(runEnd[i], -1, rangeStart, rangeEnd), false);\n        }\n    }\n\n    private static int buildRunList(SparseBooleanArray cip, int rangeStart,\n            int rangeEnd, int[] runStart, int[] runEnd) {\n        int runCount = 0;\n\n        int i = findFirstSetIndex(cip, rangeStart, rangeEnd);\n        if (i == -1)\n            return 0;\n\n        int position = cip.keyAt(i);\n        int currentRunStart = position;\n        int currentRunEnd = currentRunStart + 1;\n        for (i++; i < cip.size() && (position = cip.keyAt(i)) < rangeEnd; i++) {\n            if (!cip.valueAt(i)) // not checked => not interesting\n                continue;\n            if (position == currentRunEnd) {\n                currentRunEnd++;\n            } else {\n                runStart[runCount] = currentRunStart;\n                runEnd[runCount] = currentRunEnd;\n                runCount++;\n                currentRunStart = position;\n                currentRunEnd = position + 1;\n            }\n        }\n\n        if (currentRunEnd == rangeEnd) {\n            // rangeStart and rangeEnd are equivalent positions so to be\n            // consistent we translate them to the same integer value. That way\n            // we can check whether a run covers the entire range by just\n            // checking if the start equals the end position.\n            currentRunEnd = rangeStart;\n        }\n        runStart[runCount] = currentRunStart;\n        runEnd[runCount] = currentRunEnd;\n        runCount++;\n\n        if (runCount > 1) {\n            if (runStart[0] == rangeStart && runEnd[runCount - 1] == rangeStart) {\n                // The last run ends at the end of the range, and the first run\n                // starts at the beginning of the range. So they are actually\n                // part of the same run, except they wrap around the end of the\n                // range. To avoid adjacent runs, we need to merge them.\n                runStart[0] = runStart[runCount - 1];\n                runCount--;\n            }\n        }\n        return runCount;\n    }\n\n    private static int rotate(int value, int offset, int lowerBound, int upperBound) {\n        int windowSize = upperBound - lowerBound;\n\n        value += offset;\n        if (value < lowerBound) {\n            value += windowSize;\n        } else if (value >= upperBound) {\n            value -= windowSize;\n        }\n        return value;\n    }\n\n    private static int findFirstSetIndex(SparseBooleanArray sba, int rangeStart, int rangeEnd) {\n        int size = sba.size();\n        int i = insertionIndexForKey(sba, rangeStart);\n        while (i < size && sba.keyAt(i) < rangeEnd && !sba.valueAt(i))\n            i++;\n        if (i == size || sba.keyAt(i) >= rangeEnd)\n            return -1;\n        return i;\n    }\n\n    private static int insertionIndexForKey(SparseBooleanArray sba, int key) {\n        int low = 0;\n        int high = sba.size();\n        while (high - low > 0) {\n            int middle = (low + high) >> 1;\n            if (sba.keyAt(middle) < key)\n                low = middle + 1;\n            else\n                high = middle;\n        }\n        return low;\n    }\n\n    /**\n     * Interface for controlling\n     * scroll speed as a function of touch position and time. Use\n     * {@link DragSortListView#setDragScrollProfile(DragScrollProfile)} to\n     * set custom profile.\n     * \n     * @author heycosmo\n     *\n     */\n    public interface DragScrollProfile {\n        /**\n         * Return a scroll speed in pixels/millisecond. Always return a\n         * positive number.\n         * \n         * @param w Normalized position in scroll region (i.e. w \\in [0,1]).\n         * Small w typically means slow scrolling.\n         * @param t Time (in milliseconds) since start of scroll (handy if you\n         * want scroll acceleration).\n         * @return Scroll speed at position w and time t in pixels/ms.\n         */\n        float getSpeed(float w, long t);\n    }\n\n    private class DragScroller implements Runnable {\n\n        private boolean mAbort;\n\n        private long mPrevTime;\n        private long mCurrTime;\n\n        private int dy;\n        private float dt;\n        private long tStart;\n        private int scrollDir;\n\n        public final static int STOP = -1;\n        public final static int UP = 0;\n        public final static int DOWN = 1;\n\n        private float mScrollSpeed; // pixels per ms\n\n        private boolean mScrolling = false;\n\n        private int mLastHeader;\n        private int mFirstFooter;\n\n        public boolean isScrolling() {\n            return mScrolling;\n        }\n\n        public int getScrollDir() {\n            return mScrolling ? scrollDir : STOP;\n        }\n\n        public DragScroller() {\n        }\n\n        public void startScrolling(int dir) {\n            if (!mScrolling) {\n                // Debug.startMethodTracing(\"dslv-scroll\");\n                mAbort = false;\n                mScrolling = true;\n                tStart = SystemClock.uptimeMillis();\n                mPrevTime = tStart;\n                scrollDir = dir;\n                post(this);\n            }\n        }\n\n        public void stopScrolling(boolean now) {\n            if (now) {\n                DragSortListView.this.removeCallbacks(this);\n                mScrolling = false;\n            } else {\n                mAbort = true;\n            }\n\n            // Debug.stopMethodTracing();\n        }\n\n        @Override\n        public void run() {\n            if (mAbort) {\n                mScrolling = false;\n                return;\n            }\n\n            // Log.d(\"mobeta\", \"scroll\");\n\n            final int first = getFirstVisiblePosition();\n            final int last = getLastVisiblePosition();\n            final int count = getCount();\n            final int padTop = getPaddingTop();\n            final int listHeight = getHeight() - padTop - getPaddingBottom();\n\n            int minY = Math.min(mY, mFloatViewMid + mFloatViewHeightHalf);\n            int maxY = Math.max(mY, mFloatViewMid - mFloatViewHeightHalf);\n\n            if (scrollDir == UP) {\n                View v = getChildAt(0);\n                // Log.d(\"mobeta\", \"vtop=\"+v.getTop()+\" padtop=\"+padTop);\n                if (v == null) {\n                    mScrolling = false;\n                    return;\n                } else {\n                    if (first == 0 && v.getTop() == padTop) {\n                        mScrolling = false;\n                        return;\n                    }\n                }\n                mScrollSpeed = mScrollProfile.getSpeed((mUpScrollStartYF - maxY)\n                        / mDragUpScrollHeight, mPrevTime);\n            } else {\n                View v = getChildAt(last - first);\n                if (v == null) {\n                    mScrolling = false;\n                    return;\n                } else {\n                    if (last == count - 1 && v.getBottom() <= listHeight + padTop) {\n                        mScrolling = false;\n                        return;\n                    }\n                }\n                mScrollSpeed = -mScrollProfile.getSpeed((minY - mDownScrollStartYF)\n                        / mDragDownScrollHeight, mPrevTime);\n            }\n\n            mCurrTime = SystemClock.uptimeMillis();\n            dt = (float) (mCurrTime - mPrevTime);\n\n            // dy is change in View position of a list item; i.e. positive dy\n            // means user is scrolling up (list item moves down the screen,\n            // remember\n            // y=0 is at top of View).\n            dy = (int) Math.round(mScrollSpeed * dt);\n\n            int movePos;\n            if (dy >= 0) {\n                dy = Math.min(listHeight, dy);\n                movePos = first;\n            } else {\n                dy = Math.max(-listHeight, dy);\n                movePos = last;\n            }\n\n            final View moveItem = getChildAt(movePos - first);\n            int top = moveItem.getTop() + dy;\n\n            if (movePos == 0 && top > padTop) {\n                top = padTop;\n            }\n\n            // always do scroll\n            mBlockLayoutRequests = true;\n\n            setSelectionFromTop(movePos, top - padTop);\n            DragSortListView.this.layoutChildren();\n            invalidate();\n\n            mBlockLayoutRequests = false;\n\n            // scroll means relative float View movement\n            doDragFloatView(movePos, moveItem, false);\n\n            mPrevTime = mCurrTime;\n            // Log.d(\"mobeta\", \"  updated prevTime=\"+mPrevTime);\n\n            post(this);\n        }\n    }\n\n    private class DragSortTracker {\n        StringBuilder mBuilder = new StringBuilder();\n\n        File mFile;\n\n        private int mNumInBuffer = 0;\n        private int mNumFlushes = 0;\n\n        private boolean mTracking = false;\n\n        public DragSortTracker() {\n            File root = Environment.getExternalStorageDirectory();\n            mFile = new File(root, \"dslv_state.txt\");\n\n            if (!mFile.exists()) {\n                try {\n                    mFile.createNewFile();\n                    Log.d(\"mobeta\", \"file created\");\n                } catch (IOException e) {\n                    Log.w(\"mobeta\", \"Could not create dslv_state.txt\");\n                    Log.d(\"mobeta\", e.getMessage());\n                }\n            }\n\n        }\n\n        public void startTracking() {\n            mBuilder.append(\"<DSLVStates>\\n\");\n            mNumFlushes = 0;\n            mTracking = true;\n        }\n\n        public void appendState() {\n            if (!mTracking) {\n                return;\n            }\n\n            mBuilder.append(\"<DSLVState>\\n\");\n            final int children = getChildCount();\n            final int first = getFirstVisiblePosition();\n            mBuilder.append(\"    <Positions>\");\n            for (int i = 0; i < children; ++i) {\n                mBuilder.append(first + i).append(\",\");\n            }\n            mBuilder.append(\"</Positions>\\n\");\n\n            mBuilder.append(\"    <Tops>\");\n            for (int i = 0; i < children; ++i) {\n                mBuilder.append(getChildAt(i).getTop()).append(\",\");\n            }\n            mBuilder.append(\"</Tops>\\n\");\n            mBuilder.append(\"    <Bottoms>\");\n            for (int i = 0; i < children; ++i) {\n                mBuilder.append(getChildAt(i).getBottom()).append(\",\");\n            }\n            mBuilder.append(\"</Bottoms>\\n\");\n\n            mBuilder.append(\"    <FirstExpPos>\").append(mFirstExpPos).append(\"</FirstExpPos>\\n\");\n            mBuilder.append(\"    <FirstExpBlankHeight>\")\n                    .append(getItemHeight(mFirstExpPos) - getChildHeight(mFirstExpPos))\n                    .append(\"</FirstExpBlankHeight>\\n\");\n            mBuilder.append(\"    <SecondExpPos>\").append(mSecondExpPos).append(\"</SecondExpPos>\\n\");\n            mBuilder.append(\"    <SecondExpBlankHeight>\")\n                    .append(getItemHeight(mSecondExpPos) - getChildHeight(mSecondExpPos))\n                    .append(\"</SecondExpBlankHeight>\\n\");\n            mBuilder.append(\"    <SrcPos>\").append(mSrcPos).append(\"</SrcPos>\\n\");\n            mBuilder.append(\"    <SrcHeight>\").append(mFloatViewHeight + getDividerHeight())\n                    .append(\"</SrcHeight>\\n\");\n            mBuilder.append(\"    <ViewHeight>\").append(getHeight()).append(\"</ViewHeight>\\n\");\n            mBuilder.append(\"    <LastY>\").append(mLastY).append(\"</LastY>\\n\");\n            mBuilder.append(\"    <FloatY>\").append(mFloatViewMid).append(\"</FloatY>\\n\");\n            mBuilder.append(\"    <ShuffleEdges>\");\n            for (int i = 0; i < children; ++i) {\n                mBuilder.append(getShuffleEdge(first + i, getChildAt(i).getTop())).append(\",\");\n            }\n            mBuilder.append(\"</ShuffleEdges>\\n\");\n\n            mBuilder.append(\"</DSLVState>\\n\");\n            mNumInBuffer++;\n\n            if (mNumInBuffer > 1000) {\n                flush();\n                mNumInBuffer = 0;\n            }\n        }\n\n        public void flush() {\n            if (!mTracking) {\n                return;\n            }\n\n            // save to file on sdcard\n            try {\n                boolean append = true;\n                if (mNumFlushes == 0) {\n                    append = false;\n                }\n                FileWriter writer = new FileWriter(mFile, append);\n\n                writer.write(mBuilder.toString());\n                mBuilder.delete(0, mBuilder.length());\n\n                writer.flush();\n                writer.close();\n\n                mNumFlushes++;\n            } catch (IOException e) {\n                // do nothing\n            }\n        }\n\n        public void stopTracking() {\n            if (mTracking) {\n                mBuilder.append(\"</DSLVStates>\\n\");\n                flush();\n                mTracking = false;\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/mobeta/android/dslv/ResourceDragSortCursorAdapter.java",
    "content": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.mobeta.android.dslv;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.LayoutInflater;\n\n// taken from v4 rev. 10 ResourceCursorAdapter.java\n\n/**\n * Static library support version of the framework's {@link android.widget.ResourceCursorAdapter}.\n * Used to write apps that run on platforms prior to Android 3.0.  When running\n * on Android 3.0 or above, this implementation is still used; it does not try\n * to switch to the framework's implementation.  See the framework SDK\n * documentation for a class overview.\n */\npublic abstract class ResourceDragSortCursorAdapter extends DragSortCursorAdapter {\n    private int mLayout;\n\n    private int mDropDownLayout;\n    \n    private LayoutInflater mInflater;\n    \n    /**\n     * Constructor the enables auto-requery.\n     *\n     * @deprecated This option is discouraged, as it results in Cursor queries\n     * being performed on the application's UI thread and thus can cause poor\n     * responsiveness or even Application Not Responding errors.  As an alternative,\n     * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.\n     *\n     * @param context The context where the ListView associated with this adapter is running\n     * @param layout resource identifier of a layout file that defines the views\n     *            for this list item.  Unless you override them later, this will\n     *            define both the item views and the drop down views.\n     */\n    @Deprecated\n    public ResourceDragSortCursorAdapter(Context context, int layout, Cursor c) {\n        super(context, c);\n        mLayout = mDropDownLayout = layout;\n        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n    }\n    \n    /**\n     * Constructor with default behavior as per\n     * {@link CursorAdapter#CursorAdapter(Context, Cursor, boolean)}; it is recommended\n     * you not use this, but instead {@link #ResourceCursorAdapter(Context, int, Cursor, int)}.\n     * When using this constructor, {@link #FLAG_REGISTER_CONTENT_OBSERVER}\n     * will always be set.\n     *\n     * @param context The context where the ListView associated with this adapter is running\n     * @param layout resource identifier of a layout file that defines the views\n     *            for this list item.  Unless you override them later, this will\n     *            define both the item views and the drop down views.\n     * @param c The cursor from which to get the data.\n     * @param autoRequery If true the adapter will call requery() on the\n     *                    cursor whenever it changes so the most recent\n     *                    data is always displayed.  Using true here is discouraged.\n     */\n    public ResourceDragSortCursorAdapter(Context context, int layout, Cursor c, boolean autoRequery) {\n        super(context, c, autoRequery);\n        mLayout = mDropDownLayout = layout;\n        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n    }\n\n    /**\n     * Standard constructor.\n     *\n     * @param context The context where the ListView associated with this adapter is running\n     * @param layout Resource identifier of a layout file that defines the views\n     *            for this list item.  Unless you override them later, this will\n     *            define both the item views and the drop down views.\n     * @param c The cursor from which to get the data.\n     * @param flags Flags used to determine the behavior of the adapter,\n     * as per {@link CursorAdapter#CursorAdapter(Context, Cursor, int)}.\n     */\n    public ResourceDragSortCursorAdapter(Context context, int layout, Cursor c, int flags) {\n        super(context, c, flags);\n        mLayout = mDropDownLayout = layout;\n        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n    }\n\n    /**\n     * Inflates view(s) from the specified XML file.\n     * \n     * @see android.widget.CursorAdapter#newView(android.content.Context,\n     *      android.database.Cursor, ViewGroup)\n     */\n    @Override\n    public View newView(Context context, Cursor cursor, ViewGroup parent) {\n        return mInflater.inflate(mLayout, parent, false);\n    }\n\n    @Override\n    public View newDropDownView(Context context, Cursor cursor, ViewGroup parent) {\n        return mInflater.inflate(mDropDownLayout, parent, false);\n    }\n\n    /**\n     * <p>Sets the layout resource of the item views.</p>\n     *\n     * @param layout the layout resources used to create item views\n     */\n    public void setViewResource(int layout) {\n        mLayout = layout;\n    }\n    \n    /**\n     * <p>Sets the layout resource of the drop down views.</p>\n     *\n     * @param dropDownLayout the layout resources used to create drop down views\n     */\n    public void setDropDownViewResource(int dropDownLayout) {\n        mDropDownLayout = dropDownLayout;\n    }\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/mobeta/android/dslv/SimpleDragSortCursorAdapter.java",
    "content": "/*\n * Copyright (C) 2006 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.mobeta.android.dslv;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.view.View;\nimport android.widget.TextView;\nimport android.widget.ImageView;\n\n// taken from sdk/sources/android-16/android/widget/SimpleCursorAdapter.java\n\n/**\n * An easy adapter to map columns from a cursor to TextViews or ImageViews\n * defined in an XML file. You can specify which columns you want, which\n * views you want to display the columns, and the XML file that defines\n * the appearance of these views.\n *\n * Binding occurs in two phases. First, if a\n * {@link android.widget.SimpleCursorAdapter.ViewBinder} is available,\n * {@link ViewBinder#setViewValue(android.view.View, android.database.Cursor, int)}\n * is invoked. If the returned value is true, binding has occured. If the\n * returned value is false and the view to bind is a TextView,\n * {@link #setViewText(TextView, String)} is invoked. If the returned value\n * is false and the view to bind is an ImageView,\n * {@link #setViewImage(ImageView, String)} is invoked. If no appropriate\n * binding can be found, an {@link IllegalStateException} is thrown.\n *\n * If this adapter is used with filtering, for instance in an\n * {@link android.widget.AutoCompleteTextView}, you can use the\n * {@link android.widget.SimpleCursorAdapter.CursorToStringConverter} and the\n * {@link android.widget.FilterQueryProvider} interfaces\n * to get control over the filtering process. You can refer to\n * {@link #convertToString(android.database.Cursor)} and\n * {@link #runQueryOnBackgroundThread(CharSequence)} for more information.\n */\npublic class SimpleDragSortCursorAdapter extends ResourceDragSortCursorAdapter {\n    /**\n     * A list of columns containing the data to bind to the UI.\n     * This field should be made private, so it is hidden from the SDK.\n     * {@hide}\n     */\n    protected int[] mFrom;\n    /**\n     * A list of View ids representing the views to which the data must be bound.\n     * This field should be made private, so it is hidden from the SDK.\n     * {@hide}\n     */\n    protected int[] mTo;\n\n    private int mStringConversionColumn = -1;\n    private CursorToStringConverter mCursorToStringConverter;\n    private ViewBinder mViewBinder;\n\n    String[] mOriginalFrom;\n\n    /**\n     * Constructor the enables auto-requery.\n     *\n     * @deprecated This option is discouraged, as it results in Cursor queries\n     * being performed on the application's UI thread and thus can cause poor\n     * responsiveness or even Application Not Responding errors.  As an alternative,\n     * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.\n     */\n    @Deprecated\n    public SimpleDragSortCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {\n        super(context, layout, c);\n        mTo = to;\n        mOriginalFrom = from;\n        findColumns(c, from);\n    }\n\n    /**\n     * Standard constructor.\n     * \n     * @param context The context where the ListView associated with this\n     *            SimpleListItemFactory is running\n     * @param layout resource identifier of a layout file that defines the views\n     *            for this list item. The layout file should include at least\n     *            those named views defined in \"to\"\n     * @param c The database cursor.  Can be null if the cursor is not available yet.\n     * @param from A list of column names representing the data to bind to the UI.  Can be null \n     *            if the cursor is not available yet.\n     * @param to The views that should display column in the \"from\" parameter.\n     *            These should all be TextViews. The first N views in this list\n     *            are given the values of the first N columns in the from\n     *            parameter.  Can be null if the cursor is not available yet.\n     * @param flags Flags used to determine the behavior of the adapter,\n     * as per {@link CursorAdapter#CursorAdapter(Context, Cursor, int)}.\n     */\n    public SimpleDragSortCursorAdapter(Context context, int layout,\n            Cursor c, String[] from, int[] to, int flags) {\n        super(context, layout, c, flags);\n        mTo = to;\n        mOriginalFrom = from;\n        findColumns(c, from);\n    }\n\n    /**\n     * Binds all of the field names passed into the \"to\" parameter of the\n     * constructor with their corresponding cursor columns as specified in the\n     * \"from\" parameter.\n     *\n     * Binding occurs in two phases. First, if a\n     * {@link android.widget.SimpleCursorAdapter.ViewBinder} is available,\n     * {@link ViewBinder#setViewValue(android.view.View, android.database.Cursor, int)}\n     * is invoked. If the returned value is true, binding has occured. If the\n     * returned value is false and the view to bind is a TextView,\n     * {@link #setViewText(TextView, String)} is invoked. If the returned value is\n     * false and the view to bind is an ImageView,\n     * {@link #setViewImage(ImageView, String)} is invoked. If no appropriate\n     * binding can be found, an {@link IllegalStateException} is thrown.\n     *\n     * @throws IllegalStateException if binding cannot occur\n     * \n     * @see android.widget.CursorAdapter#bindView(android.view.View,\n     *      android.content.Context, android.database.Cursor)\n     * @see #getViewBinder()\n     * @see #setViewBinder(android.widget.SimpleCursorAdapter.ViewBinder)\n     * @see #setViewImage(ImageView, String)\n     * @see #setViewText(TextView, String)\n     */\n    @Override\n    public void bindView(View view, Context context, Cursor cursor) {\n        final ViewBinder binder = mViewBinder;\n        final int count = mTo.length;\n        final int[] from = mFrom;\n        final int[] to = mTo;\n\n        for (int i = 0; i < count; i++) {\n            final View v = view.findViewById(to[i]);\n            if (v != null) {\n                boolean bound = false;\n                if (binder != null) {\n                    bound = binder.setViewValue(v, cursor, from[i]);\n                }\n\n                if (!bound) {\n                    String text = cursor.getString(from[i]);\n                    if (text == null) {\n                        text = \"\";\n                    }\n\n                    if (v instanceof TextView) {\n                        setViewText((TextView) v, text);\n                    } else if (v instanceof ImageView) {\n                        setViewImage((ImageView) v, text);\n                    } else {\n                        throw new IllegalStateException(v.getClass().getName() + \" is not a \" +\n                                \" view that can be bounds by this SimpleCursorAdapter\");\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Returns the {@link ViewBinder} used to bind data to views.\n     *\n     * @return a ViewBinder or null if the binder does not exist\n     *\n     * @see #bindView(android.view.View, android.content.Context, android.database.Cursor)\n     * @see #setViewBinder(android.widget.SimpleCursorAdapter.ViewBinder)\n     */\n    public ViewBinder getViewBinder() {\n        return mViewBinder;\n    }\n\n    /**\n     * Sets the binder used to bind data to views.\n     *\n     * @param viewBinder the binder used to bind data to views, can be null to\n     *        remove the existing binder\n     *\n     * @see #bindView(android.view.View, android.content.Context, android.database.Cursor)\n     * @see #getViewBinder()\n     */\n    public void setViewBinder(ViewBinder viewBinder) {\n        mViewBinder = viewBinder;\n    }\n\n    /**\n     * Called by bindView() to set the image for an ImageView but only if\n     * there is no existing ViewBinder or if the existing ViewBinder cannot\n     * handle binding to an ImageView.\n     *\n     * By default, the value will be treated as an image resource. If the\n     * value cannot be used as an image resource, the value is used as an\n     * image Uri.\n     *\n     * Intended to be overridden by Adapters that need to filter strings\n     * retrieved from the database.\n     *\n     * @param v ImageView to receive an image\n     * @param value the value retrieved from the cursor\n     */\n    public void setViewImage(ImageView v, String value) {\n        try {\n            v.setImageResource(Integer.parseInt(value));\n        } catch (NumberFormatException nfe) {\n            v.setImageURI(Uri.parse(value));\n        }\n    }\n\n    /**\n     * Called by bindView() to set the text for a TextView but only if\n     * there is no existing ViewBinder or if the existing ViewBinder cannot\n     * handle binding to a TextView.\n     *\n     * Intended to be overridden by Adapters that need to filter strings\n     * retrieved from the database.\n     * \n     * @param v TextView to receive text\n     * @param text the text to be set for the TextView\n     */    \n    public void setViewText(TextView v, String text) {\n        v.setText(text);\n    }\n\n    /**\n     * Return the index of the column used to get a String representation\n     * of the Cursor.\n     *\n     * @return a valid index in the current Cursor or -1\n     *\n     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)\n     * @see #setStringConversionColumn(int) \n     * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)\n     * @see #getCursorToStringConverter()\n     */\n    public int getStringConversionColumn() {\n        return mStringConversionColumn;\n    }\n\n    /**\n     * Defines the index of the column in the Cursor used to get a String\n     * representation of that Cursor. The column is used to convert the\n     * Cursor to a String only when the current CursorToStringConverter\n     * is null.\n     *\n     * @param stringConversionColumn a valid index in the current Cursor or -1 to use the default\n     *        conversion mechanism\n     *\n     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)\n     * @see #getStringConversionColumn()\n     * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)\n     * @see #getCursorToStringConverter()\n     */\n    public void setStringConversionColumn(int stringConversionColumn) {\n        mStringConversionColumn = stringConversionColumn;\n    }\n\n    /**\n     * Returns the converter used to convert the filtering Cursor\n     * into a String.\n     *\n     * @return null if the converter does not exist or an instance of\n     *         {@link android.widget.SimpleCursorAdapter.CursorToStringConverter}\n     *\n     * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)\n     * @see #getStringConversionColumn()\n     * @see #setStringConversionColumn(int)\n     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)\n     */\n    public CursorToStringConverter getCursorToStringConverter() {\n        return mCursorToStringConverter;\n    }\n\n    /**\n     * Sets the converter  used to convert the filtering Cursor\n     * into a String.\n     *\n     * @param cursorToStringConverter the Cursor to String converter, or\n     *        null to remove the converter\n     *\n     * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter) \n     * @see #getStringConversionColumn()\n     * @see #setStringConversionColumn(int)\n     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)\n     */\n    public void setCursorToStringConverter(CursorToStringConverter cursorToStringConverter) {\n        mCursorToStringConverter = cursorToStringConverter;\n    }\n\n    /**\n     * Returns a CharSequence representation of the specified Cursor as defined\n     * by the current CursorToStringConverter. If no CursorToStringConverter\n     * has been set, the String conversion column is used instead. If the\n     * conversion column is -1, the returned String is empty if the cursor\n     * is null or Cursor.toString().\n     *\n     * @param cursor the Cursor to convert to a CharSequence\n     *\n     * @return a non-null CharSequence representing the cursor\n     */\n    @Override\n    public CharSequence convertToString(Cursor cursor) {\n        if (mCursorToStringConverter != null) {\n            return mCursorToStringConverter.convertToString(cursor);\n        } else if (mStringConversionColumn > -1) {\n            return cursor.getString(mStringConversionColumn);\n        }\n\n        return super.convertToString(cursor);\n    }\n\n    /**\n     * Create a map from an array of strings to an array of column-id integers in cursor c.\n     * If c is null, the array will be discarded.\n     *\n     * @param c the cursor to find the columns from\n     * @param from the Strings naming the columns of interest\n     */\n    private void findColumns(Cursor c, String[] from) {\n        if (c != null) {\n            int i;\n            int count = from.length;\n            if (mFrom == null || mFrom.length != count) {\n                mFrom = new int[count];\n            }\n            for (i = 0; i < count; i++) {\n                mFrom[i] = c.getColumnIndexOrThrow(from[i]);\n            }\n        } else {\n            mFrom = null;\n        }\n    }\n\n    @Override\n    public Cursor swapCursor(Cursor c) {\n        // super.swapCursor() will notify observers before we have\n        // a valid mapping, make sure we have a mapping before this\n        // happens\n        findColumns(c, mOriginalFrom);\n        return super.swapCursor(c);\n    }\n    \n    /**\n     * Change the cursor and change the column-to-view mappings at the same time.\n     *  \n     * @param c The database cursor.  Can be null if the cursor is not available yet.\n     * @param from A list of column names representing the data to bind to the UI.  Can be null \n     *            if the cursor is not available yet.\n     * @param to The views that should display column in the \"from\" parameter.\n     *            These should all be TextViews. The first N views in this list\n     *            are given the values of the first N columns in the from\n     *            parameter.  Can be null if the cursor is not available yet.\n     */\n    public void changeCursorAndColumns(Cursor c, String[] from, int[] to) {\n        mOriginalFrom = from;\n        mTo = to;\n        // super.changeCursor() will notify observers before we have\n        // a valid mapping, make sure we have a mapping before this\n        // happens\n        findColumns(c, mOriginalFrom);\n        super.changeCursor(c);\n    }\n\n    /**\n     * This class can be used by external clients of SimpleCursorAdapter\n     * to bind values fom the Cursor to views.\n     *\n     * You should use this class to bind values from the Cursor to views\n     * that are not directly supported by SimpleCursorAdapter or to\n     * change the way binding occurs for views supported by\n     * SimpleCursorAdapter.\n     *\n     * @see SimpleCursorAdapter#bindView(android.view.View, android.content.Context, android.database.Cursor)\n     * @see SimpleCursorAdapter#setViewImage(ImageView, String) \n     * @see SimpleCursorAdapter#setViewText(TextView, String)\n     */\n    public static interface ViewBinder {\n        /**\n         * Binds the Cursor column defined by the specified index to the specified view.\n         *\n         * When binding is handled by this ViewBinder, this method must return true.\n         * If this method returns false, SimpleCursorAdapter will attempts to handle\n         * the binding on its own.\n         *\n         * @param view the view to bind the data to\n         * @param cursor the cursor to get the data from\n         * @param columnIndex the column at which the data can be found in the cursor\n         *\n         * @return true if the data was bound to the view, false otherwise\n         */\n        boolean setViewValue(View view, Cursor cursor, int columnIndex);\n    }\n\n    /**\n     * This class can be used by external clients of SimpleCursorAdapter\n     * to define how the Cursor should be converted to a String.\n     *\n     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)\n     */\n    public static interface CursorToStringConverter {\n        /**\n         * Returns a CharSequence representing the specified Cursor.\n         *\n         * @param cursor the cursor for which a CharSequence representation\n         *        is requested\n         *\n         * @return a non-null CharSequence representing the cursor\n         */\n        CharSequence convertToString(Cursor cursor);\n    }\n\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-Android/src/com/mobeta/android/dslv/SimpleFloatViewManager.java",
    "content": "package com.mobeta.android.dslv;\n\nimport android.graphics.Bitmap;\nimport android.graphics.Point;\nimport android.graphics.Color;\nimport android.widget.ListView;\nimport android.widget.ImageView;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.util.Log;\n\n/**\n * Simple implementation of the FloatViewManager class. Uses list\n * items as they appear in the ListView to create the floating View.\n */\npublic class SimpleFloatViewManager implements DragSortListView.FloatViewManager {\n\n    private Bitmap mFloatBitmap;\n\n    private ImageView mImageView;\n\n    private int mFloatBGColor = Color.BLACK;\n\n    private ListView mListView;\n\n    public SimpleFloatViewManager(ListView lv) {\n        mListView = lv;\n    }\n\n    public void setBackgroundColor(int color) {\n        mFloatBGColor = color;\n    }\n\n    /**\n     * This simple implementation creates a Bitmap copy of the\n     * list item currently shown at ListView <code>position</code>.\n     */\n    @Override\n    public View onCreateFloatView(int position) {\n        // Guaranteed that this will not be null? I think so. Nope, got\n        // a NullPointerException once...\n        View v = mListView.getChildAt(position + mListView.getHeaderViewsCount() - mListView.getFirstVisiblePosition());\n\n        if (v == null) {\n            return null;\n        }\n\n        v.setPressed(false);\n\n        // Create a copy of the drawing cache so that it does not get\n        // recycled by the framework when the list tries to clean up memory\n        //v.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);\n        v.setDrawingCacheEnabled(true);\n        mFloatBitmap = Bitmap.createBitmap(v.getDrawingCache());\n        v.setDrawingCacheEnabled(false);\n\n        if (mImageView == null) {\n            mImageView = new ImageView(mListView.getContext());\n        }\n        mImageView.setBackgroundColor(mFloatBGColor);\n        mImageView.setPadding(0, 0, 0, 0);\n        mImageView.setImageBitmap(mFloatBitmap);\n        mImageView.setLayoutParams(new ViewGroup.LayoutParams(v.getWidth(), v.getHeight()));\n\n        return mImageView;\n    }\n\n    /**\n     * This does nothing\n     */\n    @Override\n    public void onDragFloatView(View floatView, Point position, Point touch) {\n        // do nothing\n    }\n\n    /**\n     * Removes the Bitmap from the ImageView created in\n     * onCreateFloatView() and tells the system to recycle it.\n     */\n    @Override\n    public void onDestroyFloatView(View floatView) {\n        ((ImageView) floatView).setImageDrawable(null);\n\n        mFloatBitmap.recycle();\n        mFloatBitmap = null;\n    }\n\n}\n\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Podfile",
    "content": "pod \"PebbleKit\""
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/NSDictionary+Pebble.h",
    "content": "//\n//  NSDictionary+Pebble.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSDictionary (Pebble)\n\n/**\n *  Serializes the receiver into a Pebble dict.\n *  @note The receiver dictionary must comply to the following constraints:\n *  * The keys must be instances of NSNumber. Their -unsignedLongValue return value will be used as final key.\n *  * The values must be instances of either NSString, NSData or NSNumber. Use the NSNumber (stdint) category\n *  to specify the signedness and width of NSNumbers.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryUnsupportedKeyClass,\n *  PBErrorCodeDictionaryUnsupportedValueClass or PBErrorCodeDictionaryUnsupportedValueClass.\n *  @see -dictionaryFromPebbleDictionaryDataWithError:\n */\n- (NSData*)pebbleDictionaryData:(NSError * __autoreleasing *)error;\n\n@end\n\n@interface NSData (Pebble)\n\n/**\n *  Interprets the receiver as Pebble dict data and deserializes it into an NSDictionary.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryInternalConsistency.\n *  @see -pebbleDictionaryData:\n */\n- (NSDictionary*)dictionaryFromPebbleDictionaryDataWithError:(NSError * __autoreleasing *)error;\n\n@end"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/NSNumber+stdint.h",
    "content": "//\n//  NSNumber+stdint.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/**\n *  This category exposes the capabilities the underlying CFNumber to explicitely\n *  store the signedness and the width of the storage.\n */\n\n@interface NSNumber (stdint)\n\n/**\n *  Interprets the receiver as a 32-bits wide, unsigned integer.\n */\n- (uint32_t)uint32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, unsigned integer.\n */\n- (uint16_t)uint16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, unsigned integer.\n */\n- (uint8_t)uint8Value;\n\n/**\n *  Interprets the receiver as a 32-bits wide, signed integer.\n */\n- (int32_t)int32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, signed integer.\n */\n- (int16_t)int16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, signed integer.\n */\n- (int8_t)int8Value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint32:(uint32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint16:(uint16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint8:(uint8_t)value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt32:(int32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt16:(int16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt8:(int8_t)value;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a floating pointer number or not.\n */\n- (BOOL)isFloat;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a signed integer or not.\n */\n- (BOOL)isSigned;\n\n/**\n *  Gets the width in bytes of the integer that is stored by the receiver.\n */\n- (uint8_t)width;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBBitmap.h",
    "content": "//\n//  PBBitmap.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIImage.h>\n#import <PebbleKit/gtypes.h>\n\n/**\n *  Helper class to convert a UIImage to Pebble bitmap pixel data and GBitmap metadata.\n *  Refer to the documentation of Pebble's native watch app SDK on the GBitmap format.\n */\n\n@interface PBBitmap : NSObject\n\n/**\n *  The pixel data of the bitmap.\n *  This corresponds to the data as pointed to by GBitmap's `addr` field.\n */\n@property (nonatomic, readonly, strong) NSData *pixelData;\n\n/**\n *  The number of bytes per row.\n *  Always a multiple of 4 bytes.\n */\n@property (nonatomic, readonly, assign) uint16_t rowSizeBytes;\n\n/**\n *  Bitfield of metadata flags.\n *  This corresponds to GBitmap's `info_flags` field.\n */\n@property (nonatomic, readonly, assign) uint16_t infoFlags;\n\n/**\n *  The box of bits inside `pixelData`, that contains\n *  the actual image data to use.\n *  This corresponds to GBitmap's `bounds` field.\n */\n@property (nonatomic, readonly, assign) GRect bounds;\n\n/**\n *  Factory method to create a PBBitmap from a UIImage instance.\n *  @param image The UIImage from which to create the PBBitmap\n */\n+ (PBBitmap*)pebbleBitmapWithUIImage:(UIImage*)image;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBDataLoggingService.h",
    "content": "//\n//  PBDataLoggingService.h\n//  PebbleKit\n//\n//  Created by Martijn The on 7/19/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  Data logging datatypes.\n */\nenum {\n  //! Array of bytes\n  PBDataLoggingTypeByteArray = 0,\n  //! unsigned integer\n  PBDataLoggingTypeUInt = 2,\n  //! signed integer\n  PBDataLoggingTypeInt = 3,\n};\ntypedef UInt8 PBDataLoggingType;\n\n/**\n *  The metadata of a data logging session. Used to identify a session.\n */\n@interface PBDataLoggingSessionMetadata : NSObject <NSSecureCoding, NSCopying>\n\n/**\n *  A tag associated with the session.\n */\n@property (nonatomic, readonly) UInt32 tag;\n\n/**\n *  The timestamp of the moment the session was created by the watchapp.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The type of data stored in this session.\n */\n@property (nonatomic, readonly) PBDataLoggingType type;\n\n/**\n *  The size of a data item.\n */\n@property (nonatomic, readonly) UInt16 itemSize;\n\n/**\n *  The serial number of the watch that created the sessions.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  Creates a new data logging session metadata object, given all its property values.\n *  This method is provided to create a metadata object that can be used to\n *  compare it with a metadata object that is passed into one of the\n *  PBDataLoggingServiceDelegate methods.\n *  @param tag The tag associated with the session\n *  @param timestamp The timestamp of the creation of the session\n *  @param type The type of data stored in the session\n *  @param itemSize The size of a data item\n *  @param serialNumber The serial number of the watch that created the session\n *  @return A session metadata object with the specified information\n */\n+ (id)metadataWithTag:(UInt32)tag\n            timestamp:(UInt32)timestamp\n                 type:(PBDataLoggingType)type\n             itemSize:(UInt16)itemSize\n         serialNumber:(NSString *)serialNumber;\n\n/**\n *  Tests the equality of two data logging session metadata objects.\n *  This method can be used to compare two session metadata objects\n *  to check whether they are referring to the same session or not.\n *  @param sessionMetadata\n *  @return YES if all the property values of receiver are equal to the property\n *  values of the given session.\n *  @note Equivalent to -[PBDataLoggingSessionMetadata isEqual:]\n */\n- (BOOL)isEqualToDataLoggingSessionMetadata:(PBDataLoggingSessionMetadata *)sessionMetadata;\n@end\n\n/**\n *  Data logging delegate protocol. The object that implements this protocol\n *  is responsible for handling incoming data.\n */\n@protocol PBDataLoggingServiceDelegate <NSObject>\n@optional\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param bytes Pointer to the array of bytes.\n *  The array contains (numberOfItems * session.itemSize) bytes.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasByteArrays:(const UInt8 * const)bytes numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt8s:(const UInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt16s:(const UInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt32s:(const UInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt8s:(const SInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt16s:(const SInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt32s:(const SInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time a session is finished.\n *  This is guaranteed to be called only after all data has been received and\n *  consumed by the application.\n *  @param service The data logging service.\n *  @param session The metadata of the session.\n */\n- (void)dataLoggingService:(PBDataLoggingService *)service sessionDidFinish:(PBDataLoggingSessionMetadata *)session;\n\n@end\n\n/**\n *  The data logging service. Assign a delegate object in order to receive\n *  data from your watchapp.\n */\n@interface PBDataLoggingService : NSObject\n\n/**\n *  The delegate that has the responsility of handling callbacks from the\n *  data logging service.\n */\n@property (atomic, readwrite, weak) id<PBDataLoggingServiceDelegate> delegate;\n\n/**\n *  Sets the queue on which delegate methods will be executed.\n *  Callbacks are intended to be processed in the order as they come in, so it\n *  you must use a serial queue. If set to nil (default) the main queue is used.\n *  @param delegateQueue The queue on which the delegate methods will be executed.\n */\n- (void)setDelegateQueue:(dispatch_queue_t)delegateQueue;\n\n/**\n * Query the watch for data logging data.\n */\n- (void)pollForData;\n  \n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBErrors.h",
    "content": "//\n//  PBErrors.h\n//  PebbleSDK\n//\n//  Created by Martijn The on 7/26/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nextern NSString *PBErrorDomain;\n\n/**\n *  PebbleKit Error codes.\n *  Inspect the localizedDescription of any NSError objects for a description.\n */\n\ntypedef enum {\n  PBErrorCodeNoSupportedProtocolsInInfoPlist,\n  PBErrorCodeErrorCreatingSession,\n  PBErrorCodeOutputStreamError,\n  PBErrorCodeInputStreamError,\n  PBErrorCodeSendMessageTimeout,\n  PBErrorCodeEndpointDisallowed,\n  PBErrorCodeVersionInfoTimeout,\n  PBErrorCodeCannotCreateSessionWhileClosing,\n  PBErrorCodeNoAppUUID,\n  PBErrorCodeAppMessageRejected,\n  PBErrorCodeAppMessageAckTimeout,\n  PBErrorCodeDictionaryUnsupportedKeyClass,\n  PBErrorCodeDictionaryUnsupportedValueClass,\n  PBErrorCodeDictionaryInternalConsistency,\n  PBErrorCodeInvalidArguments,\n  PBErrorCodePebbleAppUnreachable,\n  PBErrorCodePebbleAppRequestTimeout,\n  PBErrorCodePebbleAppEmptyResponse,\n  PBErrorCodePebbleAppUnexpectedResponse,\n  PBErrorCodeServerNotAvailable,\n  PBErrorCodeDownloadFailed,\n  PBErrorCodePebbleNotConnected\n} PBErrorCode;\n\n@interface NSError (Pebble)\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode and with an underlying NSError object.\n *  @param code The error code for which to create the error\n *  @param error The underlying error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code underLyingError:(NSError*)error;\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode.\n *  @param code The error code for which to create the error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code;\n\n@end"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBLog.h",
    "content": "//\n//  PBLog.h\n//  PebbleApp\n//\n//  Created by Martijn The on 11/29/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import \"DDLog.h\"\n\n#ifndef PBWSLOG_CONTEXT\n#define PBWSLOG_CONTEXT 1\n#endif\n\nextern int PBLogLevel;\n\n#define LogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define WSLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n\n#define LogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBPebbleCentral.h",
    "content": "//\n//  PBPebbleCentral.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class PBWatch;\n@class PBDataLoggingService;\n@protocol PBPebbleCentralDelegate;\n\n/**\n PebbleCentral plays the central role for client iOS apps (e.g. RunKeeper).\n */\n@interface PBPebbleCentral : NSObject\n\n/**\n @returns The default central singleton instance.\n */\n+ (PBPebbleCentral*)defaultCentral;\n\n/**\n *  Enables debug logs. The logs will be routed to the system log (ASL) and\n *  console. It is advised to call this before making any other calls to PebbleKit.\n */\n+ (void)setDebugLogsEnabled:(BOOL)logsEnabled;\n\n/**\n The watches that are currently connected. Do not cache the array because it can change over time.\n */\n@property (nonatomic, readonly, strong) NSArray *connectedWatches;\n\n/**\n The watches that are stored in the user preferences of the application.\n */\n@property (nonatomic, readonly, strong) NSArray *registeredWatches;\n\n/**\n The central's delegate.\n */\n@property (nonatomic, readwrite, weak) id<PBPebbleCentralDelegate> delegate;\n\n/**\n *  The UUID is used as the identifier of the watch application and is used\n *  to make sure that appMessage and dataLogging communications arrives at its companion app\n *  on the other device (and not in another app).\n *  For most app message methods there is are two variants: one that does not take a UUID parameter and one that does take\n *  a UUID parameter (for example, -appMessagesAddReceiveUpdateHandler: vs appMessagesAddReceiveUpdateHandler:withUUID:).\n *  The methods that do not take a UUID, will use the UUID as set prior to this property.\n *  @param uuid The 16 byte UUID of your app.\n *  @note The UUID needs to be set before using either app message or data logging.\n */\n@property (nonatomic, strong, readwrite) NSData *appUUID;\n\n/**\n *  Verifies the currently set application UUID.\n *  @return YES if the currently set UUID is valid, NO if it is not.\n *  @see -setAppUuid:\n */\n- (BOOL)hasValidAppUUID;\n\n/**\n @returns YES if the Pebble iOS app is installed, NO if it is not installed.\n */\n- (BOOL)isMobileAppInstalled;\n\n/**\n Redirects to Pebble in the App Store, so the user can install the app.\n */\n- (void)installMobileApp;\n\n/**\n Wipes out the data associated with the registered watches, that is stored on the phone.\n */\n- (void)unregisterAllWatches;\n\n/**\n Returns the most recently connected watch from the -registeredWatches array.\n */\n- (PBWatch*)lastConnectedWatch;\n\n@property (nonatomic, readonly) PBDataLoggingService *dataLoggingService;\n\n@end\n\n\n@protocol PBPebbleCentralDelegate <NSObject>\n@optional\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was connected.\n @param isNew YES if the watch has been connected for the first time since the app has been installed or NO if not.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidConnect:(PBWatch*)watch isNew:(BOOL)isNew;\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was disconnected.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidDisconnect:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+AppMessages.h",
    "content": "//\n//  PBWatch+AppMessages.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\ntypedef NS_ENUM(UInt8, PBAppState) {\n  PBAppStateNotRunning = 0x00,\n  PBAppStateRunning = 0x01,\n};\n\n@interface PBWatch (AppMessages)\n\n/**\n *  Queries the watch whether AppMessages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isAppMessagesSupported YES if AppMessages are supported, NO if not.\n */\n- (void)appMessagesGetIsSupported:(void(^)(PBWatch *watch, BOOL isAppMessagesSupported))fetchedBlock;\n\n/**\n *  Pushes an update to the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Pushes an update to the watch application with the specified UUID.\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watchapp to which the update should be sent.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary withUUID:(NSData*)uuid onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with the specified UUID.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @param uuid The UUID of the watchapp for which sent messages should be handled by the onReceive block.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive withUUID:(NSData*)uuid;\n\n/**\n *  Add a handler for lifecycle events of watch applications.\n *  @param onLifecycleUpdate This block will be called when an application starts and\n *  stops running.\n *  @param watch The watch that has sent the event.\n *  @param uuid The uuid of the application that caused the event.\n *  @param newAppState The new state of the app (either PBAppStateNotRunning or PBAppStateRunning).\n */\n- (id)appMessagesAddAppLifecycleUpdateHandler:(void(^)(PBWatch *watch, NSUUID *uuid,\n                                                       PBAppState newAppState))onLifecycleUpdate;\n\n\n// INTERNAL USE ONLY\n- (id)appMessagesAddReceiveAllUpdatesHandler:(BOOL(^)(PBWatch *watch, NSUUID *uuid, NSDictionary *update))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -appMessagesAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -appMessagesAddReceiveUpdateHandler:\n *  @see -appMessagesAddReceiveUpdateHandler:\n */\n- (void)appMessagesRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Fetches the run state of the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]. You can use this method to determine whether the watch\n *  application is running or not.\n *  TODO: Ask Francois how this API works.\n *  @param onSent The block that will be called after the fetch state command has been\n *  sent to the watch.\n */\n- (void)appMessagesFetchAppState:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with the specified UUID.\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n/**\n *  Sends a command to kill the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to kill the watch application with the specified UUID.\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+Golf.h",
    "content": "//\n//  PBWatch+Golf.h\n//  PebbleKit\n//\n//  Created by Martijn The on 4/4/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n@interface PBWatch (Golf)\n\n/**\n *  The UUID of the Golf watch app.\n */\nextern NSData *PBGolfUUID;\n\n/**\n *  The key of the \"Front\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfFrontKey;\n\n/**\n *  The key of the \"Mid\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfMidKey;\n\n/**\n *  The key of the \"Back\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfBackKey;\n\n/**\n *  The key of the \"Hole\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfHoleKey;\n\n/**\n *  The key of the \"Par\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfParKey;\n\n/**\n *  The command IDs that can be sent back by the Golf watch app.\n *  @see -golfAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  GolfAppCommandPrevious = 0x01,\n  GolfAppCommandNext = 0x02,\n  GolfAppCommandSelect = 0x03,\n} GolfAppCommand;\n\n/**\n *  Queries the watch whether Golf Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isGolfSupported YES if Golf Messages are supported, NO if not.\n */\n- (void)golfGetIsSupported:(void(^)(PBWatch *watch, BOOL isGolfSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends an update to the golf app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey, PBGolfParKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n *  @see PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey and PBGolfParKey\n */\n- (void)golfAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Golf updates that are send by the Golf watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param command The command as sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -golfAppRemoveUpdateHandler:\n *  @see GolfAppCommand\n *  @see -golfAppRemoveUpdateHandler:\n */\n- (id)golfAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, GolfAppCommand command))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -golfAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -golfAppAddReceiveUpdateHandler:\n *  @see -golfAppAddReceiveUpdateHandler:\n */\n- (void)golfAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the golf app on the watch.\n *  @discussion It is recommended to perform this as the first call after -golfGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+Ping.h",
    "content": "//\n//  PBWatch+Ping.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/14/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n@interface PBWatch (Ping)\n\n/**\n * Sends a ping to the watch.\n * @param cookie A number identifying the ping.\n * @param onPong The block handler that will be called when the \"pong\" reply from the watch has been received.\n * @param watch The watch that sent the \"pong\" reply, which is \"self\". It is passed in to avoid retain loops.\n * @param cookie The cookie that was initially passed when calling this method.\n * @param onTimeout The block handler that will be called when the watch failed to reply in time.\n */\n- (void)pingWithCookie:(UInt32)cookie onPong:(void(^)(PBWatch *watch, UInt32 cookie))onPong onTimeout:(void(^)(PBWatch *watch, UInt32 cookie))onTimeout;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+PollServices.h",
    "content": "//\n//  PBWatch+PollServices.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n * PollServiceType\n */ \n\n\nenum {\n  PBPollRemoteServiceMail = 0,\n  PBPollRemoteServiceDataLogging = 1,\n  PBNumPollRemoteServices\n};\ntypedef UInt8 PBPollRemoteServiceType;\n\n@interface PBWatch (PollServices)\n// Call this upon connect with the watch to add handlers:\n- (id)addPollServicesHandler:(void(^)(PBWatch *))handler forService:(PBPollRemoteServiceType)service interval:(UInt8)interval;\n- (void)sendPollRequestForService:(PBPollRemoteServiceType)service;\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+Sports.h",
    "content": "//\n//  PBWatch+Sports.h\n//  PebbleKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n/**\n *  The UUID of the Sports watch app.\n */\nextern NSData *PBSportsUUID;\n\n/**\n *  The key of the \"Time\" field.\n *  The accompanying value must be an NSString (max. ~8 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsTimeKey;\n\n/**\n *  The key of the \"Distance\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDistanceKey;\n\n/**\n *  The key of the general purpose \"Data\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDataKey;\n\n/**\n *  The key of the \"Activity State\".\n *  The value must be an NSNumber created using +[NSNumber numberWithUint8:].\n *  @see SportsAppActivityState for valid values to use\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsActivityStateKey;\n\n/**\n *  Instances of this convenience class represent an update of the current time, distance and pace,\n *  and has a method to convert the values into a dictionary that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n@interface PBSportsUpdate : NSObject\n\n/**\n *  The current time in seconds. The possible range is currently limited from -7140. to 7140., inclusive. (±1h 59min 59sec).\n */\n@property (nonatomic, readwrite, assign) NSTimeInterval time;\n\n/**\n *  The current distance in km or mi. The possible range is currently limited from -99.9 to 99.9, inclusive.\n *  The unit of distance is dependent on the current unit setting.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float distance;\n\n/**\n *  General purpose data variable. The possible range is currently limited from -99.99 to 99.99, inclusive.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float data;\n\n/**\n *  Convenience method to create an update object.\n */\n+ (PBSportsUpdate*)updateWithTime:(NSTimeInterval)time distance:(float)distance data:(float)data;\n\n/**\n *  Creates an update dictionary from the receiver, that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n- (NSDictionary*)dictionary;\n\n/**\n *  Creates a formatted time string with from a total seconds value, formatted as \"h:mm:ss\".\n *  For example, supplying the value 3930.0f seconds will return @\"1:05:30\"\n *  @param seconds The number of seconds from which to create the time string.\n *  @return Formatted time as \"h:mm:ss\"\n */\n+ (NSString*)timeStringFromFloat:(float)seconds;\n\n@end\n\n@interface PBWatch (Sports)\n\n/**\n *  The state of the Sports activity.\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  SportsAppActivityStateInit = 0x00,\n  SportsAppActivityStateRunning = 0x01,\n  SportsAppActivityStatePaused = 0x02,\n  SportsAppActivityStateEnd = 0x03,\n} SportsAppActivityState;\n\n/**\n *  Queries the watch whether Sports Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isSportsSupported YES if Sports Messages are supported, NO if not.\n */\n- (void)sportsGetIsSupported:(void(^)(PBWatch *watch, BOOL isSportsSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the preferred\n *  unit system, either metric or imperial.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetMetric:(BOOL)isMetric onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents,\n *  to set the preferred  data label (either PACE or SPEED) and corresponding units.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetLabel:(BOOL)isPace onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the state of the\n *  sports activity. Currently only SportsAppActivityStateRunning and SportsAppActivityStatePaused are\n *  supported.\n *  @param state The new sports activity state\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetActivityState:(SportsAppActivityState)state onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends the update to the sports app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBSportsTimeKey, PBSportsPaceKey, PBSportsDistanceKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Sports updates that are send by the Sports watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param state The new sports activity state as set by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -sportsAppRemoveUpdateHandler:\n *  @see SportsAppActivityState\n *  @see -sportsAppRemoveUpdateHandler:\n */\n- (id)sportsAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, SportsAppActivityState state))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -sportsAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -sportsAppAddReceiveUpdateHandler:\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\n- (void)sportsAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the sports app on the watch.\n *  @discussion It is recommended to perform this as the first call after -sportsGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+Version.h",
    "content": "//\n//  PBWatch+Version.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/17/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  PBFirmwareVersion is a helper class that is able to parse the versionTag string\n *  into its components (os, major, minor, suffix) and facilitate comparisons\n *  between versions.\n *  Valid versions follow the following format:\n *  `vOS(.MAJOR(.MINOR(-SUFFIX)))`\n *  Where the fields OS, MAJOR, MINOR are positive, decimal integer numbers and SUFFIX\n *  an arbitrary string. MAJOR, MINOR and SUFFIX are optional (nested optionality).\n *  Examples of valid versions:\n *  `v1`\n *  `v2.1234.99-alpha-beta-gamma`\n */\n@interface PBFirmwareVersion : NSObject\n/**\n *  The OS version component.\n */\n@property (nonatomic, readonly) NSInteger os;\n\n/**\n *  The major version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger major;\n\n/**\n *  The minor version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger minor;\n\n/**\n *  The release suffix, which is the part following the dash '-'.\n *  @note If a version tag string does not contain a suffix, it will be set to an empty string.\n *  @discussion The release suffix is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *suffix;\n\n/**\n *  The version timestamp.\n *  @note The timestamp is in the final comparison equation, in the -compare: method, after evaluating\n *  os, major and minor components.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The version's git commit hash.\n *  @discussion The commit hash is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *commitHash;\n\n/**\n *  The version's git tag.\n */\n@property (nonatomic, readonly, copy) NSString *tag;\n\n/**\n *  Creates a PBFirmwareVersion object given a tag string and timestamp.\n */\n+ (PBFirmwareVersion*)firmwareVersionWithTag:(NSString*)tag commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Creates a PBFirmwareVersion object given its components.\n *  @discussion The tag string will be set to the canonical format vOS.MINOR.MAJOR(-SUFFIX).\n */\n+ (PBFirmwareVersion*)firmwareVersionWithOS:(NSInteger)os major:(NSInteger)major minor:(NSInteger)minor suffix:(NSString*)suffix commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Compares the receiver to another version object.\n *  @param aVersion The version to compare with the receiver.\n *  @return NSOrderedAscending if the value of aVersion is greater than the receiver’s,\n *  NSOrderedSame if they’re equal, and NSOrderedDescending if the value of aVersion is less than the receiver’s.\n */\n- (NSComparisonResult)compare:(PBFirmwareVersion *)aVersion;\n\n/**\n *  Convenience wrappers around -compare:\n */\n- (BOOL)isEqualOrNewer:(PBFirmwareVersion *)other;\n- (BOOL)isNewer:(PBFirmwareVersion *)other;\n- (BOOL)isEqualVersionOnly:(PBFirmwareVersion *)other;\n\n@end\n\n\n\n/**\n *  Values specifying the Pebble hardware platform variant.\n */\ntypedef enum {\n  FirmwareMetadataPlatformUnknown = 0,\n  FirmwareMetadataPlatformPebbleOneEV1 = 1,\n  FirmwareMetadataPlatformPebbleOneEV2 = 2,\n  FirmwareMetadataPlatformPebbleOneEV2_3 = 3,\n  FirmwareMetadataPlatformPebbleOneEV2_4 = 4,\n  FirmwareMetadataPlatformPebbleOnePointFive = 5,\n  FirmwareMetadataPlatformPebbleTwoPointZero = 6,\n  FirmwareMetadataPlatformPebbleOneBigboard = 0xff,\n  FirmwareMetadataPlatformPebbleOneBigboard2 = 0xfe,\n} FirmwareMetadataPlatform;\n\n/**\n *  Instances of PBFirmwareMetadata describe a firmware in terms of\n *  its version, whether it is a recovery firmware and its intended hardware\n *  platform.\n *  @see PBVersionInfo\n */\n\n@interface PBFirmwareMetadata : NSObject\n\n/**\n *  The version of the firmware.\n *  @see PBFirmwareVersion\n */\n@property (nonatomic, readonly) PBFirmwareVersion *version;\n\n/**\n *  YES if the firmware is a recovery firmware, NO if it is a regular firmware.\n */\n@property (nonatomic, readonly) BOOL isRecoveryFirmware;\n\n/**\n *  The hardware platform variant with which the firmware is compatible.\n */\n@property (nonatomic, readonly) FirmwareMetadataPlatform hardwarePlatform;\n\n/**\n *  Converts a <FirmwareMetadataPlatform> value to a string.\n *  @param hardwarePlatform The hardware platform value to convert\n *  @return A string of the hardware platform\n */\n+ (NSString*)hardwarePlatformToString:(FirmwareMetadataPlatform)hardwarePlatform;\n\n/**\n *  Converts an NSString hardware platform string to the corresponding\n *  FirmwareMetadataPlatform value.\n *  @param hardwarePlatformString The string representing the hardware platform.\n *  @return The hardware platform enum value\n */\n+ (FirmwareMetadataPlatform)stringToHardwarePlatform:(NSString *)hardwarePlatformString;\n\n@end\n\n/**\n *  Instances of PBResourceMetadata describe (system) resources.\n *  @see PBVersionInfo\n */\n\n@interface PBResourceMetadata : NSObject\n\n/**\n *  The version of the resources as the Epoch timestamp of the Git commit.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The checksum of the resources.\n */\n@property (nonatomic, readonly) UInt32 crc;\n\n/**\n *  The human-friendly string version of the resources.\n */\n@property (nonatomic, readonly, strong) NSString *friendlyVersion;\n\n/**\n *  YES if the metadata represents valid resources, NO if it does not.\n */\n- (BOOL)isValid;\n\n@end\n\n/**\n *  An instance of PBVersionInfo describes all the different system software (Pebble OS)\n *  on a Pebble watch and other auxiliary information.\n *  @see PBWatch\n */\n\n@interface PBVersionInfo : NSObject\n\n/**\n *  The metadata of the firmware that is running.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *runningFirmwareMetadata;\n\n/**\n *  The metadata of the recovery firmware that is in storage.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *recoveryFirmwareMetadata;\n\n/**\n *  The metadata of the system resources.\n */\n@property (nonatomic, readonly, strong) PBResourceMetadata *systemResources;\n\n/**\n *  The version of the bootloader.\n */\n@property (nonatomic, readonly) UInt32 bootloaderVersion;\n\n/**\n *  The version of the hardware.\n */\n@property (nonatomic, readonly, strong) NSString *hardwareVersion;\n\n/**\n *  The serial number.\n */\n@property (nonatomic, readonly, strong) NSString *serialNumber;\n\n/**\n *  The current Bluetooth device address.\n */\n@property (nonatomic, readonly, strong) NSData *deviceAddress;\n\n/**\n *  YES if valid recovery firmware is installed, NO if not.\n */\n- (BOOL)hasRecoveryFirmware;\n\n/**\n *  YES if valid system resources are installed, NO if not.\n */\n- (BOOL)hasSystemResources;\n\n@end\n\n@interface PBWatch (Version)\n\n/**\n *  Requests the version info from the receiver.\n *  @param handler The handler that will be called when the version info response has been received.\n *  @param onTimeout The handler that will be called if the watch did not respond within 5 seconds.\n *  @param watch The watch for which the version info was requested.\n *  @param versionInfo The version info response.\n *  @discussion The <PBVersionInfo> response will be cached. The latest version info can be\n *  accessed through the <versionInfo> property of <PBWatch>.\n */\n- (void)getVersionInfo:(void (^)(PBWatch *watch, PBVersionInfo *versionInfo))handler onTimeout:(void (^)(PBWatch *watch))onTimeout;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch.h",
    "content": "//\n//  PBWatch.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@protocol PBWatchDelegate;\n@class PBVersionInfo;\n@class PBDataLoggingService;\n\n/**\n *  Represents a Pebble watch.\n *\n *  On iOS, there is the notion of a \"communication session\" between an app and\n *  the Pebble watch. You can imagine this as a \"data pipe\" directly from the\n *  watch to your app. However, there is only one session for 3rd party apps.\n *  This one session has to be shared among all 3rd party apps that want to\n *  communicate with Pebble (excluding the official Pebble iOS app).\n *\n *  Unfortunately, the session can only be opened from the phone app. This means\n *  that the iOS app has to start talking to the watch first to open the\n *  communications channel; the other way around is not possible.\n *  Most methods in the PBWatch categories (Ping), (Version), (Sports), (Golf)\n *  and (AppMessages) all implicitly open the shared communication session.\n *\n *  Lastly, iOS provides no good way to manage how the one shared session is\n *  accessed or used. Simply, the last iOS app to try to open it, wins and gets\n *  to use it. Therefore, it is important that your iOS app does **not** try\n *  communicate when a Pebble is connected.\n *\n *  When the user has stopped using your app (e.g. when going to the background\n *  or when explicitely stopping a certain activity in the app) your iOS app\n *  should close the communication session using the -closeSession: method.\n */\n@interface PBWatch : NSObject\n\n/**\n *  YES if the receiver is connected and NO if the receiver is disconnected.\n *  @discussion This property is KVO-compliant.\n */\n@property (nonatomic, readonly, getter=isConnected) BOOL connected;\n\n/**\n *  The human-friendly name of the receiver.\n *  This is the same name as the user will see in the iOS Bluetooth Settings.\n */\n@property (nonatomic, readonly) NSString *name;\n\n/**\n *  The serial number of the receiver.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  The versionInfo of the receiver.\n *  @see PBVersionInfo\n */\n@property (nonatomic, readonly) PBVersionInfo *versionInfo;\n\n/**\n *  The delegate of the watch that will be notified of disconnections and errors.\n *  @see PBWatchDelegate\n */\n@property (nonatomic, readwrite, weak) id<PBWatchDelegate> delegate;\n\n/**\n *  The userInfo property can be used to associate application specific data\n *  with the watch. Note that the application itself is responsible for persisting\n *  the information if neccessary.\n */\n@property (nonatomic, readwrite, strong) id userInfo;\n\n/**\n *  The date when the watch was last known to be connected.\n *  This date will be updated automatically when the watch connects and\n *  disconnects. While the watch is being connected, this date will not be updated.\n */\n@property (nonatomic, readonly) NSDate *lastConnectedDate;\n\n/**\n *  Developer-friendly debugging description of the watch.\n *  @return localized, user-friendly summary of the receiver, including\n *  software and hardware version information, if available.\n */\n- (NSString*)friendlyDescription;\n\n/**\n *  Closes the communication session with the watch.\n *  Since there is only one, shared session for all 3rd party iOS apps,\n *  an app should close the session after the user is done using the app/watch-integration,\n *  so it can be used by other apps.\n *  The communication session is implicitely opened automatically when needed.\n *  @param onDone Callback block that will be called after the closing of the session\n *  has completed. If there is no open session, the onDone block will (also) be executed\n *  asynchronously on the calling queue.\n */\n- (void)closeSession:(void(^)(void))onDone;\n\n@end\n\n@protocol PBWatchDelegate <NSObject>\n@optional\n\n/**\n *  Called when the watch got disconnected.\n */\n- (void)watchDidDisconnect:(PBWatch*)watch;\n\n/**\n *  Called when the watch caught an error.\n */\n- (void)watch:(PBWatch*)watch handleError:(NSError*)error;\n\n/**\n *  Called when the internal EASession is about to be reset.\n */\n- (void)watchWillResetSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is opened\n */\n- (void)watchDidOpenSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is closed\n */\n- (void)watchDidCloseSession:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PebbleKit.h",
    "content": "//\n//  PebbleSDK.h\n//  PebbleSDK\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#import <PebbleKit/PBWatch.h>\n#import <PebbleKit/PBPebbleCentral.h>\n#import <PebbleKit/PBWatch+Ping.h>\n#import <PebbleKit/PBWatch+Version.h>\n#import <PebbleKit/PBErrors.h>\n#import <PebbleKit/PBWatch+AppMessages.h>\n#import <PebbleKit/NSNumber+stdint.h>\n#import <PebbleKit/PBWatch+Sports.h>\n#import <PebbleKit/PBWatch+Golf.h>\n#import <PebbleKit/PBBitmap.h>\n#import <PebbleKit/PBDataLoggingService.h>\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/gtypes.h",
    "content": "//\n//  gtypes.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#ifndef PebbleKit_gtypes_h\n#define PebbleKit_gtypes_h\n\ntypedef struct GSize {\n  int16_t w;\n  int16_t h;\n} GSize;\n\ntypedef struct GPoint {\n  int16_t x;\n  int16_t y;\n} GPoint;\n\ntypedef struct GRect {\n  GPoint origin;\n  GSize size;\n} GRect;\n\n#endif\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/NSDictionary+Pebble.h",
    "content": "//\n//  NSDictionary+Pebble.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSDictionary (Pebble)\n\n/**\n *  Serializes the receiver into a Pebble dict.\n *  @note The receiver dictionary must comply to the following constraints:\n *  * The keys must be instances of NSNumber. Their -unsignedLongValue return value will be used as final key.\n *  * The values must be instances of either NSString, NSData or NSNumber. Use the NSNumber (stdint) category\n *  to specify the signedness and width of NSNumbers.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryUnsupportedKeyClass,\n *  PBErrorCodeDictionaryUnsupportedValueClass or PBErrorCodeDictionaryUnsupportedValueClass.\n *  @see -dictionaryFromPebbleDictionaryDataWithError:\n */\n- (NSData*)pebbleDictionaryData:(NSError * __autoreleasing *)error;\n\n@end\n\n@interface NSData (Pebble)\n\n/**\n *  Interprets the receiver as Pebble dict data and deserializes it into an NSDictionary.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryInternalConsistency.\n *  @see -pebbleDictionaryData:\n */\n- (NSDictionary*)dictionaryFromPebbleDictionaryDataWithError:(NSError * __autoreleasing *)error;\n\n@end"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/NSNumber+stdint.h",
    "content": "//\n//  NSNumber+stdint.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/**\n *  This category exposes the capabilities the underlying CFNumber to explicitely\n *  store the signedness and the width of the storage.\n */\n\n@interface NSNumber (stdint)\n\n/**\n *  Interprets the receiver as a 32-bits wide, unsigned integer.\n */\n- (uint32_t)uint32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, unsigned integer.\n */\n- (uint16_t)uint16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, unsigned integer.\n */\n- (uint8_t)uint8Value;\n\n/**\n *  Interprets the receiver as a 32-bits wide, signed integer.\n */\n- (int32_t)int32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, signed integer.\n */\n- (int16_t)int16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, signed integer.\n */\n- (int8_t)int8Value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint32:(uint32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint16:(uint16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint8:(uint8_t)value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt32:(int32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt16:(int16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt8:(int8_t)value;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a floating pointer number or not.\n */\n- (BOOL)isFloat;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a signed integer or not.\n */\n- (BOOL)isSigned;\n\n/**\n *  Gets the width in bytes of the integer that is stored by the receiver.\n */\n- (uint8_t)width;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBBitmap.h",
    "content": "//\n//  PBBitmap.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIImage.h>\n#import <PebbleKit/gtypes.h>\n\n/**\n *  Helper class to convert a UIImage to Pebble bitmap pixel data and GBitmap metadata.\n *  Refer to the documentation of Pebble's native watch app SDK on the GBitmap format.\n */\n\n@interface PBBitmap : NSObject\n\n/**\n *  The pixel data of the bitmap.\n *  This corresponds to the data as pointed to by GBitmap's `addr` field.\n */\n@property (nonatomic, readonly, strong) NSData *pixelData;\n\n/**\n *  The number of bytes per row.\n *  Always a multiple of 4 bytes.\n */\n@property (nonatomic, readonly, assign) uint16_t rowSizeBytes;\n\n/**\n *  Bitfield of metadata flags.\n *  This corresponds to GBitmap's `info_flags` field.\n */\n@property (nonatomic, readonly, assign) uint16_t infoFlags;\n\n/**\n *  The box of bits inside `pixelData`, that contains\n *  the actual image data to use.\n *  This corresponds to GBitmap's `bounds` field.\n */\n@property (nonatomic, readonly, assign) GRect bounds;\n\n/**\n *  Factory method to create a PBBitmap from a UIImage instance.\n *  @param image The UIImage from which to create the PBBitmap\n */\n+ (PBBitmap*)pebbleBitmapWithUIImage:(UIImage*)image;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBDataLoggingService.h",
    "content": "//\n//  PBDataLoggingService.h\n//  PebbleKit\n//\n//  Created by Martijn The on 7/19/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  Data logging datatypes.\n */\nenum {\n  //! Array of bytes\n  PBDataLoggingTypeByteArray = 0,\n  //! unsigned integer\n  PBDataLoggingTypeUInt = 2,\n  //! signed integer\n  PBDataLoggingTypeInt = 3,\n};\ntypedef UInt8 PBDataLoggingType;\n\n/**\n *  The metadata of a data logging session. Used to identify a session.\n */\n@interface PBDataLoggingSessionMetadata : NSObject <NSSecureCoding, NSCopying>\n\n/**\n *  A tag associated with the session.\n */\n@property (nonatomic, readonly) UInt32 tag;\n\n/**\n *  The timestamp of the moment the session was created by the watchapp.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The type of data stored in this session.\n */\n@property (nonatomic, readonly) PBDataLoggingType type;\n\n/**\n *  The size of a data item.\n */\n@property (nonatomic, readonly) UInt16 itemSize;\n\n/**\n *  The serial number of the watch that created the sessions.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  Creates a new data logging session metadata object, given all its property values.\n *  This method is provided to create a metadata object that can be used to\n *  compare it with a metadata object that is passed into one of the\n *  PBDataLoggingServiceDelegate methods.\n *  @param tag The tag associated with the session\n *  @param timestamp The timestamp of the creation of the session\n *  @param type The type of data stored in the session\n *  @param itemSize The size of a data item\n *  @param serialNumber The serial number of the watch that created the session\n *  @return A session metadata object with the specified information\n */\n+ (id)metadataWithTag:(UInt32)tag\n            timestamp:(UInt32)timestamp\n                 type:(PBDataLoggingType)type\n             itemSize:(UInt16)itemSize\n         serialNumber:(NSString *)serialNumber;\n\n/**\n *  Tests the equality of two data logging session metadata objects.\n *  This method can be used to compare two session metadata objects\n *  to check whether they are referring to the same session or not.\n *  @param sessionMetadata\n *  @return YES if all the property values of receiver are equal to the property\n *  values of the given session.\n *  @note Equivalent to -[PBDataLoggingSessionMetadata isEqual:]\n */\n- (BOOL)isEqualToDataLoggingSessionMetadata:(PBDataLoggingSessionMetadata *)sessionMetadata;\n@end\n\n/**\n *  Data logging delegate protocol. The object that implements this protocol\n *  is responsible for handling incoming data.\n */\n@protocol PBDataLoggingServiceDelegate <NSObject>\n@optional\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param bytes Pointer to the array of bytes.\n *  The array contains (numberOfItems * session.itemSize) bytes.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasByteArrays:(const UInt8 * const)bytes numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt8s:(const UInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt16s:(const UInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt32s:(const UInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt8s:(const SInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt16s:(const SInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt32s:(const SInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time a session is finished.\n *  This is guaranteed to be called only after all data has been received and\n *  consumed by the application.\n *  @param service The data logging service.\n *  @param session The metadata of the session.\n */\n- (void)dataLoggingService:(PBDataLoggingService *)service sessionDidFinish:(PBDataLoggingSessionMetadata *)session;\n\n@end\n\n/**\n *  The data logging service. Assign a delegate object in order to receive\n *  data from your watchapp.\n */\n@interface PBDataLoggingService : NSObject\n\n/**\n *  The delegate that has the responsility of handling callbacks from the\n *  data logging service.\n */\n@property (atomic, readwrite, weak) id<PBDataLoggingServiceDelegate> delegate;\n\n/**\n *  Sets the queue on which delegate methods will be executed.\n *  Callbacks are intended to be processed in the order as they come in, so it\n *  you must use a serial queue. If set to nil (default) the main queue is used.\n *  @param delegateQueue The queue on which the delegate methods will be executed.\n */\n- (void)setDelegateQueue:(dispatch_queue_t)delegateQueue;\n\n/**\n * Query the watch for data logging data.\n */\n- (void)pollForData;\n  \n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBErrors.h",
    "content": "//\n//  PBErrors.h\n//  PebbleSDK\n//\n//  Created by Martijn The on 7/26/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nextern NSString *PBErrorDomain;\n\n/**\n *  PebbleKit Error codes.\n *  Inspect the localizedDescription of any NSError objects for a description.\n */\n\ntypedef enum {\n  PBErrorCodeNoSupportedProtocolsInInfoPlist,\n  PBErrorCodeErrorCreatingSession,\n  PBErrorCodeOutputStreamError,\n  PBErrorCodeInputStreamError,\n  PBErrorCodeSendMessageTimeout,\n  PBErrorCodeEndpointDisallowed,\n  PBErrorCodeVersionInfoTimeout,\n  PBErrorCodeCannotCreateSessionWhileClosing,\n  PBErrorCodeNoAppUUID,\n  PBErrorCodeAppMessageRejected,\n  PBErrorCodeAppMessageAckTimeout,\n  PBErrorCodeDictionaryUnsupportedKeyClass,\n  PBErrorCodeDictionaryUnsupportedValueClass,\n  PBErrorCodeDictionaryInternalConsistency,\n  PBErrorCodeInvalidArguments,\n  PBErrorCodePebbleAppUnreachable,\n  PBErrorCodePebbleAppRequestTimeout,\n  PBErrorCodePebbleAppEmptyResponse,\n  PBErrorCodePebbleAppUnexpectedResponse,\n  PBErrorCodeServerNotAvailable,\n  PBErrorCodeDownloadFailed,\n  PBErrorCodePebbleNotConnected\n} PBErrorCode;\n\n@interface NSError (Pebble)\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode and with an underlying NSError object.\n *  @param code The error code for which to create the error\n *  @param error The underlying error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code underLyingError:(NSError*)error;\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode.\n *  @param code The error code for which to create the error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code;\n\n@end"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBLog.h",
    "content": "//\n//  PBLog.h\n//  PebbleApp\n//\n//  Created by Martijn The on 11/29/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import \"DDLog.h\"\n\n#ifndef PBWSLOG_CONTEXT\n#define PBWSLOG_CONTEXT 1\n#endif\n\nextern int PBLogLevel;\n\n#define LogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define WSLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n\n#define LogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBPebbleCentral.h",
    "content": "//\n//  PBPebbleCentral.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class PBWatch;\n@class PBDataLoggingService;\n@protocol PBPebbleCentralDelegate;\n\n/**\n PebbleCentral plays the central role for client iOS apps (e.g. RunKeeper).\n */\n@interface PBPebbleCentral : NSObject\n\n/**\n @returns The default central singleton instance.\n */\n+ (PBPebbleCentral*)defaultCentral;\n\n/**\n *  Enables debug logs. The logs will be routed to the system log (ASL) and\n *  console. It is advised to call this before making any other calls to PebbleKit.\n */\n+ (void)setDebugLogsEnabled:(BOOL)logsEnabled;\n\n/**\n The watches that are currently connected. Do not cache the array because it can change over time.\n */\n@property (nonatomic, readonly, strong) NSArray *connectedWatches;\n\n/**\n The watches that are stored in the user preferences of the application.\n */\n@property (nonatomic, readonly, strong) NSArray *registeredWatches;\n\n/**\n The central's delegate.\n */\n@property (nonatomic, readwrite, weak) id<PBPebbleCentralDelegate> delegate;\n\n/**\n *  The UUID is used as the identifier of the watch application and is used\n *  to make sure that appMessage and dataLogging communications arrives at its companion app\n *  on the other device (and not in another app).\n *  For most app message methods there is are two variants: one that does not take a UUID parameter and one that does take\n *  a UUID parameter (for example, -appMessagesAddReceiveUpdateHandler: vs appMessagesAddReceiveUpdateHandler:withUUID:).\n *  The methods that do not take a UUID, will use the UUID as set prior to this property.\n *  @param uuid The 16 byte UUID of your app.\n *  @note The UUID needs to be set before using either app message or data logging.\n */\n@property (nonatomic, strong, readwrite) NSData *appUUID;\n\n/**\n *  Verifies the currently set application UUID.\n *  @return YES if the currently set UUID is valid, NO if it is not.\n *  @see -setAppUuid:\n */\n- (BOOL)hasValidAppUUID;\n\n/**\n @returns YES if the Pebble iOS app is installed, NO if it is not installed.\n */\n- (BOOL)isMobileAppInstalled;\n\n/**\n Redirects to Pebble in the App Store, so the user can install the app.\n */\n- (void)installMobileApp;\n\n/**\n Wipes out the data associated with the registered watches, that is stored on the phone.\n */\n- (void)unregisterAllWatches;\n\n/**\n Returns the most recently connected watch from the -registeredWatches array.\n */\n- (PBWatch*)lastConnectedWatch;\n\n@property (nonatomic, readonly) PBDataLoggingService *dataLoggingService;\n\n@end\n\n\n@protocol PBPebbleCentralDelegate <NSObject>\n@optional\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was connected.\n @param isNew YES if the watch has been connected for the first time since the app has been installed or NO if not.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidConnect:(PBWatch*)watch isNew:(BOOL)isNew;\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was disconnected.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidDisconnect:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+AppMessages.h",
    "content": "//\n//  PBWatch+AppMessages.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\ntypedef NS_ENUM(UInt8, PBAppState) {\n  PBAppStateNotRunning = 0x00,\n  PBAppStateRunning = 0x01,\n};\n\n@interface PBWatch (AppMessages)\n\n/**\n *  Queries the watch whether AppMessages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isAppMessagesSupported YES if AppMessages are supported, NO if not.\n */\n- (void)appMessagesGetIsSupported:(void(^)(PBWatch *watch, BOOL isAppMessagesSupported))fetchedBlock;\n\n/**\n *  Pushes an update to the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Pushes an update to the watch application with the specified UUID.\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watchapp to which the update should be sent.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary withUUID:(NSData*)uuid onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with the specified UUID.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @param uuid The UUID of the watchapp for which sent messages should be handled by the onReceive block.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive withUUID:(NSData*)uuid;\n\n/**\n *  Add a handler for lifecycle events of watch applications.\n *  @param onLifecycleUpdate This block will be called when an application starts and\n *  stops running.\n *  @param watch The watch that has sent the event.\n *  @param uuid The uuid of the application that caused the event.\n *  @param newAppState The new state of the app (either PBAppStateNotRunning or PBAppStateRunning).\n */\n- (id)appMessagesAddAppLifecycleUpdateHandler:(void(^)(PBWatch *watch, NSUUID *uuid,\n                                                       PBAppState newAppState))onLifecycleUpdate;\n\n\n// INTERNAL USE ONLY\n- (id)appMessagesAddReceiveAllUpdatesHandler:(BOOL(^)(PBWatch *watch, NSUUID *uuid, NSDictionary *update))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -appMessagesAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -appMessagesAddReceiveUpdateHandler:\n *  @see -appMessagesAddReceiveUpdateHandler:\n */\n- (void)appMessagesRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Fetches the run state of the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]. You can use this method to determine whether the watch\n *  application is running or not.\n *  TODO: Ask Francois how this API works.\n *  @param onSent The block that will be called after the fetch state command has been\n *  sent to the watch.\n */\n- (void)appMessagesFetchAppState:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with the specified UUID.\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n/**\n *  Sends a command to kill the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to kill the watch application with the specified UUID.\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+Golf.h",
    "content": "//\n//  PBWatch+Golf.h\n//  PebbleKit\n//\n//  Created by Martijn The on 4/4/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n@interface PBWatch (Golf)\n\n/**\n *  The UUID of the Golf watch app.\n */\nextern NSData *PBGolfUUID;\n\n/**\n *  The key of the \"Front\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfFrontKey;\n\n/**\n *  The key of the \"Mid\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfMidKey;\n\n/**\n *  The key of the \"Back\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfBackKey;\n\n/**\n *  The key of the \"Hole\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfHoleKey;\n\n/**\n *  The key of the \"Par\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfParKey;\n\n/**\n *  The command IDs that can be sent back by the Golf watch app.\n *  @see -golfAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  GolfAppCommandPrevious = 0x01,\n  GolfAppCommandNext = 0x02,\n  GolfAppCommandSelect = 0x03,\n} GolfAppCommand;\n\n/**\n *  Queries the watch whether Golf Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isGolfSupported YES if Golf Messages are supported, NO if not.\n */\n- (void)golfGetIsSupported:(void(^)(PBWatch *watch, BOOL isGolfSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends an update to the golf app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey, PBGolfParKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n *  @see PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey and PBGolfParKey\n */\n- (void)golfAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Golf updates that are send by the Golf watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param command The command as sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -golfAppRemoveUpdateHandler:\n *  @see GolfAppCommand\n *  @see -golfAppRemoveUpdateHandler:\n */\n- (id)golfAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, GolfAppCommand command))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -golfAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -golfAppAddReceiveUpdateHandler:\n *  @see -golfAppAddReceiveUpdateHandler:\n */\n- (void)golfAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the golf app on the watch.\n *  @discussion It is recommended to perform this as the first call after -golfGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+Ping.h",
    "content": "//\n//  PBWatch+Ping.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/14/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n@interface PBWatch (Ping)\n\n/**\n * Sends a ping to the watch.\n * @param cookie A number identifying the ping.\n * @param onPong The block handler that will be called when the \"pong\" reply from the watch has been received.\n * @param watch The watch that sent the \"pong\" reply, which is \"self\". It is passed in to avoid retain loops.\n * @param cookie The cookie that was initially passed when calling this method.\n * @param onTimeout The block handler that will be called when the watch failed to reply in time.\n */\n- (void)pingWithCookie:(UInt32)cookie onPong:(void(^)(PBWatch *watch, UInt32 cookie))onPong onTimeout:(void(^)(PBWatch *watch, UInt32 cookie))onTimeout;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+PollServices.h",
    "content": "//\n//  PBWatch+PollServices.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n * PollServiceType\n */ \n\n\nenum {\n  PBPollRemoteServiceMail = 0,\n  PBPollRemoteServiceDataLogging = 1,\n  PBNumPollRemoteServices\n};\ntypedef UInt8 PBPollRemoteServiceType;\n\n@interface PBWatch (PollServices)\n// Call this upon connect with the watch to add handlers:\n- (id)addPollServicesHandler:(void(^)(PBWatch *))handler forService:(PBPollRemoteServiceType)service interval:(UInt8)interval;\n- (void)sendPollRequestForService:(PBPollRemoteServiceType)service;\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+Sports.h",
    "content": "//\n//  PBWatch+Sports.h\n//  PebbleKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n/**\n *  The UUID of the Sports watch app.\n */\nextern NSData *PBSportsUUID;\n\n/**\n *  The key of the \"Time\" field.\n *  The accompanying value must be an NSString (max. ~8 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsTimeKey;\n\n/**\n *  The key of the \"Distance\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDistanceKey;\n\n/**\n *  The key of the general purpose \"Data\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDataKey;\n\n/**\n *  The key of the \"Activity State\".\n *  The value must be an NSNumber created using +[NSNumber numberWithUint8:].\n *  @see SportsAppActivityState for valid values to use\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsActivityStateKey;\n\n/**\n *  Instances of this convenience class represent an update of the current time, distance and pace,\n *  and has a method to convert the values into a dictionary that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n@interface PBSportsUpdate : NSObject\n\n/**\n *  The current time in seconds. The possible range is currently limited from -7140. to 7140., inclusive. (±1h 59min 59sec).\n */\n@property (nonatomic, readwrite, assign) NSTimeInterval time;\n\n/**\n *  The current distance in km or mi. The possible range is currently limited from -99.9 to 99.9, inclusive.\n *  The unit of distance is dependent on the current unit setting.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float distance;\n\n/**\n *  General purpose data variable. The possible range is currently limited from -99.99 to 99.99, inclusive.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float data;\n\n/**\n *  Convenience method to create an update object.\n */\n+ (PBSportsUpdate*)updateWithTime:(NSTimeInterval)time distance:(float)distance data:(float)data;\n\n/**\n *  Creates an update dictionary from the receiver, that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n- (NSDictionary*)dictionary;\n\n/**\n *  Creates a formatted time string with from a total seconds value, formatted as \"h:mm:ss\".\n *  For example, supplying the value 3930.0f seconds will return @\"1:05:30\"\n *  @param seconds The number of seconds from which to create the time string.\n *  @return Formatted time as \"h:mm:ss\"\n */\n+ (NSString*)timeStringFromFloat:(float)seconds;\n\n@end\n\n@interface PBWatch (Sports)\n\n/**\n *  The state of the Sports activity.\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  SportsAppActivityStateInit = 0x00,\n  SportsAppActivityStateRunning = 0x01,\n  SportsAppActivityStatePaused = 0x02,\n  SportsAppActivityStateEnd = 0x03,\n} SportsAppActivityState;\n\n/**\n *  Queries the watch whether Sports Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isSportsSupported YES if Sports Messages are supported, NO if not.\n */\n- (void)sportsGetIsSupported:(void(^)(PBWatch *watch, BOOL isSportsSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the preferred\n *  unit system, either metric or imperial.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetMetric:(BOOL)isMetric onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents,\n *  to set the preferred  data label (either PACE or SPEED) and corresponding units.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetLabel:(BOOL)isPace onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the state of the\n *  sports activity. Currently only SportsAppActivityStateRunning and SportsAppActivityStatePaused are\n *  supported.\n *  @param state The new sports activity state\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetActivityState:(SportsAppActivityState)state onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends the update to the sports app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBSportsTimeKey, PBSportsPaceKey, PBSportsDistanceKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Sports updates that are send by the Sports watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param state The new sports activity state as set by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -sportsAppRemoveUpdateHandler:\n *  @see SportsAppActivityState\n *  @see -sportsAppRemoveUpdateHandler:\n */\n- (id)sportsAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, SportsAppActivityState state))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -sportsAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -sportsAppAddReceiveUpdateHandler:\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\n- (void)sportsAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the sports app on the watch.\n *  @discussion It is recommended to perform this as the first call after -sportsGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+Version.h",
    "content": "//\n//  PBWatch+Version.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/17/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  PBFirmwareVersion is a helper class that is able to parse the versionTag string\n *  into its components (os, major, minor, suffix) and facilitate comparisons\n *  between versions.\n *  Valid versions follow the following format:\n *  `vOS(.MAJOR(.MINOR(-SUFFIX)))`\n *  Where the fields OS, MAJOR, MINOR are positive, decimal integer numbers and SUFFIX\n *  an arbitrary string. MAJOR, MINOR and SUFFIX are optional (nested optionality).\n *  Examples of valid versions:\n *  `v1`\n *  `v2.1234.99-alpha-beta-gamma`\n */\n@interface PBFirmwareVersion : NSObject\n/**\n *  The OS version component.\n */\n@property (nonatomic, readonly) NSInteger os;\n\n/**\n *  The major version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger major;\n\n/**\n *  The minor version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger minor;\n\n/**\n *  The release suffix, which is the part following the dash '-'.\n *  @note If a version tag string does not contain a suffix, it will be set to an empty string.\n *  @discussion The release suffix is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *suffix;\n\n/**\n *  The version timestamp.\n *  @note The timestamp is in the final comparison equation, in the -compare: method, after evaluating\n *  os, major and minor components.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The version's git commit hash.\n *  @discussion The commit hash is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *commitHash;\n\n/**\n *  The version's git tag.\n */\n@property (nonatomic, readonly, copy) NSString *tag;\n\n/**\n *  Creates a PBFirmwareVersion object given a tag string and timestamp.\n */\n+ (PBFirmwareVersion*)firmwareVersionWithTag:(NSString*)tag commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Creates a PBFirmwareVersion object given its components.\n *  @discussion The tag string will be set to the canonical format vOS.MINOR.MAJOR(-SUFFIX).\n */\n+ (PBFirmwareVersion*)firmwareVersionWithOS:(NSInteger)os major:(NSInteger)major minor:(NSInteger)minor suffix:(NSString*)suffix commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Compares the receiver to another version object.\n *  @param aVersion The version to compare with the receiver.\n *  @return NSOrderedAscending if the value of aVersion is greater than the receiver’s,\n *  NSOrderedSame if they’re equal, and NSOrderedDescending if the value of aVersion is less than the receiver’s.\n */\n- (NSComparisonResult)compare:(PBFirmwareVersion *)aVersion;\n\n/**\n *  Convenience wrappers around -compare:\n */\n- (BOOL)isEqualOrNewer:(PBFirmwareVersion *)other;\n- (BOOL)isNewer:(PBFirmwareVersion *)other;\n- (BOOL)isEqualVersionOnly:(PBFirmwareVersion *)other;\n\n@end\n\n\n\n/**\n *  Values specifying the Pebble hardware platform variant.\n */\ntypedef enum {\n  FirmwareMetadataPlatformUnknown = 0,\n  FirmwareMetadataPlatformPebbleOneEV1 = 1,\n  FirmwareMetadataPlatformPebbleOneEV2 = 2,\n  FirmwareMetadataPlatformPebbleOneEV2_3 = 3,\n  FirmwareMetadataPlatformPebbleOneEV2_4 = 4,\n  FirmwareMetadataPlatformPebbleOnePointFive = 5,\n  FirmwareMetadataPlatformPebbleTwoPointZero = 6,\n  FirmwareMetadataPlatformPebbleOneBigboard = 0xff,\n  FirmwareMetadataPlatformPebbleOneBigboard2 = 0xfe,\n} FirmwareMetadataPlatform;\n\n/**\n *  Instances of PBFirmwareMetadata describe a firmware in terms of\n *  its version, whether it is a recovery firmware and its intended hardware\n *  platform.\n *  @see PBVersionInfo\n */\n\n@interface PBFirmwareMetadata : NSObject\n\n/**\n *  The version of the firmware.\n *  @see PBFirmwareVersion\n */\n@property (nonatomic, readonly) PBFirmwareVersion *version;\n\n/**\n *  YES if the firmware is a recovery firmware, NO if it is a regular firmware.\n */\n@property (nonatomic, readonly) BOOL isRecoveryFirmware;\n\n/**\n *  The hardware platform variant with which the firmware is compatible.\n */\n@property (nonatomic, readonly) FirmwareMetadataPlatform hardwarePlatform;\n\n/**\n *  Converts a <FirmwareMetadataPlatform> value to a string.\n *  @param hardwarePlatform The hardware platform value to convert\n *  @return A string of the hardware platform\n */\n+ (NSString*)hardwarePlatformToString:(FirmwareMetadataPlatform)hardwarePlatform;\n\n/**\n *  Converts an NSString hardware platform string to the corresponding\n *  FirmwareMetadataPlatform value.\n *  @param hardwarePlatformString The string representing the hardware platform.\n *  @return The hardware platform enum value\n */\n+ (FirmwareMetadataPlatform)stringToHardwarePlatform:(NSString *)hardwarePlatformString;\n\n@end\n\n/**\n *  Instances of PBResourceMetadata describe (system) resources.\n *  @see PBVersionInfo\n */\n\n@interface PBResourceMetadata : NSObject\n\n/**\n *  The version of the resources as the Epoch timestamp of the Git commit.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The checksum of the resources.\n */\n@property (nonatomic, readonly) UInt32 crc;\n\n/**\n *  The human-friendly string version of the resources.\n */\n@property (nonatomic, readonly, strong) NSString *friendlyVersion;\n\n/**\n *  YES if the metadata represents valid resources, NO if it does not.\n */\n- (BOOL)isValid;\n\n@end\n\n/**\n *  An instance of PBVersionInfo describes all the different system software (Pebble OS)\n *  on a Pebble watch and other auxiliary information.\n *  @see PBWatch\n */\n\n@interface PBVersionInfo : NSObject\n\n/**\n *  The metadata of the firmware that is running.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *runningFirmwareMetadata;\n\n/**\n *  The metadata of the recovery firmware that is in storage.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *recoveryFirmwareMetadata;\n\n/**\n *  The metadata of the system resources.\n */\n@property (nonatomic, readonly, strong) PBResourceMetadata *systemResources;\n\n/**\n *  The version of the bootloader.\n */\n@property (nonatomic, readonly) UInt32 bootloaderVersion;\n\n/**\n *  The version of the hardware.\n */\n@property (nonatomic, readonly, strong) NSString *hardwareVersion;\n\n/**\n *  The serial number.\n */\n@property (nonatomic, readonly, strong) NSString *serialNumber;\n\n/**\n *  The current Bluetooth device address.\n */\n@property (nonatomic, readonly, strong) NSData *deviceAddress;\n\n/**\n *  YES if valid recovery firmware is installed, NO if not.\n */\n- (BOOL)hasRecoveryFirmware;\n\n/**\n *  YES if valid system resources are installed, NO if not.\n */\n- (BOOL)hasSystemResources;\n\n@end\n\n@interface PBWatch (Version)\n\n/**\n *  Requests the version info from the receiver.\n *  @param handler The handler that will be called when the version info response has been received.\n *  @param onTimeout The handler that will be called if the watch did not respond within 5 seconds.\n *  @param watch The watch for which the version info was requested.\n *  @param versionInfo The version info response.\n *  @discussion The <PBVersionInfo> response will be cached. The latest version info can be\n *  accessed through the <versionInfo> property of <PBWatch>.\n */\n- (void)getVersionInfo:(void (^)(PBWatch *watch, PBVersionInfo *versionInfo))handler onTimeout:(void (^)(PBWatch *watch))onTimeout;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch.h",
    "content": "//\n//  PBWatch.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@protocol PBWatchDelegate;\n@class PBVersionInfo;\n@class PBDataLoggingService;\n\n/**\n *  Represents a Pebble watch.\n *\n *  On iOS, there is the notion of a \"communication session\" between an app and\n *  the Pebble watch. You can imagine this as a \"data pipe\" directly from the\n *  watch to your app. However, there is only one session for 3rd party apps.\n *  This one session has to be shared among all 3rd party apps that want to\n *  communicate with Pebble (excluding the official Pebble iOS app).\n *\n *  Unfortunately, the session can only be opened from the phone app. This means\n *  that the iOS app has to start talking to the watch first to open the\n *  communications channel; the other way around is not possible.\n *  Most methods in the PBWatch categories (Ping), (Version), (Sports), (Golf)\n *  and (AppMessages) all implicitly open the shared communication session.\n *\n *  Lastly, iOS provides no good way to manage how the one shared session is\n *  accessed or used. Simply, the last iOS app to try to open it, wins and gets\n *  to use it. Therefore, it is important that your iOS app does **not** try\n *  communicate when a Pebble is connected.\n *\n *  When the user has stopped using your app (e.g. when going to the background\n *  or when explicitely stopping a certain activity in the app) your iOS app\n *  should close the communication session using the -closeSession: method.\n */\n@interface PBWatch : NSObject\n\n/**\n *  YES if the receiver is connected and NO if the receiver is disconnected.\n *  @discussion This property is KVO-compliant.\n */\n@property (nonatomic, readonly, getter=isConnected) BOOL connected;\n\n/**\n *  The human-friendly name of the receiver.\n *  This is the same name as the user will see in the iOS Bluetooth Settings.\n */\n@property (nonatomic, readonly) NSString *name;\n\n/**\n *  The serial number of the receiver.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  The versionInfo of the receiver.\n *  @see PBVersionInfo\n */\n@property (nonatomic, readonly) PBVersionInfo *versionInfo;\n\n/**\n *  The delegate of the watch that will be notified of disconnections and errors.\n *  @see PBWatchDelegate\n */\n@property (nonatomic, readwrite, weak) id<PBWatchDelegate> delegate;\n\n/**\n *  The userInfo property can be used to associate application specific data\n *  with the watch. Note that the application itself is responsible for persisting\n *  the information if neccessary.\n */\n@property (nonatomic, readwrite, strong) id userInfo;\n\n/**\n *  The date when the watch was last known to be connected.\n *  This date will be updated automatically when the watch connects and\n *  disconnects. While the watch is being connected, this date will not be updated.\n */\n@property (nonatomic, readonly) NSDate *lastConnectedDate;\n\n/**\n *  Developer-friendly debugging description of the watch.\n *  @return localized, user-friendly summary of the receiver, including\n *  software and hardware version information, if available.\n */\n- (NSString*)friendlyDescription;\n\n/**\n *  Closes the communication session with the watch.\n *  Since there is only one, shared session for all 3rd party iOS apps,\n *  an app should close the session after the user is done using the app/watch-integration,\n *  so it can be used by other apps.\n *  The communication session is implicitely opened automatically when needed.\n *  @param onDone Callback block that will be called after the closing of the session\n *  has completed. If there is no open session, the onDone block will (also) be executed\n *  asynchronously on the calling queue.\n */\n- (void)closeSession:(void(^)(void))onDone;\n\n@end\n\n@protocol PBWatchDelegate <NSObject>\n@optional\n\n/**\n *  Called when the watch got disconnected.\n */\n- (void)watchDidDisconnect:(PBWatch*)watch;\n\n/**\n *  Called when the watch caught an error.\n */\n- (void)watch:(PBWatch*)watch handleError:(NSError*)error;\n\n/**\n *  Called when the internal EASession is about to be reset.\n */\n- (void)watchWillResetSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is opened\n */\n- (void)watchDidOpenSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is closed\n */\n- (void)watchDidCloseSession:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PebbleKit.h",
    "content": "//\n//  PebbleSDK.h\n//  PebbleSDK\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#import <PebbleKit/PBWatch.h>\n#import <PebbleKit/PBPebbleCentral.h>\n#import <PebbleKit/PBWatch+Ping.h>\n#import <PebbleKit/PBWatch+Version.h>\n#import <PebbleKit/PBErrors.h>\n#import <PebbleKit/PBWatch+AppMessages.h>\n#import <PebbleKit/NSNumber+stdint.h>\n#import <PebbleKit/PBWatch+Sports.h>\n#import <PebbleKit/PBWatch+Golf.h>\n#import <PebbleKit/PBBitmap.h>\n#import <PebbleKit/PBDataLoggingService.h>\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/gtypes.h",
    "content": "//\n//  gtypes.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#ifndef PebbleKit_gtypes_h\n#define PebbleKit_gtypes_h\n\ntypedef struct GSize {\n  int16_t w;\n  int16_t h;\n} GSize;\n\ntypedef struct GPoint {\n  int16_t x;\n  int16_t y;\n} GPoint;\n\ntypedef struct GRect {\n  GPoint origin;\n  GSize size;\n} GRect;\n\n#endif\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/NSDictionary+Pebble.h",
    "content": "//\n//  NSDictionary+Pebble.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSDictionary (Pebble)\n\n/**\n *  Serializes the receiver into a Pebble dict.\n *  @note The receiver dictionary must comply to the following constraints:\n *  * The keys must be instances of NSNumber. Their -unsignedLongValue return value will be used as final key.\n *  * The values must be instances of either NSString, NSData or NSNumber. Use the NSNumber (stdint) category\n *  to specify the signedness and width of NSNumbers.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryUnsupportedKeyClass,\n *  PBErrorCodeDictionaryUnsupportedValueClass or PBErrorCodeDictionaryUnsupportedValueClass.\n *  @see -dictionaryFromPebbleDictionaryDataWithError:\n */\n- (NSData*)pebbleDictionaryData:(NSError * __autoreleasing *)error;\n\n@end\n\n@interface NSData (Pebble)\n\n/**\n *  Interprets the receiver as Pebble dict data and deserializes it into an NSDictionary.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryInternalConsistency.\n *  @see -pebbleDictionaryData:\n */\n- (NSDictionary*)dictionaryFromPebbleDictionaryDataWithError:(NSError * __autoreleasing *)error;\n\n@end"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/NSNumber+stdint.h",
    "content": "//\n//  NSNumber+stdint.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/**\n *  This category exposes the capabilities the underlying CFNumber to explicitely\n *  store the signedness and the width of the storage.\n */\n\n@interface NSNumber (stdint)\n\n/**\n *  Interprets the receiver as a 32-bits wide, unsigned integer.\n */\n- (uint32_t)uint32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, unsigned integer.\n */\n- (uint16_t)uint16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, unsigned integer.\n */\n- (uint8_t)uint8Value;\n\n/**\n *  Interprets the receiver as a 32-bits wide, signed integer.\n */\n- (int32_t)int32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, signed integer.\n */\n- (int16_t)int16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, signed integer.\n */\n- (int8_t)int8Value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint32:(uint32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint16:(uint16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint8:(uint8_t)value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt32:(int32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt16:(int16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt8:(int8_t)value;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a floating pointer number or not.\n */\n- (BOOL)isFloat;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a signed integer or not.\n */\n- (BOOL)isSigned;\n\n/**\n *  Gets the width in bytes of the integer that is stored by the receiver.\n */\n- (uint8_t)width;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBBitmap.h",
    "content": "//\n//  PBBitmap.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIImage.h>\n#import <PebbleKit/gtypes.h>\n\n/**\n *  Helper class to convert a UIImage to Pebble bitmap pixel data and GBitmap metadata.\n *  Refer to the documentation of Pebble's native watch app SDK on the GBitmap format.\n */\n\n@interface PBBitmap : NSObject\n\n/**\n *  The pixel data of the bitmap.\n *  This corresponds to the data as pointed to by GBitmap's `addr` field.\n */\n@property (nonatomic, readonly, strong) NSData *pixelData;\n\n/**\n *  The number of bytes per row.\n *  Always a multiple of 4 bytes.\n */\n@property (nonatomic, readonly, assign) uint16_t rowSizeBytes;\n\n/**\n *  Bitfield of metadata flags.\n *  This corresponds to GBitmap's `info_flags` field.\n */\n@property (nonatomic, readonly, assign) uint16_t infoFlags;\n\n/**\n *  The box of bits inside `pixelData`, that contains\n *  the actual image data to use.\n *  This corresponds to GBitmap's `bounds` field.\n */\n@property (nonatomic, readonly, assign) GRect bounds;\n\n/**\n *  Factory method to create a PBBitmap from a UIImage instance.\n *  @param image The UIImage from which to create the PBBitmap\n */\n+ (PBBitmap*)pebbleBitmapWithUIImage:(UIImage*)image;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBDataLoggingService.h",
    "content": "//\n//  PBDataLoggingService.h\n//  PebbleKit\n//\n//  Created by Martijn The on 7/19/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  Data logging datatypes.\n */\nenum {\n  //! Array of bytes\n  PBDataLoggingTypeByteArray = 0,\n  //! unsigned integer\n  PBDataLoggingTypeUInt = 2,\n  //! signed integer\n  PBDataLoggingTypeInt = 3,\n};\ntypedef UInt8 PBDataLoggingType;\n\n/**\n *  The metadata of a data logging session. Used to identify a session.\n */\n@interface PBDataLoggingSessionMetadata : NSObject <NSSecureCoding, NSCopying>\n\n/**\n *  A tag associated with the session.\n */\n@property (nonatomic, readonly) UInt32 tag;\n\n/**\n *  The timestamp of the moment the session was created by the watchapp.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The type of data stored in this session.\n */\n@property (nonatomic, readonly) PBDataLoggingType type;\n\n/**\n *  The size of a data item.\n */\n@property (nonatomic, readonly) UInt16 itemSize;\n\n/**\n *  The serial number of the watch that created the sessions.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  Creates a new data logging session metadata object, given all its property values.\n *  This method is provided to create a metadata object that can be used to\n *  compare it with a metadata object that is passed into one of the\n *  PBDataLoggingServiceDelegate methods.\n *  @param tag The tag associated with the session\n *  @param timestamp The timestamp of the creation of the session\n *  @param type The type of data stored in the session\n *  @param itemSize The size of a data item\n *  @param serialNumber The serial number of the watch that created the session\n *  @return A session metadata object with the specified information\n */\n+ (id)metadataWithTag:(UInt32)tag\n            timestamp:(UInt32)timestamp\n                 type:(PBDataLoggingType)type\n             itemSize:(UInt16)itemSize\n         serialNumber:(NSString *)serialNumber;\n\n/**\n *  Tests the equality of two data logging session metadata objects.\n *  This method can be used to compare two session metadata objects\n *  to check whether they are referring to the same session or not.\n *  @param sessionMetadata\n *  @return YES if all the property values of receiver are equal to the property\n *  values of the given session.\n *  @note Equivalent to -[PBDataLoggingSessionMetadata isEqual:]\n */\n- (BOOL)isEqualToDataLoggingSessionMetadata:(PBDataLoggingSessionMetadata *)sessionMetadata;\n@end\n\n/**\n *  Data logging delegate protocol. The object that implements this protocol\n *  is responsible for handling incoming data.\n */\n@protocol PBDataLoggingServiceDelegate <NSObject>\n@optional\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param bytes Pointer to the array of bytes.\n *  The array contains (numberOfItems * session.itemSize) bytes.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasByteArrays:(const UInt8 * const)bytes numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt8s:(const UInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt16s:(const UInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt32s:(const UInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt8s:(const SInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt16s:(const SInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt32s:(const SInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time a session is finished.\n *  This is guaranteed to be called only after all data has been received and\n *  consumed by the application.\n *  @param service The data logging service.\n *  @param session The metadata of the session.\n */\n- (void)dataLoggingService:(PBDataLoggingService *)service sessionDidFinish:(PBDataLoggingSessionMetadata *)session;\n\n@end\n\n/**\n *  The data logging service. Assign a delegate object in order to receive\n *  data from your watchapp.\n */\n@interface PBDataLoggingService : NSObject\n\n/**\n *  The delegate that has the responsility of handling callbacks from the\n *  data logging service.\n */\n@property (atomic, readwrite, weak) id<PBDataLoggingServiceDelegate> delegate;\n\n/**\n *  Sets the queue on which delegate methods will be executed.\n *  Callbacks are intended to be processed in the order as they come in, so it\n *  you must use a serial queue. If set to nil (default) the main queue is used.\n *  @param delegateQueue The queue on which the delegate methods will be executed.\n */\n- (void)setDelegateQueue:(dispatch_queue_t)delegateQueue;\n\n/**\n * Query the watch for data logging data.\n */\n- (void)pollForData;\n  \n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBErrors.h",
    "content": "//\n//  PBErrors.h\n//  PebbleSDK\n//\n//  Created by Martijn The on 7/26/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nextern NSString *PBErrorDomain;\n\n/**\n *  PebbleKit Error codes.\n *  Inspect the localizedDescription of any NSError objects for a description.\n */\n\ntypedef enum {\n  PBErrorCodeNoSupportedProtocolsInInfoPlist,\n  PBErrorCodeErrorCreatingSession,\n  PBErrorCodeOutputStreamError,\n  PBErrorCodeInputStreamError,\n  PBErrorCodeSendMessageTimeout,\n  PBErrorCodeEndpointDisallowed,\n  PBErrorCodeVersionInfoTimeout,\n  PBErrorCodeCannotCreateSessionWhileClosing,\n  PBErrorCodeNoAppUUID,\n  PBErrorCodeAppMessageRejected,\n  PBErrorCodeAppMessageAckTimeout,\n  PBErrorCodeDictionaryUnsupportedKeyClass,\n  PBErrorCodeDictionaryUnsupportedValueClass,\n  PBErrorCodeDictionaryInternalConsistency,\n  PBErrorCodeInvalidArguments,\n  PBErrorCodePebbleAppUnreachable,\n  PBErrorCodePebbleAppRequestTimeout,\n  PBErrorCodePebbleAppEmptyResponse,\n  PBErrorCodePebbleAppUnexpectedResponse,\n  PBErrorCodeServerNotAvailable,\n  PBErrorCodeDownloadFailed,\n  PBErrorCodePebbleNotConnected\n} PBErrorCode;\n\n@interface NSError (Pebble)\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode and with an underlying NSError object.\n *  @param code The error code for which to create the error\n *  @param error The underlying error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code underLyingError:(NSError*)error;\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode.\n *  @param code The error code for which to create the error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code;\n\n@end"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBLog.h",
    "content": "//\n//  PBLog.h\n//  PebbleApp\n//\n//  Created by Martijn The on 11/29/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import \"DDLog.h\"\n\n#ifndef PBWSLOG_CONTEXT\n#define PBWSLOG_CONTEXT 1\n#endif\n\nextern int PBLogLevel;\n\n#define LogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define WSLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n\n#define LogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBPebbleCentral.h",
    "content": "//\n//  PBPebbleCentral.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class PBWatch;\n@class PBDataLoggingService;\n@protocol PBPebbleCentralDelegate;\n\n/**\n PebbleCentral plays the central role for client iOS apps (e.g. RunKeeper).\n */\n@interface PBPebbleCentral : NSObject\n\n/**\n @returns The default central singleton instance.\n */\n+ (PBPebbleCentral*)defaultCentral;\n\n/**\n *  Enables debug logs. The logs will be routed to the system log (ASL) and\n *  console. It is advised to call this before making any other calls to PebbleKit.\n */\n+ (void)setDebugLogsEnabled:(BOOL)logsEnabled;\n\n/**\n The watches that are currently connected. Do not cache the array because it can change over time.\n */\n@property (nonatomic, readonly, strong) NSArray *connectedWatches;\n\n/**\n The watches that are stored in the user preferences of the application.\n */\n@property (nonatomic, readonly, strong) NSArray *registeredWatches;\n\n/**\n The central's delegate.\n */\n@property (nonatomic, readwrite, weak) id<PBPebbleCentralDelegate> delegate;\n\n/**\n *  The UUID is used as the identifier of the watch application and is used\n *  to make sure that appMessage and dataLogging communications arrives at its companion app\n *  on the other device (and not in another app).\n *  For most app message methods there is are two variants: one that does not take a UUID parameter and one that does take\n *  a UUID parameter (for example, -appMessagesAddReceiveUpdateHandler: vs appMessagesAddReceiveUpdateHandler:withUUID:).\n *  The methods that do not take a UUID, will use the UUID as set prior to this property.\n *  @param uuid The 16 byte UUID of your app.\n *  @note The UUID needs to be set before using either app message or data logging.\n */\n@property (nonatomic, strong, readwrite) NSData *appUUID;\n\n/**\n *  Verifies the currently set application UUID.\n *  @return YES if the currently set UUID is valid, NO if it is not.\n *  @see -setAppUuid:\n */\n- (BOOL)hasValidAppUUID;\n\n/**\n @returns YES if the Pebble iOS app is installed, NO if it is not installed.\n */\n- (BOOL)isMobileAppInstalled;\n\n/**\n Redirects to Pebble in the App Store, so the user can install the app.\n */\n- (void)installMobileApp;\n\n/**\n Wipes out the data associated with the registered watches, that is stored on the phone.\n */\n- (void)unregisterAllWatches;\n\n/**\n Returns the most recently connected watch from the -registeredWatches array.\n */\n- (PBWatch*)lastConnectedWatch;\n\n@property (nonatomic, readonly) PBDataLoggingService *dataLoggingService;\n\n@end\n\n\n@protocol PBPebbleCentralDelegate <NSObject>\n@optional\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was connected.\n @param isNew YES if the watch has been connected for the first time since the app has been installed or NO if not.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidConnect:(PBWatch*)watch isNew:(BOOL)isNew;\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was disconnected.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidDisconnect:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+AppMessages.h",
    "content": "//\n//  PBWatch+AppMessages.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\ntypedef NS_ENUM(UInt8, PBAppState) {\n  PBAppStateNotRunning = 0x00,\n  PBAppStateRunning = 0x01,\n};\n\n@interface PBWatch (AppMessages)\n\n/**\n *  Queries the watch whether AppMessages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isAppMessagesSupported YES if AppMessages are supported, NO if not.\n */\n- (void)appMessagesGetIsSupported:(void(^)(PBWatch *watch, BOOL isAppMessagesSupported))fetchedBlock;\n\n/**\n *  Pushes an update to the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Pushes an update to the watch application with the specified UUID.\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watchapp to which the update should be sent.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary withUUID:(NSData*)uuid onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with the specified UUID.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @param uuid The UUID of the watchapp for which sent messages should be handled by the onReceive block.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive withUUID:(NSData*)uuid;\n\n/**\n *  Add a handler for lifecycle events of watch applications.\n *  @param onLifecycleUpdate This block will be called when an application starts and\n *  stops running.\n *  @param watch The watch that has sent the event.\n *  @param uuid The uuid of the application that caused the event.\n *  @param newAppState The new state of the app (either PBAppStateNotRunning or PBAppStateRunning).\n */\n- (id)appMessagesAddAppLifecycleUpdateHandler:(void(^)(PBWatch *watch, NSUUID *uuid,\n                                                       PBAppState newAppState))onLifecycleUpdate;\n\n\n// INTERNAL USE ONLY\n- (id)appMessagesAddReceiveAllUpdatesHandler:(BOOL(^)(PBWatch *watch, NSUUID *uuid, NSDictionary *update))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -appMessagesAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -appMessagesAddReceiveUpdateHandler:\n *  @see -appMessagesAddReceiveUpdateHandler:\n */\n- (void)appMessagesRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Fetches the run state of the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]. You can use this method to determine whether the watch\n *  application is running or not.\n *  TODO: Ask Francois how this API works.\n *  @param onSent The block that will be called after the fetch state command has been\n *  sent to the watch.\n */\n- (void)appMessagesFetchAppState:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with the specified UUID.\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n/**\n *  Sends a command to kill the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to kill the watch application with the specified UUID.\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+Golf.h",
    "content": "//\n//  PBWatch+Golf.h\n//  PebbleKit\n//\n//  Created by Martijn The on 4/4/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n@interface PBWatch (Golf)\n\n/**\n *  The UUID of the Golf watch app.\n */\nextern NSData *PBGolfUUID;\n\n/**\n *  The key of the \"Front\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfFrontKey;\n\n/**\n *  The key of the \"Mid\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfMidKey;\n\n/**\n *  The key of the \"Back\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfBackKey;\n\n/**\n *  The key of the \"Hole\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfHoleKey;\n\n/**\n *  The key of the \"Par\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfParKey;\n\n/**\n *  The command IDs that can be sent back by the Golf watch app.\n *  @see -golfAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  GolfAppCommandPrevious = 0x01,\n  GolfAppCommandNext = 0x02,\n  GolfAppCommandSelect = 0x03,\n} GolfAppCommand;\n\n/**\n *  Queries the watch whether Golf Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isGolfSupported YES if Golf Messages are supported, NO if not.\n */\n- (void)golfGetIsSupported:(void(^)(PBWatch *watch, BOOL isGolfSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends an update to the golf app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey, PBGolfParKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n *  @see PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey and PBGolfParKey\n */\n- (void)golfAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Golf updates that are send by the Golf watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param command The command as sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -golfAppRemoveUpdateHandler:\n *  @see GolfAppCommand\n *  @see -golfAppRemoveUpdateHandler:\n */\n- (id)golfAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, GolfAppCommand command))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -golfAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -golfAppAddReceiveUpdateHandler:\n *  @see -golfAppAddReceiveUpdateHandler:\n */\n- (void)golfAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the golf app on the watch.\n *  @discussion It is recommended to perform this as the first call after -golfGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+Ping.h",
    "content": "//\n//  PBWatch+Ping.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/14/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n@interface PBWatch (Ping)\n\n/**\n * Sends a ping to the watch.\n * @param cookie A number identifying the ping.\n * @param onPong The block handler that will be called when the \"pong\" reply from the watch has been received.\n * @param watch The watch that sent the \"pong\" reply, which is \"self\". It is passed in to avoid retain loops.\n * @param cookie The cookie that was initially passed when calling this method.\n * @param onTimeout The block handler that will be called when the watch failed to reply in time.\n */\n- (void)pingWithCookie:(UInt32)cookie onPong:(void(^)(PBWatch *watch, UInt32 cookie))onPong onTimeout:(void(^)(PBWatch *watch, UInt32 cookie))onTimeout;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+PollServices.h",
    "content": "//\n//  PBWatch+PollServices.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n * PollServiceType\n */ \n\n\nenum {\n  PBPollRemoteServiceMail = 0,\n  PBPollRemoteServiceDataLogging = 1,\n  PBNumPollRemoteServices\n};\ntypedef UInt8 PBPollRemoteServiceType;\n\n@interface PBWatch (PollServices)\n// Call this upon connect with the watch to add handlers:\n- (id)addPollServicesHandler:(void(^)(PBWatch *))handler forService:(PBPollRemoteServiceType)service interval:(UInt8)interval;\n- (void)sendPollRequestForService:(PBPollRemoteServiceType)service;\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+Sports.h",
    "content": "//\n//  PBWatch+Sports.h\n//  PebbleKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n/**\n *  The UUID of the Sports watch app.\n */\nextern NSData *PBSportsUUID;\n\n/**\n *  The key of the \"Time\" field.\n *  The accompanying value must be an NSString (max. ~8 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsTimeKey;\n\n/**\n *  The key of the \"Distance\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDistanceKey;\n\n/**\n *  The key of the general purpose \"Data\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDataKey;\n\n/**\n *  The key of the \"Activity State\".\n *  The value must be an NSNumber created using +[NSNumber numberWithUint8:].\n *  @see SportsAppActivityState for valid values to use\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsActivityStateKey;\n\n/**\n *  Instances of this convenience class represent an update of the current time, distance and pace,\n *  and has a method to convert the values into a dictionary that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n@interface PBSportsUpdate : NSObject\n\n/**\n *  The current time in seconds. The possible range is currently limited from -7140. to 7140., inclusive. (±1h 59min 59sec).\n */\n@property (nonatomic, readwrite, assign) NSTimeInterval time;\n\n/**\n *  The current distance in km or mi. The possible range is currently limited from -99.9 to 99.9, inclusive.\n *  The unit of distance is dependent on the current unit setting.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float distance;\n\n/**\n *  General purpose data variable. The possible range is currently limited from -99.99 to 99.99, inclusive.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float data;\n\n/**\n *  Convenience method to create an update object.\n */\n+ (PBSportsUpdate*)updateWithTime:(NSTimeInterval)time distance:(float)distance data:(float)data;\n\n/**\n *  Creates an update dictionary from the receiver, that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n- (NSDictionary*)dictionary;\n\n/**\n *  Creates a formatted time string with from a total seconds value, formatted as \"h:mm:ss\".\n *  For example, supplying the value 3930.0f seconds will return @\"1:05:30\"\n *  @param seconds The number of seconds from which to create the time string.\n *  @return Formatted time as \"h:mm:ss\"\n */\n+ (NSString*)timeStringFromFloat:(float)seconds;\n\n@end\n\n@interface PBWatch (Sports)\n\n/**\n *  The state of the Sports activity.\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  SportsAppActivityStateInit = 0x00,\n  SportsAppActivityStateRunning = 0x01,\n  SportsAppActivityStatePaused = 0x02,\n  SportsAppActivityStateEnd = 0x03,\n} SportsAppActivityState;\n\n/**\n *  Queries the watch whether Sports Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isSportsSupported YES if Sports Messages are supported, NO if not.\n */\n- (void)sportsGetIsSupported:(void(^)(PBWatch *watch, BOOL isSportsSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the preferred\n *  unit system, either metric or imperial.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetMetric:(BOOL)isMetric onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents,\n *  to set the preferred  data label (either PACE or SPEED) and corresponding units.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetLabel:(BOOL)isPace onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the state of the\n *  sports activity. Currently only SportsAppActivityStateRunning and SportsAppActivityStatePaused are\n *  supported.\n *  @param state The new sports activity state\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetActivityState:(SportsAppActivityState)state onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends the update to the sports app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBSportsTimeKey, PBSportsPaceKey, PBSportsDistanceKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Sports updates that are send by the Sports watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param state The new sports activity state as set by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -sportsAppRemoveUpdateHandler:\n *  @see SportsAppActivityState\n *  @see -sportsAppRemoveUpdateHandler:\n */\n- (id)sportsAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, SportsAppActivityState state))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -sportsAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -sportsAppAddReceiveUpdateHandler:\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\n- (void)sportsAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the sports app on the watch.\n *  @discussion It is recommended to perform this as the first call after -sportsGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+Version.h",
    "content": "//\n//  PBWatch+Version.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/17/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  PBFirmwareVersion is a helper class that is able to parse the versionTag string\n *  into its components (os, major, minor, suffix) and facilitate comparisons\n *  between versions.\n *  Valid versions follow the following format:\n *  `vOS(.MAJOR(.MINOR(-SUFFIX)))`\n *  Where the fields OS, MAJOR, MINOR are positive, decimal integer numbers and SUFFIX\n *  an arbitrary string. MAJOR, MINOR and SUFFIX are optional (nested optionality).\n *  Examples of valid versions:\n *  `v1`\n *  `v2.1234.99-alpha-beta-gamma`\n */\n@interface PBFirmwareVersion : NSObject\n/**\n *  The OS version component.\n */\n@property (nonatomic, readonly) NSInteger os;\n\n/**\n *  The major version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger major;\n\n/**\n *  The minor version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger minor;\n\n/**\n *  The release suffix, which is the part following the dash '-'.\n *  @note If a version tag string does not contain a suffix, it will be set to an empty string.\n *  @discussion The release suffix is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *suffix;\n\n/**\n *  The version timestamp.\n *  @note The timestamp is in the final comparison equation, in the -compare: method, after evaluating\n *  os, major and minor components.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The version's git commit hash.\n *  @discussion The commit hash is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *commitHash;\n\n/**\n *  The version's git tag.\n */\n@property (nonatomic, readonly, copy) NSString *tag;\n\n/**\n *  Creates a PBFirmwareVersion object given a tag string and timestamp.\n */\n+ (PBFirmwareVersion*)firmwareVersionWithTag:(NSString*)tag commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Creates a PBFirmwareVersion object given its components.\n *  @discussion The tag string will be set to the canonical format vOS.MINOR.MAJOR(-SUFFIX).\n */\n+ (PBFirmwareVersion*)firmwareVersionWithOS:(NSInteger)os major:(NSInteger)major minor:(NSInteger)minor suffix:(NSString*)suffix commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Compares the receiver to another version object.\n *  @param aVersion The version to compare with the receiver.\n *  @return NSOrderedAscending if the value of aVersion is greater than the receiver’s,\n *  NSOrderedSame if they’re equal, and NSOrderedDescending if the value of aVersion is less than the receiver’s.\n */\n- (NSComparisonResult)compare:(PBFirmwareVersion *)aVersion;\n\n/**\n *  Convenience wrappers around -compare:\n */\n- (BOOL)isEqualOrNewer:(PBFirmwareVersion *)other;\n- (BOOL)isNewer:(PBFirmwareVersion *)other;\n- (BOOL)isEqualVersionOnly:(PBFirmwareVersion *)other;\n\n@end\n\n\n\n/**\n *  Values specifying the Pebble hardware platform variant.\n */\ntypedef enum {\n  FirmwareMetadataPlatformUnknown = 0,\n  FirmwareMetadataPlatformPebbleOneEV1 = 1,\n  FirmwareMetadataPlatformPebbleOneEV2 = 2,\n  FirmwareMetadataPlatformPebbleOneEV2_3 = 3,\n  FirmwareMetadataPlatformPebbleOneEV2_4 = 4,\n  FirmwareMetadataPlatformPebbleOnePointFive = 5,\n  FirmwareMetadataPlatformPebbleTwoPointZero = 6,\n  FirmwareMetadataPlatformPebbleOneBigboard = 0xff,\n  FirmwareMetadataPlatformPebbleOneBigboard2 = 0xfe,\n} FirmwareMetadataPlatform;\n\n/**\n *  Instances of PBFirmwareMetadata describe a firmware in terms of\n *  its version, whether it is a recovery firmware and its intended hardware\n *  platform.\n *  @see PBVersionInfo\n */\n\n@interface PBFirmwareMetadata : NSObject\n\n/**\n *  The version of the firmware.\n *  @see PBFirmwareVersion\n */\n@property (nonatomic, readonly) PBFirmwareVersion *version;\n\n/**\n *  YES if the firmware is a recovery firmware, NO if it is a regular firmware.\n */\n@property (nonatomic, readonly) BOOL isRecoveryFirmware;\n\n/**\n *  The hardware platform variant with which the firmware is compatible.\n */\n@property (nonatomic, readonly) FirmwareMetadataPlatform hardwarePlatform;\n\n/**\n *  Converts a <FirmwareMetadataPlatform> value to a string.\n *  @param hardwarePlatform The hardware platform value to convert\n *  @return A string of the hardware platform\n */\n+ (NSString*)hardwarePlatformToString:(FirmwareMetadataPlatform)hardwarePlatform;\n\n/**\n *  Converts an NSString hardware platform string to the corresponding\n *  FirmwareMetadataPlatform value.\n *  @param hardwarePlatformString The string representing the hardware platform.\n *  @return The hardware platform enum value\n */\n+ (FirmwareMetadataPlatform)stringToHardwarePlatform:(NSString *)hardwarePlatformString;\n\n@end\n\n/**\n *  Instances of PBResourceMetadata describe (system) resources.\n *  @see PBVersionInfo\n */\n\n@interface PBResourceMetadata : NSObject\n\n/**\n *  The version of the resources as the Epoch timestamp of the Git commit.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The checksum of the resources.\n */\n@property (nonatomic, readonly) UInt32 crc;\n\n/**\n *  The human-friendly string version of the resources.\n */\n@property (nonatomic, readonly, strong) NSString *friendlyVersion;\n\n/**\n *  YES if the metadata represents valid resources, NO if it does not.\n */\n- (BOOL)isValid;\n\n@end\n\n/**\n *  An instance of PBVersionInfo describes all the different system software (Pebble OS)\n *  on a Pebble watch and other auxiliary information.\n *  @see PBWatch\n */\n\n@interface PBVersionInfo : NSObject\n\n/**\n *  The metadata of the firmware that is running.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *runningFirmwareMetadata;\n\n/**\n *  The metadata of the recovery firmware that is in storage.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *recoveryFirmwareMetadata;\n\n/**\n *  The metadata of the system resources.\n */\n@property (nonatomic, readonly, strong) PBResourceMetadata *systemResources;\n\n/**\n *  The version of the bootloader.\n */\n@property (nonatomic, readonly) UInt32 bootloaderVersion;\n\n/**\n *  The version of the hardware.\n */\n@property (nonatomic, readonly, strong) NSString *hardwareVersion;\n\n/**\n *  The serial number.\n */\n@property (nonatomic, readonly, strong) NSString *serialNumber;\n\n/**\n *  The current Bluetooth device address.\n */\n@property (nonatomic, readonly, strong) NSData *deviceAddress;\n\n/**\n *  YES if valid recovery firmware is installed, NO if not.\n */\n- (BOOL)hasRecoveryFirmware;\n\n/**\n *  YES if valid system resources are installed, NO if not.\n */\n- (BOOL)hasSystemResources;\n\n@end\n\n@interface PBWatch (Version)\n\n/**\n *  Requests the version info from the receiver.\n *  @param handler The handler that will be called when the version info response has been received.\n *  @param onTimeout The handler that will be called if the watch did not respond within 5 seconds.\n *  @param watch The watch for which the version info was requested.\n *  @param versionInfo The version info response.\n *  @discussion The <PBVersionInfo> response will be cached. The latest version info can be\n *  accessed through the <versionInfo> property of <PBWatch>.\n */\n- (void)getVersionInfo:(void (^)(PBWatch *watch, PBVersionInfo *versionInfo))handler onTimeout:(void (^)(PBWatch *watch))onTimeout;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch.h",
    "content": "//\n//  PBWatch.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@protocol PBWatchDelegate;\n@class PBVersionInfo;\n@class PBDataLoggingService;\n\n/**\n *  Represents a Pebble watch.\n *\n *  On iOS, there is the notion of a \"communication session\" between an app and\n *  the Pebble watch. You can imagine this as a \"data pipe\" directly from the\n *  watch to your app. However, there is only one session for 3rd party apps.\n *  This one session has to be shared among all 3rd party apps that want to\n *  communicate with Pebble (excluding the official Pebble iOS app).\n *\n *  Unfortunately, the session can only be opened from the phone app. This means\n *  that the iOS app has to start talking to the watch first to open the\n *  communications channel; the other way around is not possible.\n *  Most methods in the PBWatch categories (Ping), (Version), (Sports), (Golf)\n *  and (AppMessages) all implicitly open the shared communication session.\n *\n *  Lastly, iOS provides no good way to manage how the one shared session is\n *  accessed or used. Simply, the last iOS app to try to open it, wins and gets\n *  to use it. Therefore, it is important that your iOS app does **not** try\n *  communicate when a Pebble is connected.\n *\n *  When the user has stopped using your app (e.g. when going to the background\n *  or when explicitely stopping a certain activity in the app) your iOS app\n *  should close the communication session using the -closeSession: method.\n */\n@interface PBWatch : NSObject\n\n/**\n *  YES if the receiver is connected and NO if the receiver is disconnected.\n *  @discussion This property is KVO-compliant.\n */\n@property (nonatomic, readonly, getter=isConnected) BOOL connected;\n\n/**\n *  The human-friendly name of the receiver.\n *  This is the same name as the user will see in the iOS Bluetooth Settings.\n */\n@property (nonatomic, readonly) NSString *name;\n\n/**\n *  The serial number of the receiver.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  The versionInfo of the receiver.\n *  @see PBVersionInfo\n */\n@property (nonatomic, readonly) PBVersionInfo *versionInfo;\n\n/**\n *  The delegate of the watch that will be notified of disconnections and errors.\n *  @see PBWatchDelegate\n */\n@property (nonatomic, readwrite, weak) id<PBWatchDelegate> delegate;\n\n/**\n *  The userInfo property can be used to associate application specific data\n *  with the watch. Note that the application itself is responsible for persisting\n *  the information if neccessary.\n */\n@property (nonatomic, readwrite, strong) id userInfo;\n\n/**\n *  The date when the watch was last known to be connected.\n *  This date will be updated automatically when the watch connects and\n *  disconnects. While the watch is being connected, this date will not be updated.\n */\n@property (nonatomic, readonly) NSDate *lastConnectedDate;\n\n/**\n *  Developer-friendly debugging description of the watch.\n *  @return localized, user-friendly summary of the receiver, including\n *  software and hardware version information, if available.\n */\n- (NSString*)friendlyDescription;\n\n/**\n *  Closes the communication session with the watch.\n *  Since there is only one, shared session for all 3rd party iOS apps,\n *  an app should close the session after the user is done using the app/watch-integration,\n *  so it can be used by other apps.\n *  The communication session is implicitely opened automatically when needed.\n *  @param onDone Callback block that will be called after the closing of the session\n *  has completed. If there is no open session, the onDone block will (also) be executed\n *  asynchronously on the calling queue.\n */\n- (void)closeSession:(void(^)(void))onDone;\n\n@end\n\n@protocol PBWatchDelegate <NSObject>\n@optional\n\n/**\n *  Called when the watch got disconnected.\n */\n- (void)watchDidDisconnect:(PBWatch*)watch;\n\n/**\n *  Called when the watch caught an error.\n */\n- (void)watch:(PBWatch*)watch handleError:(NSError*)error;\n\n/**\n *  Called when the internal EASession is about to be reset.\n */\n- (void)watchWillResetSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is opened\n */\n- (void)watchDidOpenSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is closed\n */\n- (void)watchDidCloseSession:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PebbleKit.h",
    "content": "//\n//  PebbleSDK.h\n//  PebbleSDK\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#import <PebbleKit/PBWatch.h>\n#import <PebbleKit/PBPebbleCentral.h>\n#import <PebbleKit/PBWatch+Ping.h>\n#import <PebbleKit/PBWatch+Version.h>\n#import <PebbleKit/PBErrors.h>\n#import <PebbleKit/PBWatch+AppMessages.h>\n#import <PebbleKit/NSNumber+stdint.h>\n#import <PebbleKit/PBWatch+Sports.h>\n#import <PebbleKit/PBWatch+Golf.h>\n#import <PebbleKit/PBBitmap.h>\n#import <PebbleKit/PBDataLoggingService.h>\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/gtypes.h",
    "content": "//\n//  gtypes.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#ifndef PebbleKit_gtypes_h\n#define PebbleKit_gtypes_h\n\ntypedef struct GSize {\n  int16_t w;\n  int16_t h;\n} GSize;\n\ntypedef struct GPoint {\n  int16_t x;\n  int16_t y;\n} GPoint;\n\ntypedef struct GRect {\n  GPoint origin;\n  GSize size;\n} GRect;\n\n#endif\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/CHMultiDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMultiDictionary.h\n \n Copyright (c) 2008-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n#import \"CHMutableDictionary.h\"\n\n/**\n @file CHMultiDictionary.h\n \n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> in which multiple values may be associated with a given key.\n */\n\n/**\n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> implementation, in which multiple values may be associated with a given key.\n \n A map is the same as a \"dictionary\", \"associative array\", etc. and consists of a unique set of keys and a collection of values. In a standard map, each key is associated with one value; in a multimap, more than one value may be associated with a given key. A multimap is appropriate for any situation in which one item may correspond to (map to) multiple values, such as a term in an book index and occurrences of that term, courses for which a student is registered, etc.\n \n The values for a key may or may not be ordered. This implementation does not maintain an ordering for objects associated with a key, nor does it allow for multiple occurrences of an object associated with the same key. Internally, this class uses an NSMutableDictionary, and the associated values for each key are stored in distinct NSMutableSet instances. (Just as with NSDictionary, each key added to a CHMultiDictionary is copied using \\link NSCopying#copyWithZone: -copyWithZone:\\endlink and all keys must conform to the NSCopying protocol.) Objects are retained on insertion and released on removal or deallocation.\n \n Since NSDictionary and NSSet conform to the NSCoding protocol, any internal data can be serialized. However, NSSet cannot automatically be written to or read from a property list, since it has no specified order. Thus, instances of CHMultiDictionary must be encoded as an NSData object before saving to disk.\n \n Currently, this implementation does not support key-value coding, observing, or binding like NSDictionary does. Consequently, the distinction between \"object\" and \"value\" is blurrier, although hopefully consistent with the Cocoa APIs in general....\n \n Unlike NSDictionary and other Cocoa collections, CHMultiDictionary has not been designed with mutable and immutable variants. A multimap is not that much more useful if it is immutable, so any copies made of this class are mutable by definition.\n */\n@interface CHMultiDictionary : CHMutableDictionary {\n\tNSUInteger objectCount; // Number of objects currently in the dictionary.\n}\n\n#pragma mark Querying Contents\n\n/**\n Returns the number of objects in the receiver, associated with any key.\n \n @return The number of objects in the receiver. This is the sum total of objects associated with each key in the dictonary.\n \n @see allObjects\n */\n- (NSUInteger) countForAllKeys;\n\n/**\n Returns the number of objects associated with a given key.\n \n @param aKey The key for which to return the object count.\n @return The number of objects associated with a given key in the dictionary.\n \n @see objectsForKey:\n */\n- (NSUInteger) countForKey:(id)aKey;\n\n/**\n Returns an array of objects associated with a given key.\n \n @param aKey The key for which to return the corresponding objects.\n @return An NSSet of objects associated with a given key, or nil if the key is not in the receiver.\n \n @see countForKey:\n @see removeObjectsForKey:\n */\n- (NSSet*) objectsForKey:(id)aKey;\n\n#pragma mark Modifying Contents\n\n/**\n Adds a given object to an entry for a given key in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param anObject An object to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#addObject: -[NSMutableSet addObject:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObject:(id)anObject forKey:(id)aKey;\n\n/**\n Adds the given object(s) to a key entry in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param objectSet A set of objects to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#unionSet: -[NSMutableSet unionSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n/**\n Remove @b all occurrences of @a anObject associated with a given key.\n \n @param aKey The key for which to remove an entry.\n @param anObject An object (possibly) associated with @a aKey in the receiver. Objects are considered to be equal if -compare: returns NSOrderedSame.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n If @a aKey does not exist in the receiver, or if @a anObject is not associated with @a aKey, the contents of the receiver are not modified.\n \n @see containsObject\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) removeObject:(id)anObject forKey:(id)aKey;\n\n/**\n Remove a given key and its associated value(s) from the receiver.\n \n @param aKey The key for which to remove an entry.\n \n If @a aKey does not exist in the receiver, there is no effect on the receiver.\n \n @see objectsForKey:\n @see removeObject:forKey:\n */\n- (void) removeObjectsForKey:(id)aKey;\n\n/**\n Sets the object(s) associated with a key entry in the receiver.\n \n @param aKey The key with which to associate the objects in @a objectSet.\n @param objectSet A set of objects to associate with @a key. If @a objectSet is empty, the contents of the receiver are not modified. If an entry for @a key already exists in the receiver, @a objectSet is added using \\link NSMutableSet#setSet: -[NSMutableSet setSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) setObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/CHMutableDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMutableDictionary.h\n \n Copyright (c) 2009-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n__attribute__((visibility(\"hidden\"))) void createCollectableCFMutableDictionary(CFMutableDictionaryRef* dictionary, NSUInteger initialCapacity);\n\n/**\n @file CHMutableDictionary.h\n \n A mutable dictionary class.\n */\n\n/**\n A mutable dictionary class.\n \n A CFMutableDictionaryRef is used internally to store the key-value pairs. Subclasses may choose to add other instance variables to enable a specific ordering of keys, override methods to modify behavior, and add methods to extend existing behaviors. However, all subclasses should behave like a standard Cocoa dictionary as much as possible, and document clearly when they do not.\n \n @note Any method inherited from NSDictionary or NSMutableDictionary is supported by this class and its children. Please see the documentation for those classes for details.\n \n @todo Implement @c -copy and @c -mutableCopy differently (so users can actually obtain an immutable copy) and make mutation methods aware of immutability?\n */\n@interface CHMutableDictionary : NSMutableDictionary {\n  CFMutableDictionaryRef dictionary; // A Core Foundation dictionary.\n}\n\n- (id) initWithCapacity:(NSUInteger)numItems;\n\n- (NSUInteger) count;\n- (NSEnumerator*) keyEnumerator;\n- (id) objectForKey:(id)aKey;\n- (void) removeAllObjects;\n- (void) removeObjectForKey:(id)aKey;\n- (void) setObject:(id)anObject forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/DDASLLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import <asl.h>\n\n#import \"DDLog.h\"\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for the Apple System Log facility.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log\n * - StdErr (if stderr is a TTY) so log statements show up in Xcode console\n * \n * To duplicate NSLog() functionality you can simply add this logger and a tty logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use a file logger and a tty logger.\n**/\n\n@interface DDASLLogger : DDAbstractLogger <DDLogger>\n{\n    aslclient client;\n}\n\n+ (instancetype)sharedInstance;\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/DDFileLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"DDLog.h\"\n\n@class DDLogFileInfo;\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger to write log statements to a file.\n**/\n\n\n// Default configuration and safety/sanity values.\n// \n// maximumFileSize         -> DEFAULT_LOG_MAX_FILE_SIZE\n// rollingFrequency        -> DEFAULT_LOG_ROLLING_FREQUENCY\n// maximumNumberOfLogFiles -> DEFAULT_LOG_MAX_NUM_LOG_FILES\n// \n// You should carefully consider the proper configuration values for your application.\n\n#define DEFAULT_LOG_MAX_FILE_SIZE     (1024 * 1024)   //  1 MB\n#define DEFAULT_LOG_ROLLING_FREQUENCY (60 * 60 * 24)  // 24 Hours\n#define DEFAULT_LOG_MAX_NUM_LOG_FILES (5)             //  5 Files\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// The LogFileManager protocol is designed to allow you to control all aspects of your log files.\n// \n// The primary purpose of this is to allow you to do something with the log files after they have been rolled.\n// Perhaps you want to compress them to save disk space.\n// Perhaps you want to upload them to an FTP server.\n// Perhaps you want to run some analytics on the file.\n// \n// A default LogFileManager is, of course, provided.\n// The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property.\n// \n// This protocol provides various methods to fetch the list of log files.\n// \n// There are two variants: sorted and unsorted.\n// If sorting is not necessary, the unsorted variant is obviously faster.\n// The sorted variant will return an array sorted by when the log files were created,\n// with the most recently created log file at index 0, and the oldest log file at the end of the array.\n// \n// You can fetch only the log file paths (full path including name), log file names (name only),\n// or an array of DDLogFileInfo objects.\n// The DDLogFileInfo class is documented below, and provides a handy wrapper that\n// gives you easy access to various file attributes such as the creation date or the file size.\n\n@protocol DDLogFileManager <NSObject>\n@required\n\n// Public properties\n\n/**\n * The maximum number of archived log files to keep on disk.\n * For example, if this property is set to 3,\n * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk.\n * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted.\n * \n * You may optionally disable deleting old/rolled/archived log files by setting this property to zero.\n**/\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n// Public methods\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n// Private methods (only to be used by DDFileLogger)\n\n- (NSString *)createNewLogFile;\n\n@optional\n\n// Notifications from DDFileLogger\n\n- (void)didArchiveLogFile:(NSString *)logFilePath;\n- (void)didRollAndArchiveLogFile:(NSString *)logFilePath;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Default log file manager.\n * \n * All log files are placed inside the logsDirectory.\n * If a specific logsDirectory isn't specified, the default directory is used.\n * On Mac, this is in ~/Library/Logs/<Application Name>.\n * On iPhone, this is in ~/Library/Caches/Logs.\n * \n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n * \n * Archived log files are automatically deleted according to the maximumNumberOfLogFiles property.\n**/\n@interface DDLogFileManagerDefault : NSObject <DDLogFileManager>\n{\n    NSUInteger maximumNumberOfLogFiles;\n    NSString *_logsDirectory;\n}\n\n- (id)init;\n- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory;\n\n/*\n * Methods to override.\n *\n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n *\n * If you wish to change default filename, you can override following two methods.\n * - newLogFileName method would be called on new logfile creation.\n * - isLogFile: method would be called to filter logfiles from all other files in logsDirectory.\n *   You have to parse given filename and return YES if it is logFile.\n *\n * **NOTE**\n * newLogFileName returns filename. If appropriate file already exists, number would be added\n * to filename before extension. You have to handle this case in isLogFile: method.\n *\n * Example:\n * - newLogFileName returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 2.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03 1.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 3.log\" would be created.\n**/\n- (NSString *)newLogFileName;\n- (BOOL)isLogFile:(NSString *)fileName;\n\n/* Inherited from DDLogFileManager protocol:\n\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n*/\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Most users will want file log messages to be prepended with the date and time.\n * Rather than forcing the majority of users to write their own formatter,\n * we will supply a logical default formatter.\n * Users can easily replace this formatter with their own by invoking the setLogFormatter method.\n * It can also be removed by calling setLogFormatter, and passing a nil parameter.\n * \n * In addition to the convenience of having a logical default formatter,\n * it will also provide a template that makes it easy for developers to copy and change.\n**/\n@interface DDLogFileFormatterDefault : NSObject <DDLogFormatter>\n{\n    NSDateFormatter *dateFormatter;\n}\n\n- (id)init;\n- (instancetype)initWithDateFormatter:(NSDateFormatter *)dateFormatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDFileLogger : DDAbstractLogger <DDLogger>\n{\n    __strong id <DDLogFileManager> logFileManager;\n    \n    DDLogFileInfo *currentLogFileInfo;\n    NSFileHandle *currentLogFileHandle;\n    \n    dispatch_source_t currentLogFileVnode;\n    dispatch_source_t rollingTimer;\n    \n    unsigned long long maximumFileSize;\n    NSTimeInterval rollingFrequency;\n}\n\n- (id)init;\n- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)logFileManager;\n\n/**\n * Log File Rolling:\n * \n * maximumFileSize:\n *   The approximate maximum size to allow log files to grow.\n *   If a log file is larger than this value after a log statement is appended,\n *   then the log file is rolled.\n * \n * rollingFrequency\n *   How often to roll the log file.\n *   The frequency is given as an NSTimeInterval, which is a double that specifies the interval in seconds.\n *   Once the log file gets to be this old, it is rolled.\n * \n * Both the maximumFileSize and the rollingFrequency are used to manage rolling.\n * Whichever occurs first will cause the log file to be rolled.\n * \n * For example:\n * The rollingFrequency is 24 hours,\n * but the log file surpasses the maximumFileSize after only 20 hours.\n * The log file will be rolled at that 20 hour mark.\n * A new log file will be created, and the 24 hour timer will be restarted.\n * \n * You may optionally disable rolling due to filesize by setting maximumFileSize to zero.\n * If you do so, rolling is based solely on rollingFrequency.\n * \n * You may optionally disable rolling due to time by setting rollingFrequency to zero (or any non-positive number).\n * If you do so, rolling is based solely on maximumFileSize.\n * \n * If you disable both maximumFileSize and rollingFrequency, then the log file won't ever be rolled.\n * This is strongly discouraged.\n**/\n@property (readwrite, assign) unsigned long long maximumFileSize;\n@property (readwrite, assign) NSTimeInterval rollingFrequency;\n\n/**\n * The DDLogFileManager instance can be used to retrieve the list of log files,\n * and configure the maximum number of archived log files to keep.\n * \n * @see DDLogFileManager.maximumNumberOfLogFiles\n**/\n@property (strong, nonatomic, readonly) id <DDLogFileManager> logFileManager;\n\n\n// You can optionally force the current log file to be rolled with this method.\n// CompletionBlock will be called on main queue.\n\n- (void)rollLogFileWithCompletionBlock:(void (^)())completionBlock;\n\n// Method is deprecated. Use rollLogFileWithCompletionBlock: method instead.\n\n- (void)rollLogFile __attribute((deprecated));\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * DDLogFileInfo is a simple class that provides access to various file attributes.\n * It provides good performance as it only fetches the information if requested,\n * and it caches the information to prevent duplicate fetches.\n * \n * It was designed to provide quick snapshots of the current state of log files,\n * and to help sort log files in an array.\n * \n * This class does not monitor the files, or update it's cached attribute values if the file changes on disk.\n * This is not what the class was designed for.\n * \n * If you absolutely must get updated values,\n * you can invoke the reset method which will clear the cache.\n**/\n@interface DDLogFileInfo : NSObject\n{\n    __strong NSString *filePath;\n    __strong NSString *fileName;\n    \n    __strong NSDictionary *fileAttributes;\n    \n    __strong NSDate *creationDate;\n    __strong NSDate *modificationDate;\n    \n    unsigned long long fileSize;\n}\n\n@property (strong, nonatomic, readonly) NSString *filePath;\n@property (strong, nonatomic, readonly) NSString *fileName;\n\n@property (strong, nonatomic, readonly) NSDictionary *fileAttributes;\n\n@property (strong, nonatomic, readonly) NSDate *creationDate;\n@property (strong, nonatomic, readonly) NSDate *modificationDate;\n\n@property (nonatomic, readonly) unsigned long long fileSize;\n\n@property (nonatomic, readonly) NSTimeInterval age;\n\n@property (nonatomic, readwrite) BOOL isArchived;\n\n+ (instancetype)logFileWithPath:(NSString *)filePath;\n\n- (instancetype)initWithFilePath:(NSString *)filePath;\n\n- (void)reset;\n- (void)renameFile:(NSString *)newFileName;\n\n#if TARGET_IPHONE_SIMULATOR\n\n// So here's the situation.\n// Extended attributes are perfect for what we're trying to do here (marking files as archived).\n// This is exactly what extended attributes were designed for.\n// \n// But Apple screws us over on the simulator.\n// Everytime you build-and-go, they copy the application into a new folder on the hard drive,\n// and as part of the process they strip extended attributes from our log files.\n// Normally, a copy of a file preserves extended attributes.\n// So obviously Apple has gone to great lengths to piss us off.\n// \n// Thus we use a slightly different tactic for marking log files as archived in the simulator.\n// That way it \"just works\" and there's no confusion when testing.\n// \n// The difference in method names is indicative of the difference in functionality.\n// On the simulator we add an attribute by appending a filename extension.\n// \n// For example:\n// log-ABC123.txt -> log-ABC123.archived.txt\n\n- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName;\n\n- (void)addExtensionAttributeWithName:(NSString *)attrName;\n- (void)removeExtensionAttributeWithName:(NSString *)attrName;\n\n#else\n\n// Normal use of extended attributes used everywhere else,\n// such as on Macs and on iPhone devices.\n\n- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName;\n\n- (void)addExtendedAttributeWithName:(NSString *)attrName;\n- (void)removeExtendedAttributeWithName:(NSString *)attrName;\n\n#endif\n\n- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another;\n- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/DDLog.h",
    "content": "#import <Foundation/Foundation.h>\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * Otherwise, here is a quick refresher.\n * There are three steps to using the macros:\n * \n * Step 1:\n * Import the header in your implementation file:\n * \n * #import \"DDLog.h\"\n * \n * Step 2:\n * Define your logging level in your implementation file:\n * \n * // Log levels: off, error, warn, info, verbose\n * static const int ddLogLevel = LOG_LEVEL_VERBOSE;\n * \n * Step 2 [3rd party frameworks]:\n *\n * Define your LOG_LEVEL_DEF to a different variable/function than ddLogLevel:\n *\n * // #undef LOG_LEVEL_DEF // Undefine first only if needed\n * #define LOG_LEVEL_DEF myLibLogLevel\n *\n * Define your logging level in your implementation file:\n *\n * // Log levels: off, error, warn, info, verbose\n * static const int myLibLogLevel = LOG_LEVEL_VERBOSE;\n *\n * Step 3:\n * Replace your NSLog statements with DDLog statements according to the severity of the message.\n * \n * NSLog(@\"Fatal error, no dohickey found!\"); -> DDLogError(@\"Fatal error, no dohickey found!\");\n * \n * DDLog works exactly the same as NSLog.\n * This means you can pass it multiple variables just like NSLog.\n**/\n\n#ifndef LOG_LEVEL_DEF\n    #define LOG_LEVEL_DEF ddLogLevel\n#endif\n\n@class DDLogMessage;\n\n@protocol DDLogger;\n@protocol DDLogFormatter;\n\n/**\n * This is the single macro that all other macros below compile into.\n * This big multiline macro makes all the other macros easier to read.\n**/\n\n#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \\\n  [DDLog log:isAsynchronous                                             \\\n       level:lvl                                                        \\\n        flag:flg                                                        \\\n     context:ctx                                                        \\\n        file:__FILE__                                                   \\\n    function:fnct                                                       \\\n        line:__LINE__                                                   \\\n         tag:atag                                                       \\\n      format:(frmt), ##__VA_ARGS__]\n\n/**\n * Define the Objective-C and C versions of the macro.\n * These automatically inject the proper function name for either an objective-c method or c function.\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_OBJC_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MACRO(async, lvl, flg, ctx, nil, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MACRO(async, lvl, flg, ctx, nil, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define version of the macro that only execute if the logLevel is above the threshold.\n * The compiled versions essentially look like this:\n * \n * if (logFlagForThisLogMsg & ddLogLevel) { execute log message }\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels.\n * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques.\n * \n * Note that when compiler optimizations are enabled (as they are for your release builds),\n * the log messages above your logging threshold will automatically be compiled out.\n * \n * (If the compiler sees ddLogLevel declared as a constant, the compiler simply checks to see if the 'if' statement\n *  would execute, and if not it strips it from the binary.)\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define versions of the macros that also accept tags.\n * \n * The DDLogMessage object includes a 'tag' ivar that may be used for a variety of purposes.\n * It may be used to pass custom information to loggers or formatters.\n * Or it may be used by 3rd party extensions to the framework.\n * \n * Thes macros just make it a little easier to extend logging functionality.\n**/\n\n#define LOG_OBJC_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n                 LOG_MACRO(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n              LOG_MACRO(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n             LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n          LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n/**\n * Define the standard options.\n * \n * We default to only 4 levels because it makes it easier for beginners\n * to make the transition to a logging framework.\n * \n * More advanced users may choose to completely customize the levels (and level names) to suite their needs.\n * For more information on this see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n * \n * Advanced users may also notice that we're using a bitmask.\n * This is to allow for custom fine grained logging:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/FineGrainedLogging\n * \n * -- Flags --\n * \n * Typically you will use the LOG_LEVELS (see below), but the flags may be used directly in certain situations.\n * For example, say you have a lot of warning log messages, and you wanted to disable them.\n * However, you still needed to see your error and info log messages.\n * You could accomplish that with the following:\n * \n * static const int ddLogLevel = LOG_FLAG_ERROR | LOG_FLAG_INFO;\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * Flags may also be consulted when writing custom log formatters,\n * as the DDLogMessage class captures the individual flag that caused the log message to fire.\n * \n * -- Levels --\n * \n * Log levels are simply the proper bitmask of the flags.\n * \n * -- Booleans --\n * \n * The booleans may be used when your logging code involves more than one line.\n * For example:\n * \n * if (LOG_VERBOSE) {\n *     for (id sprocket in sprockets)\n *         DDLogVerbose(@\"sprocket: %@\", [sprocket description])\n * }\n * \n * -- Async --\n * \n * Defines the default asynchronous options.\n * The default philosophy for asynchronous logging is very simple:\n * \n * Log messages with errors should be executed synchronously.\n *     After all, an error just occurred. The application could be unstable.\n * \n * All other log messages, such as debug output, are executed asynchronously.\n *     After all, if it wasn't an error, then it was just informational output,\n *     or something the application was easily able to recover from.\n * \n * -- Changes --\n * \n * You are strongly discouraged from modifying this file.\n * If you do, you make it more difficult on yourself to merge future bug fixes and improvements from the project.\n * Instead, create your own MyLogging.h or ApplicationNameLogging.h or CompanyLogging.h\n * \n * For an example of customizing your logging experience, see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n**/\n\n#define LOG_FLAG_ERROR    (1 << 0)  // 0...00001\n#define LOG_FLAG_WARN     (1 << 1)  // 0...00010\n#define LOG_FLAG_INFO     (1 << 2)  // 0...00100\n#define LOG_FLAG_DEBUG    (1 << 3)  // 0...01000\n#define LOG_FLAG_VERBOSE  (1 << 4)  // 0...10000\n\n#define LOG_LEVEL_OFF     0\n#define LOG_LEVEL_ERROR   (LOG_FLAG_ERROR)                                                                          // 0...00001\n#define LOG_LEVEL_WARN    (LOG_FLAG_ERROR | LOG_FLAG_WARN)                                                          // 0...00011\n#define LOG_LEVEL_INFO    (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO)                                          // 0...00111\n#define LOG_LEVEL_DEBUG   (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG)                         // 0...01111\n#define LOG_LEVEL_VERBOSE (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG | LOG_FLAG_VERBOSE)      // 0...11111\n\n#define LOG_ERROR    (LOG_LEVEL_DEF & LOG_FLAG_ERROR)\n#define LOG_WARN     (LOG_LEVEL_DEF & LOG_FLAG_WARN)\n#define LOG_INFO     (LOG_LEVEL_DEF & LOG_FLAG_INFO)\n#define LOG_DEBUG    (LOG_LEVEL_DEF & LOG_FLAG_DEBUG)\n#define LOG_VERBOSE  (LOG_LEVEL_DEF & LOG_FLAG_VERBOSE)\n\n#define LOG_ASYNC_ENABLED YES\n\n#define LOG_ASYNC_ERROR    ( NO && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_WARN     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_INFO     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_DEBUG    (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_VERBOSE  (YES && LOG_ASYNC_ENABLED)\n\n#define DDLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogDebug(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define DDLogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogCDebug(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n/**\n * The THIS_FILE macro gives you an NSString of the file name.\n * For simplicity and clarity, the file name does not include the full path or file extension.\n * \n * For example: DDLogWarn(@\"%@: Unable to find thingy\", THIS_FILE) -> @\"MyViewController: Unable to find thingy\"\n**/\n\nNSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy);\n\n#define THIS_FILE (DDExtractFileNameWithoutExtension(__FILE__, NO))\n\n/**\n * The THIS_METHOD macro gives you the name of the current objective-c method.\n * \n * For example: DDLogWarn(@\"%@ - Requires non-nil strings\", THIS_METHOD) -> @\"setMake:model: requires non-nil strings\"\n * \n * Note: This does NOT work in straight C functions (non objective-c).\n * Instead you should use the predefined __FUNCTION__ macro.\n**/\n\n#define THIS_METHOD NSStringFromSelector(_cmd)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDLog : NSObject\n\n/**\n * Provides access to the underlying logging queue.\n * This may be helpful to Logger classes for things like thread synchronization.\n**/\n\n+ (dispatch_queue_t)loggingQueue;\n\n/**\n * Logging Primitive.\n * \n * This method is used by the macros above.\n * It is suggested you stick with the macros as they're easier to use.\n**/\n\n+ (void)log:(BOOL)synchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format, ... __attribute__ ((format (__NSString__, 9, 10)));\n\n/**\n * Logging Primitive.\n * \n * This method can be used if you have a prepared va_list.\n**/\n\n+ (void)log:(BOOL)asynchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format\n       args:(va_list)argList;\n\n\n/**\n * Since logging can be asynchronous, there may be times when you want to flush the logs.\n * The framework invokes this automatically when the application quits.\n**/\n\n+ (void)flushLog;\n\n/** \n * Loggers\n * \n * If you want your log statements to go somewhere,\n * you should create and add a logger.\n**/\n\n+ (void)addLogger:(id <DDLogger>)logger;    // adds the logger using maximum log level (LOG_LEVEL_VERBOSE)\n\n/**\n * Please use as logLevels the LOG_LEVEL_* macros\n *\n**/\n+ (void)addLogger:(id <DDLogger>)logger withLogLevel:(int)logLevel;\n\n+ (void)removeLogger:(id <DDLogger>)logger;\n+ (void)removeAllLoggers;\n\n/**\n * Registered Dynamic Logging\n * \n * These methods allow you to obtain a list of classes that are using registered dynamic logging,\n * and also provides methods to get and set their log level during run time.\n**/\n\n+ (NSArray *)registeredClasses;\n+ (NSArray *)registeredClassNames;\n\n+ (int)logLevelForClass:(Class)aClass;\n+ (int)logLevelForClassWithName:(NSString *)aClassName;\n\n+ (void)setLogLevel:(int)logLevel forClass:(Class)aClass;\n+ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogger <NSObject>\n@required\n\n- (void)logMessage:(DDLogMessage *)logMessage;\n\n/**\n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n**/\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@optional\n\n/**\n * Since logging is asynchronous, adding and removing loggers is also asynchronous.\n * In other words, the loggers are added and removed at appropriate times with regards to log messages.\n * \n * - Loggers will not receive log messages that were executed prior to when they were added.\n * - Loggers will not receive log messages that were executed after they were removed.\n * \n * These methods are executed in the logging thread/queue.\n * This is the same thread/queue that will execute every logMessage: invocation.\n * Loggers may use these methods for thread synchronization or other setup/teardown tasks.\n**/\n- (void)didAddLogger;\n- (void)willRemoveLogger;\n\n/**\n * Some loggers may buffer IO for optimization purposes.\n * For example, a database logger may only save occasionaly as the disk IO is slow.\n * In such loggers, this method should be implemented to flush any pending IO.\n * \n * This allows invocations of DDLog's flushLog method to be propogated to loggers that need it.\n * \n * Note that DDLog's flushLog method is invoked automatically when the application quits,\n * and it may be also invoked manually by the developer prior to application crashes, or other such reasons.\n**/\n- (void)flush;\n\n/**\n * Each logger is executed concurrently with respect to the other loggers.\n * Thus, a dedicated dispatch queue is used for each logger.\n * Logger implementations may optionally choose to provide their own dispatch queue.\n**/\n- (dispatch_queue_t)loggerQueue;\n\n/**\n * If the logger implementation does not choose to provide its own queue,\n * one will automatically be created for it.\n * The created queue will receive its name from this method.\n * This may be helpful for debugging or profiling reasons.\n**/\n- (NSString *)loggerName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogFormatter <NSObject>\n@required\n\n/**\n * Formatters may optionally be added to any logger.\n * This allows for increased flexibility in the logging environment.\n * For example, log messages for log files may be formatted differently than log messages for the console.\n * \n * For more information about formatters, see the \"Custom Formatters\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The formatter may also optionally filter the log message by returning nil,\n * in which case the logger will not log the message.\n**/\n- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;\n\n@optional\n\n/**\n * A single formatter instance can be added to multiple loggers.\n * These methods provides hooks to notify the formatter of when it's added/removed.\n *\n * This is primarily for thread-safety.\n * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers.\n * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter),\n * it could possibly use these hooks to switch to thread-safe versions of the code.\n**/\n- (void)didAddToLogger:(id <DDLogger>)logger;\n- (void)willRemoveFromLogger:(id <DDLogger>)logger;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDRegisteredDynamicLogging\n\n/**\n * Implement these methods to allow a file's log level to be managed from a central location.\n * \n * This is useful if you'd like to be able to change log levels for various parts\n * of your code from within the running application.\n * \n * Imagine pulling up the settings for your application,\n * and being able to configure the logging level on a per file basis.\n * \n * The implementation can be very straight-forward:\n * \n * + (int)ddLogLevel\n * {\n *     return ddLogLevel;\n * }\n *  \n * + (void)ddSetLogLevel:(int)logLevel\n * {\n *     ddLogLevel = logLevel;\n * }\n**/\n\n+ (int)ddLogLevel;\n+ (void)ddSetLogLevel:(int)logLevel;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogMessage class encapsulates information about the log message.\n * If you write custom loggers or formatters, you will be dealing with objects of this class.\n**/\n\nenum {\n    DDLogMessageCopyFile     = 1 << 0,\n    DDLogMessageCopyFunction = 1 << 1\n};\ntypedef int DDLogMessageOptions;\n\n@interface DDLogMessage : NSObject <NSCopying>\n{\n\n// The public variables below can be accessed directly (for speed).\n// For example: logMessage->logLevel\n    \n@public\n    int logLevel;\n    int logFlag;\n    int logContext;\n    NSString *logMsg;\n    NSDate *timestamp;\n    char *file;\n    char *function;\n    int lineNumber;\n    mach_port_t machThreadID;\n    char *queueLabel;\n    NSString *threadName;\n    \n    // For 3rd party extensions to the framework, where flags and contexts aren't enough.\n    id tag;\n    \n    // For 3rd party extensions that manually create DDLogMessage instances.\n    DDLogMessageOptions options;\n}\n\n/**\n * Standard init method for a log message object.\n * Used by the logging primitives. (And the macros use the logging primitives.)\n * \n * If you find need to manually create logMessage objects, there is one thing you should be aware of:\n * \n * If no flags are passed, the method expects the file and function parameters to be string literals.\n * That is, it expects the given strings to exist for the duration of the object's lifetime,\n * and it expects the given strings to be immutable.\n * In other words, it does not copy these strings, it simply points to them.\n * This is due to the fact that __FILE__ and __FUNCTION__ are usually used to specify these parameters,\n * so it makes sense to optimize and skip the unnecessary allocations.\n * However, if you need them to be copied you may use the options parameter to specify this.\n * Options is a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction.\n**/\n- (instancetype)initWithLogMsg:(NSString *)logMsg\n                         level:(int)logLevel\n                          flag:(int)logFlag\n                       context:(int)logContext\n                          file:(const char *)file\n                      function:(const char *)function\n                          line:(int)line\n                           tag:(id)tag\n                       options:(DDLogMessageOptions)optionsMask;\n\n/**\n * Returns the threadID as it appears in NSLog.\n * That is, it is a hexadecimal value which is calculated from the machThreadID.\n**/\n- (NSString *)threadID;\n\n/**\n * Convenience property to get just the file name, as the file variable is generally the full file path.\n * This method does not include the file extension, which is generally unwanted for logging purposes.\n**/\n- (NSString *)fileName;\n\n/**\n * Returns the function variable in NSString form.\n**/\n- (NSString *)methodName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogger protocol specifies that an optional formatter can be added to a logger.\n * Most (but not all) loggers will want to support formatters.\n * \n * However, writting getters and setters in a thread safe manner,\n * while still maintaining maximum speed for the logging process, is a difficult task.\n * \n * To do it right, the implementation of the getter/setter has strict requiremenets:\n * - Must NOT require the logMessage method to acquire a lock.\n * - Must NOT require the logMessage method to access an atomic property (also a lock of sorts).\n * \n * To simplify things, an abstract logger is provided that implements the getter and setter.\n * \n * Logger implementations may simply extend this class,\n * and they can ACCESS THE FORMATTER VARIABLE DIRECTLY from within their logMessage method!\n**/\n\n@interface DDAbstractLogger : NSObject <DDLogger>\n{\n    id <DDLogFormatter> formatter;\n    \n    dispatch_queue_t loggerQueue;\n}\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n// For thread-safety assertions\n- (BOOL)isOnGlobalLoggingQueue;\n- (BOOL)isOnInternalLoggerQueue;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/DDTTYLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#if TARGET_OS_IPHONE\n#import <UIKit/UIColor.h>   // iOS\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n#import <AppKit/NSColor.h>  // OS X with AppKit\n#else\n#import \"CLIColor.h\"        // OS X without AppKit\n#endif\n\n#import \"DDLog.h\"\n\n#define LOG_CONTEXT_ALL INT_MAX\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for Terminal output or Xcode console output,\n * depending on where you are running your code.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log (so it shows up in Console.app)\n * - StdErr (if stderr is a TTY, so log statements show up in Xcode console)\n * \n * To duplicate NSLog() functionality you can simply add this logger and an asl logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use only a file logger and a tty logger.\n**/\n\n@interface DDTTYLogger : DDAbstractLogger <DDLogger>\n{\n    NSCalendar *calendar;\n    NSUInteger calendarUnitFlags;\n    \n    NSString *appName;\n    char *app;\n    size_t appLen;\n    \n    NSString *processID;\n    char *pid;\n    size_t pidLen;\n    \n    BOOL colorsEnabled;\n    NSMutableArray *colorProfilesArray;\n    NSMutableDictionary *colorProfilesDict;\n}\n\n+ (instancetype)sharedInstance;\n\n/* Inherited from the DDLogger protocol:\n * \n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n * \n * More information about formatters can be found here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The actual implementation of these methods is inherited from DDAbstractLogger.\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n \n*/\n\n/**\n * Want to use different colors for different log levels?\n * Enable this property.\n * \n * If you run the application via the Terminal (not Xcode),\n * the logger will map colors to xterm-256color or xterm-color (if available).\n * \n * Xcode does NOT natively support colors in the Xcode debugging console.\n * You'll need to install the XcodeColors plugin to see colors in the Xcode console.\n * https://github.com/robbiehanson/XcodeColors\n * \n * The default value if NO.\n**/\n@property (readwrite, assign) BOOL colorsEnabled;\n\n/**\n * The default color set (foregroundColor, backgroundColor) is:\n * \n * - LOG_FLAG_ERROR = (red, nil)\n * - LOG_FLAG_WARN  = (orange, nil)\n * \n * You can customize the colors however you see fit.\n * Please note that you are passing a flag, NOT a level.\n * \n * GOOD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_FLAG_INFO];  // <- Good :)\n *  BAD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_LEVEL_INFO]; // <- BAD! :(\n * \n * LOG_FLAG_INFO  = 0...00100\n * LOG_LEVEL_INFO = 0...00111 <- Would match LOG_FLAG_INFO and LOG_FLAG_WARN and LOG_FLAG_ERROR\n * \n * If you run the application within Xcode, then the XcodeColors plugin is required.\n * \n * If you run the application from a shell, then DDTTYLogger will automatically map the given color to\n * the closest available color. (xterm-256color or xterm-color which have 256 and 16 supported colors respectively.)\n * \n * This method invokes setForegroundColor:backgroundColor:forFlag:context: and applies it to `LOG_CONTEXT_ALL`.\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask;\n#endif\n\n/**\n * Just like setForegroundColor:backgroundColor:flag, but allows you to specify a particular logging context.\n * \n * A logging context is often used to identify log messages coming from a 3rd party framework,\n * although logging context's can be used for many different functions.\n * \n * Use LOG_CONTEXT_ALL to set the deafult color for all contexts that have no specific color set defined.\n * \n * Logging context's are explained in further detail here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomContext\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#endif\n\n/**\n * Similar to the methods above, but allows you to map DDLogMessage->tag to a particular color profile.\n * For example, you could do something like this:\n * \n * static NSString *const PurpleTag = @\"PurpleTag\";\n * \n * #define DDLogPurple(frmt, ...) LOG_OBJC_TAG_MACRO(NO, 0, 0, 0, PurpleTag, frmt, ##__VA_ARGS__)\n * \n * And then in your applicationDidFinishLaunching, or wherever you configure Lumberjack:\n * \n * #if TARGET_OS_IPHONE\n *   UIColor *purple = [UIColor colorWithRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n * #else\n *   NSColor *purple = [NSColor colorWithCalibratedRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n *\n * Note: For CLI OS X projects that don't link with AppKit use CLIColor objects instead\n * \n * [[DDTTYLogger sharedInstance] setForegroundColor:purple backgroundColor:nil forTag:PurpleTag];\n * [DDLog addLogger:[DDTTYLogger sharedInstance]];\n * \n * This would essentially give you a straight NSLog replacement that prints in purple:\n * \n * DDLogPurple(@\"I'm a purple log message!\");\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forTag:(id <NSCopying>)tag;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forTag:(id <NSCopying>)tag;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forTag:(id <NSCopying>)tag;\n#endif\n\n/**\n * Clearing color profiles.\n**/\n- (void)clearColorsForFlag:(int)mask;\n- (void)clearColorsForFlag:(int)mask context:(int)context;\n- (void)clearColorsForTag:(id <NSCopying>)tag;\n- (void)clearColorsForAllFlags;\n- (void)clearColorsForAllTags;\n- (void)clearAllColors;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/NSJSONSerialization+ObjectWithNString.h",
    "content": "//\n//  NSJSONSerialization+ObjectWithNString.h\n//  Ejecta\n//\n//  Created by matth on 7/19/13.\n//\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (ObjectWithNString)\n+ (id)JSONObjectWithString:(NSString *)string options:(NSJSONReadingOptions)opt error:(NSError **)error;\n+ (NSString*)stringWithNSDictionary:(NSDictionary*)dictionary;\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/NSJSONSerialization+PBJSONHelpers.h",
    "content": "//\n//  NSJSONSerialization+PBJSONHelpers.h\n//  PebbleVendor\n//\n//  Created by matth on 9/17/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (PBJSONHelpers)\n\n/** @name Reflection helpers */\n\n/**\n * Derived from the Box SDK (MIT license) NSJSONSerialization+BoxAdditions...\n * https://github.com/box/box-ios-sdk-v2/tree/master/BoxSDK/Categories\n \n * Ensure that the object at `key` in `dictionary` is a member of the expected class.\n * `NSNull` may be specified as an allowable value. This method may return nil if `key`\n * is not present in `dictionary`.\n *\n * @param key The key to lookup in `dictionary`.\n * @param dictionary A dictionary resulting from deserializing a JSON object.\n * @param cls The expected class of the value at key.\n * @param nullAllowed If true, `NSNull` will be returned. If not, NSNull will be converted to nil. Property getters that pass `YES` for this parameter should have the return type of `id`.\n *\n * @return The object at `key` in `dictionary` if expectations are satisfied; `nil` otherwise.\n */\n+ (id)ensureObjectForKey:(NSString *)key inDictionary:(NSDictionary *)dictionary hasExpectedType:(Class)cls nullAllowed:(BOOL)nullAllowed;\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/NSString+HexData.h",
    "content": "//\n//  NSString+HexData.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 11/19/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSString (HexData)\n\n- (NSData*)hexData;\n\n@end\n\n\n@interface NSData (HexString)\n\n- (NSString*)hexString;\n\n@end"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/UIDevice-Hardware.h",
    "content": "/*\n Erica Sadun, http://ericasadun.com\n iPhone Developer's Cookbook, 6.x Edition\n BSD License, Use at your own risk\n */\n\n#import <UIKit/UIKit.h>\n\ntypedef enum {\n    UIDeviceFamilyiPhone,\n    UIDeviceFamilyiPod,\n    UIDeviceFamilyiPad,\n    UIDeviceFamilyAppleTV,\n    UIDeviceFamilyUnknown,\n    \n} UIDeviceFamily;\n\n@interface UIDevice (Hardware)\n- (NSString *) platform;\n- (NSString *) hwmodel;\n- (NSString *) platformString;\n\n- (NSUInteger) cpuFrequency;\n- (NSUInteger) busFrequency;\n- (NSUInteger) cpuCount;\n- (NSUInteger) totalMemory;\n- (NSUInteger) userMemory;\n\n- (NSNumber *) totalDiskSpace;\n- (NSNumber *) freeDiskSpace;\n\n- (NSString *) macaddress;\n\n- (BOOL) hasRetinaDisplay;\n- (BOOL) hasBluetoothMAP;\n- (UIDeviceFamily) deviceFamily;\n@end"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/CHMultiDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMultiDictionary.h\n \n Copyright (c) 2008-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n#import \"CHMutableDictionary.h\"\n\n/**\n @file CHMultiDictionary.h\n \n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> in which multiple values may be associated with a given key.\n */\n\n/**\n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> implementation, in which multiple values may be associated with a given key.\n \n A map is the same as a \"dictionary\", \"associative array\", etc. and consists of a unique set of keys and a collection of values. In a standard map, each key is associated with one value; in a multimap, more than one value may be associated with a given key. A multimap is appropriate for any situation in which one item may correspond to (map to) multiple values, such as a term in an book index and occurrences of that term, courses for which a student is registered, etc.\n \n The values for a key may or may not be ordered. This implementation does not maintain an ordering for objects associated with a key, nor does it allow for multiple occurrences of an object associated with the same key. Internally, this class uses an NSMutableDictionary, and the associated values for each key are stored in distinct NSMutableSet instances. (Just as with NSDictionary, each key added to a CHMultiDictionary is copied using \\link NSCopying#copyWithZone: -copyWithZone:\\endlink and all keys must conform to the NSCopying protocol.) Objects are retained on insertion and released on removal or deallocation.\n \n Since NSDictionary and NSSet conform to the NSCoding protocol, any internal data can be serialized. However, NSSet cannot automatically be written to or read from a property list, since it has no specified order. Thus, instances of CHMultiDictionary must be encoded as an NSData object before saving to disk.\n \n Currently, this implementation does not support key-value coding, observing, or binding like NSDictionary does. Consequently, the distinction between \"object\" and \"value\" is blurrier, although hopefully consistent with the Cocoa APIs in general....\n \n Unlike NSDictionary and other Cocoa collections, CHMultiDictionary has not been designed with mutable and immutable variants. A multimap is not that much more useful if it is immutable, so any copies made of this class are mutable by definition.\n */\n@interface CHMultiDictionary : CHMutableDictionary {\n\tNSUInteger objectCount; // Number of objects currently in the dictionary.\n}\n\n#pragma mark Querying Contents\n\n/**\n Returns the number of objects in the receiver, associated with any key.\n \n @return The number of objects in the receiver. This is the sum total of objects associated with each key in the dictonary.\n \n @see allObjects\n */\n- (NSUInteger) countForAllKeys;\n\n/**\n Returns the number of objects associated with a given key.\n \n @param aKey The key for which to return the object count.\n @return The number of objects associated with a given key in the dictionary.\n \n @see objectsForKey:\n */\n- (NSUInteger) countForKey:(id)aKey;\n\n/**\n Returns an array of objects associated with a given key.\n \n @param aKey The key for which to return the corresponding objects.\n @return An NSSet of objects associated with a given key, or nil if the key is not in the receiver.\n \n @see countForKey:\n @see removeObjectsForKey:\n */\n- (NSSet*) objectsForKey:(id)aKey;\n\n#pragma mark Modifying Contents\n\n/**\n Adds a given object to an entry for a given key in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param anObject An object to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#addObject: -[NSMutableSet addObject:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObject:(id)anObject forKey:(id)aKey;\n\n/**\n Adds the given object(s) to a key entry in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param objectSet A set of objects to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#unionSet: -[NSMutableSet unionSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n/**\n Remove @b all occurrences of @a anObject associated with a given key.\n \n @param aKey The key for which to remove an entry.\n @param anObject An object (possibly) associated with @a aKey in the receiver. Objects are considered to be equal if -compare: returns NSOrderedSame.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n If @a aKey does not exist in the receiver, or if @a anObject is not associated with @a aKey, the contents of the receiver are not modified.\n \n @see containsObject\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) removeObject:(id)anObject forKey:(id)aKey;\n\n/**\n Remove a given key and its associated value(s) from the receiver.\n \n @param aKey The key for which to remove an entry.\n \n If @a aKey does not exist in the receiver, there is no effect on the receiver.\n \n @see objectsForKey:\n @see removeObject:forKey:\n */\n- (void) removeObjectsForKey:(id)aKey;\n\n/**\n Sets the object(s) associated with a key entry in the receiver.\n \n @param aKey The key with which to associate the objects in @a objectSet.\n @param objectSet A set of objects to associate with @a key. If @a objectSet is empty, the contents of the receiver are not modified. If an entry for @a key already exists in the receiver, @a objectSet is added using \\link NSMutableSet#setSet: -[NSMutableSet setSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) setObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/CHMutableDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMutableDictionary.h\n \n Copyright (c) 2009-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n__attribute__((visibility(\"hidden\"))) void createCollectableCFMutableDictionary(CFMutableDictionaryRef* dictionary, NSUInteger initialCapacity);\n\n/**\n @file CHMutableDictionary.h\n \n A mutable dictionary class.\n */\n\n/**\n A mutable dictionary class.\n \n A CFMutableDictionaryRef is used internally to store the key-value pairs. Subclasses may choose to add other instance variables to enable a specific ordering of keys, override methods to modify behavior, and add methods to extend existing behaviors. However, all subclasses should behave like a standard Cocoa dictionary as much as possible, and document clearly when they do not.\n \n @note Any method inherited from NSDictionary or NSMutableDictionary is supported by this class and its children. Please see the documentation for those classes for details.\n \n @todo Implement @c -copy and @c -mutableCopy differently (so users can actually obtain an immutable copy) and make mutation methods aware of immutability?\n */\n@interface CHMutableDictionary : NSMutableDictionary {\n  CFMutableDictionaryRef dictionary; // A Core Foundation dictionary.\n}\n\n- (id) initWithCapacity:(NSUInteger)numItems;\n\n- (NSUInteger) count;\n- (NSEnumerator*) keyEnumerator;\n- (id) objectForKey:(id)aKey;\n- (void) removeAllObjects;\n- (void) removeObjectForKey:(id)aKey;\n- (void) setObject:(id)anObject forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/DDASLLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import <asl.h>\n\n#import \"DDLog.h\"\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for the Apple System Log facility.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log\n * - StdErr (if stderr is a TTY) so log statements show up in Xcode console\n * \n * To duplicate NSLog() functionality you can simply add this logger and a tty logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use a file logger and a tty logger.\n**/\n\n@interface DDASLLogger : DDAbstractLogger <DDLogger>\n{\n    aslclient client;\n}\n\n+ (instancetype)sharedInstance;\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/DDFileLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"DDLog.h\"\n\n@class DDLogFileInfo;\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger to write log statements to a file.\n**/\n\n\n// Default configuration and safety/sanity values.\n// \n// maximumFileSize         -> DEFAULT_LOG_MAX_FILE_SIZE\n// rollingFrequency        -> DEFAULT_LOG_ROLLING_FREQUENCY\n// maximumNumberOfLogFiles -> DEFAULT_LOG_MAX_NUM_LOG_FILES\n// \n// You should carefully consider the proper configuration values for your application.\n\n#define DEFAULT_LOG_MAX_FILE_SIZE     (1024 * 1024)   //  1 MB\n#define DEFAULT_LOG_ROLLING_FREQUENCY (60 * 60 * 24)  // 24 Hours\n#define DEFAULT_LOG_MAX_NUM_LOG_FILES (5)             //  5 Files\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// The LogFileManager protocol is designed to allow you to control all aspects of your log files.\n// \n// The primary purpose of this is to allow you to do something with the log files after they have been rolled.\n// Perhaps you want to compress them to save disk space.\n// Perhaps you want to upload them to an FTP server.\n// Perhaps you want to run some analytics on the file.\n// \n// A default LogFileManager is, of course, provided.\n// The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property.\n// \n// This protocol provides various methods to fetch the list of log files.\n// \n// There are two variants: sorted and unsorted.\n// If sorting is not necessary, the unsorted variant is obviously faster.\n// The sorted variant will return an array sorted by when the log files were created,\n// with the most recently created log file at index 0, and the oldest log file at the end of the array.\n// \n// You can fetch only the log file paths (full path including name), log file names (name only),\n// or an array of DDLogFileInfo objects.\n// The DDLogFileInfo class is documented below, and provides a handy wrapper that\n// gives you easy access to various file attributes such as the creation date or the file size.\n\n@protocol DDLogFileManager <NSObject>\n@required\n\n// Public properties\n\n/**\n * The maximum number of archived log files to keep on disk.\n * For example, if this property is set to 3,\n * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk.\n * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted.\n * \n * You may optionally disable deleting old/rolled/archived log files by setting this property to zero.\n**/\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n// Public methods\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n// Private methods (only to be used by DDFileLogger)\n\n- (NSString *)createNewLogFile;\n\n@optional\n\n// Notifications from DDFileLogger\n\n- (void)didArchiveLogFile:(NSString *)logFilePath;\n- (void)didRollAndArchiveLogFile:(NSString *)logFilePath;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Default log file manager.\n * \n * All log files are placed inside the logsDirectory.\n * If a specific logsDirectory isn't specified, the default directory is used.\n * On Mac, this is in ~/Library/Logs/<Application Name>.\n * On iPhone, this is in ~/Library/Caches/Logs.\n * \n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n * \n * Archived log files are automatically deleted according to the maximumNumberOfLogFiles property.\n**/\n@interface DDLogFileManagerDefault : NSObject <DDLogFileManager>\n{\n    NSUInteger maximumNumberOfLogFiles;\n    NSString *_logsDirectory;\n}\n\n- (id)init;\n- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory;\n\n/*\n * Methods to override.\n *\n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n *\n * If you wish to change default filename, you can override following two methods.\n * - newLogFileName method would be called on new logfile creation.\n * - isLogFile: method would be called to filter logfiles from all other files in logsDirectory.\n *   You have to parse given filename and return YES if it is logFile.\n *\n * **NOTE**\n * newLogFileName returns filename. If appropriate file already exists, number would be added\n * to filename before extension. You have to handle this case in isLogFile: method.\n *\n * Example:\n * - newLogFileName returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 2.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03 1.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 3.log\" would be created.\n**/\n- (NSString *)newLogFileName;\n- (BOOL)isLogFile:(NSString *)fileName;\n\n/* Inherited from DDLogFileManager protocol:\n\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n*/\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Most users will want file log messages to be prepended with the date and time.\n * Rather than forcing the majority of users to write their own formatter,\n * we will supply a logical default formatter.\n * Users can easily replace this formatter with their own by invoking the setLogFormatter method.\n * It can also be removed by calling setLogFormatter, and passing a nil parameter.\n * \n * In addition to the convenience of having a logical default formatter,\n * it will also provide a template that makes it easy for developers to copy and change.\n**/\n@interface DDLogFileFormatterDefault : NSObject <DDLogFormatter>\n{\n    NSDateFormatter *dateFormatter;\n}\n\n- (id)init;\n- (instancetype)initWithDateFormatter:(NSDateFormatter *)dateFormatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDFileLogger : DDAbstractLogger <DDLogger>\n{\n    __strong id <DDLogFileManager> logFileManager;\n    \n    DDLogFileInfo *currentLogFileInfo;\n    NSFileHandle *currentLogFileHandle;\n    \n    dispatch_source_t currentLogFileVnode;\n    dispatch_source_t rollingTimer;\n    \n    unsigned long long maximumFileSize;\n    NSTimeInterval rollingFrequency;\n}\n\n- (id)init;\n- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)logFileManager;\n\n/**\n * Log File Rolling:\n * \n * maximumFileSize:\n *   The approximate maximum size to allow log files to grow.\n *   If a log file is larger than this value after a log statement is appended,\n *   then the log file is rolled.\n * \n * rollingFrequency\n *   How often to roll the log file.\n *   The frequency is given as an NSTimeInterval, which is a double that specifies the interval in seconds.\n *   Once the log file gets to be this old, it is rolled.\n * \n * Both the maximumFileSize and the rollingFrequency are used to manage rolling.\n * Whichever occurs first will cause the log file to be rolled.\n * \n * For example:\n * The rollingFrequency is 24 hours,\n * but the log file surpasses the maximumFileSize after only 20 hours.\n * The log file will be rolled at that 20 hour mark.\n * A new log file will be created, and the 24 hour timer will be restarted.\n * \n * You may optionally disable rolling due to filesize by setting maximumFileSize to zero.\n * If you do so, rolling is based solely on rollingFrequency.\n * \n * You may optionally disable rolling due to time by setting rollingFrequency to zero (or any non-positive number).\n * If you do so, rolling is based solely on maximumFileSize.\n * \n * If you disable both maximumFileSize and rollingFrequency, then the log file won't ever be rolled.\n * This is strongly discouraged.\n**/\n@property (readwrite, assign) unsigned long long maximumFileSize;\n@property (readwrite, assign) NSTimeInterval rollingFrequency;\n\n/**\n * The DDLogFileManager instance can be used to retrieve the list of log files,\n * and configure the maximum number of archived log files to keep.\n * \n * @see DDLogFileManager.maximumNumberOfLogFiles\n**/\n@property (strong, nonatomic, readonly) id <DDLogFileManager> logFileManager;\n\n\n// You can optionally force the current log file to be rolled with this method.\n// CompletionBlock will be called on main queue.\n\n- (void)rollLogFileWithCompletionBlock:(void (^)())completionBlock;\n\n// Method is deprecated. Use rollLogFileWithCompletionBlock: method instead.\n\n- (void)rollLogFile __attribute((deprecated));\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * DDLogFileInfo is a simple class that provides access to various file attributes.\n * It provides good performance as it only fetches the information if requested,\n * and it caches the information to prevent duplicate fetches.\n * \n * It was designed to provide quick snapshots of the current state of log files,\n * and to help sort log files in an array.\n * \n * This class does not monitor the files, or update it's cached attribute values if the file changes on disk.\n * This is not what the class was designed for.\n * \n * If you absolutely must get updated values,\n * you can invoke the reset method which will clear the cache.\n**/\n@interface DDLogFileInfo : NSObject\n{\n    __strong NSString *filePath;\n    __strong NSString *fileName;\n    \n    __strong NSDictionary *fileAttributes;\n    \n    __strong NSDate *creationDate;\n    __strong NSDate *modificationDate;\n    \n    unsigned long long fileSize;\n}\n\n@property (strong, nonatomic, readonly) NSString *filePath;\n@property (strong, nonatomic, readonly) NSString *fileName;\n\n@property (strong, nonatomic, readonly) NSDictionary *fileAttributes;\n\n@property (strong, nonatomic, readonly) NSDate *creationDate;\n@property (strong, nonatomic, readonly) NSDate *modificationDate;\n\n@property (nonatomic, readonly) unsigned long long fileSize;\n\n@property (nonatomic, readonly) NSTimeInterval age;\n\n@property (nonatomic, readwrite) BOOL isArchived;\n\n+ (instancetype)logFileWithPath:(NSString *)filePath;\n\n- (instancetype)initWithFilePath:(NSString *)filePath;\n\n- (void)reset;\n- (void)renameFile:(NSString *)newFileName;\n\n#if TARGET_IPHONE_SIMULATOR\n\n// So here's the situation.\n// Extended attributes are perfect for what we're trying to do here (marking files as archived).\n// This is exactly what extended attributes were designed for.\n// \n// But Apple screws us over on the simulator.\n// Everytime you build-and-go, they copy the application into a new folder on the hard drive,\n// and as part of the process they strip extended attributes from our log files.\n// Normally, a copy of a file preserves extended attributes.\n// So obviously Apple has gone to great lengths to piss us off.\n// \n// Thus we use a slightly different tactic for marking log files as archived in the simulator.\n// That way it \"just works\" and there's no confusion when testing.\n// \n// The difference in method names is indicative of the difference in functionality.\n// On the simulator we add an attribute by appending a filename extension.\n// \n// For example:\n// log-ABC123.txt -> log-ABC123.archived.txt\n\n- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName;\n\n- (void)addExtensionAttributeWithName:(NSString *)attrName;\n- (void)removeExtensionAttributeWithName:(NSString *)attrName;\n\n#else\n\n// Normal use of extended attributes used everywhere else,\n// such as on Macs and on iPhone devices.\n\n- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName;\n\n- (void)addExtendedAttributeWithName:(NSString *)attrName;\n- (void)removeExtendedAttributeWithName:(NSString *)attrName;\n\n#endif\n\n- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another;\n- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/DDLog.h",
    "content": "#import <Foundation/Foundation.h>\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * Otherwise, here is a quick refresher.\n * There are three steps to using the macros:\n * \n * Step 1:\n * Import the header in your implementation file:\n * \n * #import \"DDLog.h\"\n * \n * Step 2:\n * Define your logging level in your implementation file:\n * \n * // Log levels: off, error, warn, info, verbose\n * static const int ddLogLevel = LOG_LEVEL_VERBOSE;\n * \n * Step 2 [3rd party frameworks]:\n *\n * Define your LOG_LEVEL_DEF to a different variable/function than ddLogLevel:\n *\n * // #undef LOG_LEVEL_DEF // Undefine first only if needed\n * #define LOG_LEVEL_DEF myLibLogLevel\n *\n * Define your logging level in your implementation file:\n *\n * // Log levels: off, error, warn, info, verbose\n * static const int myLibLogLevel = LOG_LEVEL_VERBOSE;\n *\n * Step 3:\n * Replace your NSLog statements with DDLog statements according to the severity of the message.\n * \n * NSLog(@\"Fatal error, no dohickey found!\"); -> DDLogError(@\"Fatal error, no dohickey found!\");\n * \n * DDLog works exactly the same as NSLog.\n * This means you can pass it multiple variables just like NSLog.\n**/\n\n#ifndef LOG_LEVEL_DEF\n    #define LOG_LEVEL_DEF ddLogLevel\n#endif\n\n@class DDLogMessage;\n\n@protocol DDLogger;\n@protocol DDLogFormatter;\n\n/**\n * This is the single macro that all other macros below compile into.\n * This big multiline macro makes all the other macros easier to read.\n**/\n\n#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \\\n  [DDLog log:isAsynchronous                                             \\\n       level:lvl                                                        \\\n        flag:flg                                                        \\\n     context:ctx                                                        \\\n        file:__FILE__                                                   \\\n    function:fnct                                                       \\\n        line:__LINE__                                                   \\\n         tag:atag                                                       \\\n      format:(frmt), ##__VA_ARGS__]\n\n/**\n * Define the Objective-C and C versions of the macro.\n * These automatically inject the proper function name for either an objective-c method or c function.\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_OBJC_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MACRO(async, lvl, flg, ctx, nil, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MACRO(async, lvl, flg, ctx, nil, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define version of the macro that only execute if the logLevel is above the threshold.\n * The compiled versions essentially look like this:\n * \n * if (logFlagForThisLogMsg & ddLogLevel) { execute log message }\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels.\n * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques.\n * \n * Note that when compiler optimizations are enabled (as they are for your release builds),\n * the log messages above your logging threshold will automatically be compiled out.\n * \n * (If the compiler sees ddLogLevel declared as a constant, the compiler simply checks to see if the 'if' statement\n *  would execute, and if not it strips it from the binary.)\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define versions of the macros that also accept tags.\n * \n * The DDLogMessage object includes a 'tag' ivar that may be used for a variety of purposes.\n * It may be used to pass custom information to loggers or formatters.\n * Or it may be used by 3rd party extensions to the framework.\n * \n * Thes macros just make it a little easier to extend logging functionality.\n**/\n\n#define LOG_OBJC_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n                 LOG_MACRO(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n              LOG_MACRO(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n             LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n          LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n/**\n * Define the standard options.\n * \n * We default to only 4 levels because it makes it easier for beginners\n * to make the transition to a logging framework.\n * \n * More advanced users may choose to completely customize the levels (and level names) to suite their needs.\n * For more information on this see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n * \n * Advanced users may also notice that we're using a bitmask.\n * This is to allow for custom fine grained logging:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/FineGrainedLogging\n * \n * -- Flags --\n * \n * Typically you will use the LOG_LEVELS (see below), but the flags may be used directly in certain situations.\n * For example, say you have a lot of warning log messages, and you wanted to disable them.\n * However, you still needed to see your error and info log messages.\n * You could accomplish that with the following:\n * \n * static const int ddLogLevel = LOG_FLAG_ERROR | LOG_FLAG_INFO;\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * Flags may also be consulted when writing custom log formatters,\n * as the DDLogMessage class captures the individual flag that caused the log message to fire.\n * \n * -- Levels --\n * \n * Log levels are simply the proper bitmask of the flags.\n * \n * -- Booleans --\n * \n * The booleans may be used when your logging code involves more than one line.\n * For example:\n * \n * if (LOG_VERBOSE) {\n *     for (id sprocket in sprockets)\n *         DDLogVerbose(@\"sprocket: %@\", [sprocket description])\n * }\n * \n * -- Async --\n * \n * Defines the default asynchronous options.\n * The default philosophy for asynchronous logging is very simple:\n * \n * Log messages with errors should be executed synchronously.\n *     After all, an error just occurred. The application could be unstable.\n * \n * All other log messages, such as debug output, are executed asynchronously.\n *     After all, if it wasn't an error, then it was just informational output,\n *     or something the application was easily able to recover from.\n * \n * -- Changes --\n * \n * You are strongly discouraged from modifying this file.\n * If you do, you make it more difficult on yourself to merge future bug fixes and improvements from the project.\n * Instead, create your own MyLogging.h or ApplicationNameLogging.h or CompanyLogging.h\n * \n * For an example of customizing your logging experience, see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n**/\n\n#define LOG_FLAG_ERROR    (1 << 0)  // 0...00001\n#define LOG_FLAG_WARN     (1 << 1)  // 0...00010\n#define LOG_FLAG_INFO     (1 << 2)  // 0...00100\n#define LOG_FLAG_DEBUG    (1 << 3)  // 0...01000\n#define LOG_FLAG_VERBOSE  (1 << 4)  // 0...10000\n\n#define LOG_LEVEL_OFF     0\n#define LOG_LEVEL_ERROR   (LOG_FLAG_ERROR)                                                                          // 0...00001\n#define LOG_LEVEL_WARN    (LOG_FLAG_ERROR | LOG_FLAG_WARN)                                                          // 0...00011\n#define LOG_LEVEL_INFO    (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO)                                          // 0...00111\n#define LOG_LEVEL_DEBUG   (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG)                         // 0...01111\n#define LOG_LEVEL_VERBOSE (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG | LOG_FLAG_VERBOSE)      // 0...11111\n\n#define LOG_ERROR    (LOG_LEVEL_DEF & LOG_FLAG_ERROR)\n#define LOG_WARN     (LOG_LEVEL_DEF & LOG_FLAG_WARN)\n#define LOG_INFO     (LOG_LEVEL_DEF & LOG_FLAG_INFO)\n#define LOG_DEBUG    (LOG_LEVEL_DEF & LOG_FLAG_DEBUG)\n#define LOG_VERBOSE  (LOG_LEVEL_DEF & LOG_FLAG_VERBOSE)\n\n#define LOG_ASYNC_ENABLED YES\n\n#define LOG_ASYNC_ERROR    ( NO && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_WARN     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_INFO     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_DEBUG    (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_VERBOSE  (YES && LOG_ASYNC_ENABLED)\n\n#define DDLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogDebug(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define DDLogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogCDebug(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n/**\n * The THIS_FILE macro gives you an NSString of the file name.\n * For simplicity and clarity, the file name does not include the full path or file extension.\n * \n * For example: DDLogWarn(@\"%@: Unable to find thingy\", THIS_FILE) -> @\"MyViewController: Unable to find thingy\"\n**/\n\nNSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy);\n\n#define THIS_FILE (DDExtractFileNameWithoutExtension(__FILE__, NO))\n\n/**\n * The THIS_METHOD macro gives you the name of the current objective-c method.\n * \n * For example: DDLogWarn(@\"%@ - Requires non-nil strings\", THIS_METHOD) -> @\"setMake:model: requires non-nil strings\"\n * \n * Note: This does NOT work in straight C functions (non objective-c).\n * Instead you should use the predefined __FUNCTION__ macro.\n**/\n\n#define THIS_METHOD NSStringFromSelector(_cmd)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDLog : NSObject\n\n/**\n * Provides access to the underlying logging queue.\n * This may be helpful to Logger classes for things like thread synchronization.\n**/\n\n+ (dispatch_queue_t)loggingQueue;\n\n/**\n * Logging Primitive.\n * \n * This method is used by the macros above.\n * It is suggested you stick with the macros as they're easier to use.\n**/\n\n+ (void)log:(BOOL)synchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format, ... __attribute__ ((format (__NSString__, 9, 10)));\n\n/**\n * Logging Primitive.\n * \n * This method can be used if you have a prepared va_list.\n**/\n\n+ (void)log:(BOOL)asynchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format\n       args:(va_list)argList;\n\n\n/**\n * Since logging can be asynchronous, there may be times when you want to flush the logs.\n * The framework invokes this automatically when the application quits.\n**/\n\n+ (void)flushLog;\n\n/** \n * Loggers\n * \n * If you want your log statements to go somewhere,\n * you should create and add a logger.\n**/\n\n+ (void)addLogger:(id <DDLogger>)logger;    // adds the logger using maximum log level (LOG_LEVEL_VERBOSE)\n\n/**\n * Please use as logLevels the LOG_LEVEL_* macros\n *\n**/\n+ (void)addLogger:(id <DDLogger>)logger withLogLevel:(int)logLevel;\n\n+ (void)removeLogger:(id <DDLogger>)logger;\n+ (void)removeAllLoggers;\n\n/**\n * Registered Dynamic Logging\n * \n * These methods allow you to obtain a list of classes that are using registered dynamic logging,\n * and also provides methods to get and set their log level during run time.\n**/\n\n+ (NSArray *)registeredClasses;\n+ (NSArray *)registeredClassNames;\n\n+ (int)logLevelForClass:(Class)aClass;\n+ (int)logLevelForClassWithName:(NSString *)aClassName;\n\n+ (void)setLogLevel:(int)logLevel forClass:(Class)aClass;\n+ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogger <NSObject>\n@required\n\n- (void)logMessage:(DDLogMessage *)logMessage;\n\n/**\n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n**/\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@optional\n\n/**\n * Since logging is asynchronous, adding and removing loggers is also asynchronous.\n * In other words, the loggers are added and removed at appropriate times with regards to log messages.\n * \n * - Loggers will not receive log messages that were executed prior to when they were added.\n * - Loggers will not receive log messages that were executed after they were removed.\n * \n * These methods are executed in the logging thread/queue.\n * This is the same thread/queue that will execute every logMessage: invocation.\n * Loggers may use these methods for thread synchronization or other setup/teardown tasks.\n**/\n- (void)didAddLogger;\n- (void)willRemoveLogger;\n\n/**\n * Some loggers may buffer IO for optimization purposes.\n * For example, a database logger may only save occasionaly as the disk IO is slow.\n * In such loggers, this method should be implemented to flush any pending IO.\n * \n * This allows invocations of DDLog's flushLog method to be propogated to loggers that need it.\n * \n * Note that DDLog's flushLog method is invoked automatically when the application quits,\n * and it may be also invoked manually by the developer prior to application crashes, or other such reasons.\n**/\n- (void)flush;\n\n/**\n * Each logger is executed concurrently with respect to the other loggers.\n * Thus, a dedicated dispatch queue is used for each logger.\n * Logger implementations may optionally choose to provide their own dispatch queue.\n**/\n- (dispatch_queue_t)loggerQueue;\n\n/**\n * If the logger implementation does not choose to provide its own queue,\n * one will automatically be created for it.\n * The created queue will receive its name from this method.\n * This may be helpful for debugging or profiling reasons.\n**/\n- (NSString *)loggerName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogFormatter <NSObject>\n@required\n\n/**\n * Formatters may optionally be added to any logger.\n * This allows for increased flexibility in the logging environment.\n * For example, log messages for log files may be formatted differently than log messages for the console.\n * \n * For more information about formatters, see the \"Custom Formatters\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The formatter may also optionally filter the log message by returning nil,\n * in which case the logger will not log the message.\n**/\n- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;\n\n@optional\n\n/**\n * A single formatter instance can be added to multiple loggers.\n * These methods provides hooks to notify the formatter of when it's added/removed.\n *\n * This is primarily for thread-safety.\n * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers.\n * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter),\n * it could possibly use these hooks to switch to thread-safe versions of the code.\n**/\n- (void)didAddToLogger:(id <DDLogger>)logger;\n- (void)willRemoveFromLogger:(id <DDLogger>)logger;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDRegisteredDynamicLogging\n\n/**\n * Implement these methods to allow a file's log level to be managed from a central location.\n * \n * This is useful if you'd like to be able to change log levels for various parts\n * of your code from within the running application.\n * \n * Imagine pulling up the settings for your application,\n * and being able to configure the logging level on a per file basis.\n * \n * The implementation can be very straight-forward:\n * \n * + (int)ddLogLevel\n * {\n *     return ddLogLevel;\n * }\n *  \n * + (void)ddSetLogLevel:(int)logLevel\n * {\n *     ddLogLevel = logLevel;\n * }\n**/\n\n+ (int)ddLogLevel;\n+ (void)ddSetLogLevel:(int)logLevel;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogMessage class encapsulates information about the log message.\n * If you write custom loggers or formatters, you will be dealing with objects of this class.\n**/\n\nenum {\n    DDLogMessageCopyFile     = 1 << 0,\n    DDLogMessageCopyFunction = 1 << 1\n};\ntypedef int DDLogMessageOptions;\n\n@interface DDLogMessage : NSObject <NSCopying>\n{\n\n// The public variables below can be accessed directly (for speed).\n// For example: logMessage->logLevel\n    \n@public\n    int logLevel;\n    int logFlag;\n    int logContext;\n    NSString *logMsg;\n    NSDate *timestamp;\n    char *file;\n    char *function;\n    int lineNumber;\n    mach_port_t machThreadID;\n    char *queueLabel;\n    NSString *threadName;\n    \n    // For 3rd party extensions to the framework, where flags and contexts aren't enough.\n    id tag;\n    \n    // For 3rd party extensions that manually create DDLogMessage instances.\n    DDLogMessageOptions options;\n}\n\n/**\n * Standard init method for a log message object.\n * Used by the logging primitives. (And the macros use the logging primitives.)\n * \n * If you find need to manually create logMessage objects, there is one thing you should be aware of:\n * \n * If no flags are passed, the method expects the file and function parameters to be string literals.\n * That is, it expects the given strings to exist for the duration of the object's lifetime,\n * and it expects the given strings to be immutable.\n * In other words, it does not copy these strings, it simply points to them.\n * This is due to the fact that __FILE__ and __FUNCTION__ are usually used to specify these parameters,\n * so it makes sense to optimize and skip the unnecessary allocations.\n * However, if you need them to be copied you may use the options parameter to specify this.\n * Options is a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction.\n**/\n- (instancetype)initWithLogMsg:(NSString *)logMsg\n                         level:(int)logLevel\n                          flag:(int)logFlag\n                       context:(int)logContext\n                          file:(const char *)file\n                      function:(const char *)function\n                          line:(int)line\n                           tag:(id)tag\n                       options:(DDLogMessageOptions)optionsMask;\n\n/**\n * Returns the threadID as it appears in NSLog.\n * That is, it is a hexadecimal value which is calculated from the machThreadID.\n**/\n- (NSString *)threadID;\n\n/**\n * Convenience property to get just the file name, as the file variable is generally the full file path.\n * This method does not include the file extension, which is generally unwanted for logging purposes.\n**/\n- (NSString *)fileName;\n\n/**\n * Returns the function variable in NSString form.\n**/\n- (NSString *)methodName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogger protocol specifies that an optional formatter can be added to a logger.\n * Most (but not all) loggers will want to support formatters.\n * \n * However, writting getters and setters in a thread safe manner,\n * while still maintaining maximum speed for the logging process, is a difficult task.\n * \n * To do it right, the implementation of the getter/setter has strict requiremenets:\n * - Must NOT require the logMessage method to acquire a lock.\n * - Must NOT require the logMessage method to access an atomic property (also a lock of sorts).\n * \n * To simplify things, an abstract logger is provided that implements the getter and setter.\n * \n * Logger implementations may simply extend this class,\n * and they can ACCESS THE FORMATTER VARIABLE DIRECTLY from within their logMessage method!\n**/\n\n@interface DDAbstractLogger : NSObject <DDLogger>\n{\n    id <DDLogFormatter> formatter;\n    \n    dispatch_queue_t loggerQueue;\n}\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n// For thread-safety assertions\n- (BOOL)isOnGlobalLoggingQueue;\n- (BOOL)isOnInternalLoggerQueue;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/DDTTYLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#if TARGET_OS_IPHONE\n#import <UIKit/UIColor.h>   // iOS\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n#import <AppKit/NSColor.h>  // OS X with AppKit\n#else\n#import \"CLIColor.h\"        // OS X without AppKit\n#endif\n\n#import \"DDLog.h\"\n\n#define LOG_CONTEXT_ALL INT_MAX\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for Terminal output or Xcode console output,\n * depending on where you are running your code.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log (so it shows up in Console.app)\n * - StdErr (if stderr is a TTY, so log statements show up in Xcode console)\n * \n * To duplicate NSLog() functionality you can simply add this logger and an asl logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use only a file logger and a tty logger.\n**/\n\n@interface DDTTYLogger : DDAbstractLogger <DDLogger>\n{\n    NSCalendar *calendar;\n    NSUInteger calendarUnitFlags;\n    \n    NSString *appName;\n    char *app;\n    size_t appLen;\n    \n    NSString *processID;\n    char *pid;\n    size_t pidLen;\n    \n    BOOL colorsEnabled;\n    NSMutableArray *colorProfilesArray;\n    NSMutableDictionary *colorProfilesDict;\n}\n\n+ (instancetype)sharedInstance;\n\n/* Inherited from the DDLogger protocol:\n * \n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n * \n * More information about formatters can be found here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The actual implementation of these methods is inherited from DDAbstractLogger.\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n \n*/\n\n/**\n * Want to use different colors for different log levels?\n * Enable this property.\n * \n * If you run the application via the Terminal (not Xcode),\n * the logger will map colors to xterm-256color or xterm-color (if available).\n * \n * Xcode does NOT natively support colors in the Xcode debugging console.\n * You'll need to install the XcodeColors plugin to see colors in the Xcode console.\n * https://github.com/robbiehanson/XcodeColors\n * \n * The default value if NO.\n**/\n@property (readwrite, assign) BOOL colorsEnabled;\n\n/**\n * The default color set (foregroundColor, backgroundColor) is:\n * \n * - LOG_FLAG_ERROR = (red, nil)\n * - LOG_FLAG_WARN  = (orange, nil)\n * \n * You can customize the colors however you see fit.\n * Please note that you are passing a flag, NOT a level.\n * \n * GOOD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_FLAG_INFO];  // <- Good :)\n *  BAD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_LEVEL_INFO]; // <- BAD! :(\n * \n * LOG_FLAG_INFO  = 0...00100\n * LOG_LEVEL_INFO = 0...00111 <- Would match LOG_FLAG_INFO and LOG_FLAG_WARN and LOG_FLAG_ERROR\n * \n * If you run the application within Xcode, then the XcodeColors plugin is required.\n * \n * If you run the application from a shell, then DDTTYLogger will automatically map the given color to\n * the closest available color. (xterm-256color or xterm-color which have 256 and 16 supported colors respectively.)\n * \n * This method invokes setForegroundColor:backgroundColor:forFlag:context: and applies it to `LOG_CONTEXT_ALL`.\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask;\n#endif\n\n/**\n * Just like setForegroundColor:backgroundColor:flag, but allows you to specify a particular logging context.\n * \n * A logging context is often used to identify log messages coming from a 3rd party framework,\n * although logging context's can be used for many different functions.\n * \n * Use LOG_CONTEXT_ALL to set the deafult color for all contexts that have no specific color set defined.\n * \n * Logging context's are explained in further detail here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomContext\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#endif\n\n/**\n * Similar to the methods above, but allows you to map DDLogMessage->tag to a particular color profile.\n * For example, you could do something like this:\n * \n * static NSString *const PurpleTag = @\"PurpleTag\";\n * \n * #define DDLogPurple(frmt, ...) LOG_OBJC_TAG_MACRO(NO, 0, 0, 0, PurpleTag, frmt, ##__VA_ARGS__)\n * \n * And then in your applicationDidFinishLaunching, or wherever you configure Lumberjack:\n * \n * #if TARGET_OS_IPHONE\n *   UIColor *purple = [UIColor colorWithRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n * #else\n *   NSColor *purple = [NSColor colorWithCalibratedRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n *\n * Note: For CLI OS X projects that don't link with AppKit use CLIColor objects instead\n * \n * [[DDTTYLogger sharedInstance] setForegroundColor:purple backgroundColor:nil forTag:PurpleTag];\n * [DDLog addLogger:[DDTTYLogger sharedInstance]];\n * \n * This would essentially give you a straight NSLog replacement that prints in purple:\n * \n * DDLogPurple(@\"I'm a purple log message!\");\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forTag:(id <NSCopying>)tag;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forTag:(id <NSCopying>)tag;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forTag:(id <NSCopying>)tag;\n#endif\n\n/**\n * Clearing color profiles.\n**/\n- (void)clearColorsForFlag:(int)mask;\n- (void)clearColorsForFlag:(int)mask context:(int)context;\n- (void)clearColorsForTag:(id <NSCopying>)tag;\n- (void)clearColorsForAllFlags;\n- (void)clearColorsForAllTags;\n- (void)clearAllColors;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/NSJSONSerialization+ObjectWithNString.h",
    "content": "//\n//  NSJSONSerialization+ObjectWithNString.h\n//  Ejecta\n//\n//  Created by matth on 7/19/13.\n//\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (ObjectWithNString)\n+ (id)JSONObjectWithString:(NSString *)string options:(NSJSONReadingOptions)opt error:(NSError **)error;\n+ (NSString*)stringWithNSDictionary:(NSDictionary*)dictionary;\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/NSJSONSerialization+PBJSONHelpers.h",
    "content": "//\n//  NSJSONSerialization+PBJSONHelpers.h\n//  PebbleVendor\n//\n//  Created by matth on 9/17/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (PBJSONHelpers)\n\n/** @name Reflection helpers */\n\n/**\n * Derived from the Box SDK (MIT license) NSJSONSerialization+BoxAdditions...\n * https://github.com/box/box-ios-sdk-v2/tree/master/BoxSDK/Categories\n \n * Ensure that the object at `key` in `dictionary` is a member of the expected class.\n * `NSNull` may be specified as an allowable value. This method may return nil if `key`\n * is not present in `dictionary`.\n *\n * @param key The key to lookup in `dictionary`.\n * @param dictionary A dictionary resulting from deserializing a JSON object.\n * @param cls The expected class of the value at key.\n * @param nullAllowed If true, `NSNull` will be returned. If not, NSNull will be converted to nil. Property getters that pass `YES` for this parameter should have the return type of `id`.\n *\n * @return The object at `key` in `dictionary` if expectations are satisfied; `nil` otherwise.\n */\n+ (id)ensureObjectForKey:(NSString *)key inDictionary:(NSDictionary *)dictionary hasExpectedType:(Class)cls nullAllowed:(BOOL)nullAllowed;\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/NSString+HexData.h",
    "content": "//\n//  NSString+HexData.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 11/19/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSString (HexData)\n\n- (NSData*)hexData;\n\n@end\n\n\n@interface NSData (HexString)\n\n- (NSString*)hexString;\n\n@end"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/UIDevice-Hardware.h",
    "content": "/*\n Erica Sadun, http://ericasadun.com\n iPhone Developer's Cookbook, 6.x Edition\n BSD License, Use at your own risk\n */\n\n#import <UIKit/UIKit.h>\n\ntypedef enum {\n    UIDeviceFamilyiPhone,\n    UIDeviceFamilyiPod,\n    UIDeviceFamilyiPad,\n    UIDeviceFamilyAppleTV,\n    UIDeviceFamilyUnknown,\n    \n} UIDeviceFamily;\n\n@interface UIDevice (Hardware)\n- (NSString *) platform;\n- (NSString *) hwmodel;\n- (NSString *) platformString;\n\n- (NSUInteger) cpuFrequency;\n- (NSUInteger) busFrequency;\n- (NSUInteger) cpuCount;\n- (NSUInteger) totalMemory;\n- (NSUInteger) userMemory;\n\n- (NSNumber *) totalDiskSpace;\n- (NSNumber *) freeDiskSpace;\n\n- (NSString *) macaddress;\n\n- (BOOL) hasRetinaDisplay;\n- (BOOL) hasBluetoothMAP;\n- (UIDeviceFamily) deviceFamily;\n@end"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/CHMultiDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMultiDictionary.h\n \n Copyright (c) 2008-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n#import \"CHMutableDictionary.h\"\n\n/**\n @file CHMultiDictionary.h\n \n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> in which multiple values may be associated with a given key.\n */\n\n/**\n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> implementation, in which multiple values may be associated with a given key.\n \n A map is the same as a \"dictionary\", \"associative array\", etc. and consists of a unique set of keys and a collection of values. In a standard map, each key is associated with one value; in a multimap, more than one value may be associated with a given key. A multimap is appropriate for any situation in which one item may correspond to (map to) multiple values, such as a term in an book index and occurrences of that term, courses for which a student is registered, etc.\n \n The values for a key may or may not be ordered. This implementation does not maintain an ordering for objects associated with a key, nor does it allow for multiple occurrences of an object associated with the same key. Internally, this class uses an NSMutableDictionary, and the associated values for each key are stored in distinct NSMutableSet instances. (Just as with NSDictionary, each key added to a CHMultiDictionary is copied using \\link NSCopying#copyWithZone: -copyWithZone:\\endlink and all keys must conform to the NSCopying protocol.) Objects are retained on insertion and released on removal or deallocation.\n \n Since NSDictionary and NSSet conform to the NSCoding protocol, any internal data can be serialized. However, NSSet cannot automatically be written to or read from a property list, since it has no specified order. Thus, instances of CHMultiDictionary must be encoded as an NSData object before saving to disk.\n \n Currently, this implementation does not support key-value coding, observing, or binding like NSDictionary does. Consequently, the distinction between \"object\" and \"value\" is blurrier, although hopefully consistent with the Cocoa APIs in general....\n \n Unlike NSDictionary and other Cocoa collections, CHMultiDictionary has not been designed with mutable and immutable variants. A multimap is not that much more useful if it is immutable, so any copies made of this class are mutable by definition.\n */\n@interface CHMultiDictionary : CHMutableDictionary {\n\tNSUInteger objectCount; // Number of objects currently in the dictionary.\n}\n\n#pragma mark Querying Contents\n\n/**\n Returns the number of objects in the receiver, associated with any key.\n \n @return The number of objects in the receiver. This is the sum total of objects associated with each key in the dictonary.\n \n @see allObjects\n */\n- (NSUInteger) countForAllKeys;\n\n/**\n Returns the number of objects associated with a given key.\n \n @param aKey The key for which to return the object count.\n @return The number of objects associated with a given key in the dictionary.\n \n @see objectsForKey:\n */\n- (NSUInteger) countForKey:(id)aKey;\n\n/**\n Returns an array of objects associated with a given key.\n \n @param aKey The key for which to return the corresponding objects.\n @return An NSSet of objects associated with a given key, or nil if the key is not in the receiver.\n \n @see countForKey:\n @see removeObjectsForKey:\n */\n- (NSSet*) objectsForKey:(id)aKey;\n\n#pragma mark Modifying Contents\n\n/**\n Adds a given object to an entry for a given key in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param anObject An object to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#addObject: -[NSMutableSet addObject:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObject:(id)anObject forKey:(id)aKey;\n\n/**\n Adds the given object(s) to a key entry in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param objectSet A set of objects to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#unionSet: -[NSMutableSet unionSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n/**\n Remove @b all occurrences of @a anObject associated with a given key.\n \n @param aKey The key for which to remove an entry.\n @param anObject An object (possibly) associated with @a aKey in the receiver. Objects are considered to be equal if -compare: returns NSOrderedSame.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n If @a aKey does not exist in the receiver, or if @a anObject is not associated with @a aKey, the contents of the receiver are not modified.\n \n @see containsObject\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) removeObject:(id)anObject forKey:(id)aKey;\n\n/**\n Remove a given key and its associated value(s) from the receiver.\n \n @param aKey The key for which to remove an entry.\n \n If @a aKey does not exist in the receiver, there is no effect on the receiver.\n \n @see objectsForKey:\n @see removeObject:forKey:\n */\n- (void) removeObjectsForKey:(id)aKey;\n\n/**\n Sets the object(s) associated with a key entry in the receiver.\n \n @param aKey The key with which to associate the objects in @a objectSet.\n @param objectSet A set of objects to associate with @a key. If @a objectSet is empty, the contents of the receiver are not modified. If an entry for @a key already exists in the receiver, @a objectSet is added using \\link NSMutableSet#setSet: -[NSMutableSet setSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) setObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/CHMutableDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMutableDictionary.h\n \n Copyright (c) 2009-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n__attribute__((visibility(\"hidden\"))) void createCollectableCFMutableDictionary(CFMutableDictionaryRef* dictionary, NSUInteger initialCapacity);\n\n/**\n @file CHMutableDictionary.h\n \n A mutable dictionary class.\n */\n\n/**\n A mutable dictionary class.\n \n A CFMutableDictionaryRef is used internally to store the key-value pairs. Subclasses may choose to add other instance variables to enable a specific ordering of keys, override methods to modify behavior, and add methods to extend existing behaviors. However, all subclasses should behave like a standard Cocoa dictionary as much as possible, and document clearly when they do not.\n \n @note Any method inherited from NSDictionary or NSMutableDictionary is supported by this class and its children. Please see the documentation for those classes for details.\n \n @todo Implement @c -copy and @c -mutableCopy differently (so users can actually obtain an immutable copy) and make mutation methods aware of immutability?\n */\n@interface CHMutableDictionary : NSMutableDictionary {\n  CFMutableDictionaryRef dictionary; // A Core Foundation dictionary.\n}\n\n- (id) initWithCapacity:(NSUInteger)numItems;\n\n- (NSUInteger) count;\n- (NSEnumerator*) keyEnumerator;\n- (id) objectForKey:(id)aKey;\n- (void) removeAllObjects;\n- (void) removeObjectForKey:(id)aKey;\n- (void) setObject:(id)anObject forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/DDASLLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import <asl.h>\n\n#import \"DDLog.h\"\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for the Apple System Log facility.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log\n * - StdErr (if stderr is a TTY) so log statements show up in Xcode console\n * \n * To duplicate NSLog() functionality you can simply add this logger and a tty logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use a file logger and a tty logger.\n**/\n\n@interface DDASLLogger : DDAbstractLogger <DDLogger>\n{\n    aslclient client;\n}\n\n+ (instancetype)sharedInstance;\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/DDFileLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"DDLog.h\"\n\n@class DDLogFileInfo;\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger to write log statements to a file.\n**/\n\n\n// Default configuration and safety/sanity values.\n// \n// maximumFileSize         -> DEFAULT_LOG_MAX_FILE_SIZE\n// rollingFrequency        -> DEFAULT_LOG_ROLLING_FREQUENCY\n// maximumNumberOfLogFiles -> DEFAULT_LOG_MAX_NUM_LOG_FILES\n// \n// You should carefully consider the proper configuration values for your application.\n\n#define DEFAULT_LOG_MAX_FILE_SIZE     (1024 * 1024)   //  1 MB\n#define DEFAULT_LOG_ROLLING_FREQUENCY (60 * 60 * 24)  // 24 Hours\n#define DEFAULT_LOG_MAX_NUM_LOG_FILES (5)             //  5 Files\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// The LogFileManager protocol is designed to allow you to control all aspects of your log files.\n// \n// The primary purpose of this is to allow you to do something with the log files after they have been rolled.\n// Perhaps you want to compress them to save disk space.\n// Perhaps you want to upload them to an FTP server.\n// Perhaps you want to run some analytics on the file.\n// \n// A default LogFileManager is, of course, provided.\n// The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property.\n// \n// This protocol provides various methods to fetch the list of log files.\n// \n// There are two variants: sorted and unsorted.\n// If sorting is not necessary, the unsorted variant is obviously faster.\n// The sorted variant will return an array sorted by when the log files were created,\n// with the most recently created log file at index 0, and the oldest log file at the end of the array.\n// \n// You can fetch only the log file paths (full path including name), log file names (name only),\n// or an array of DDLogFileInfo objects.\n// The DDLogFileInfo class is documented below, and provides a handy wrapper that\n// gives you easy access to various file attributes such as the creation date or the file size.\n\n@protocol DDLogFileManager <NSObject>\n@required\n\n// Public properties\n\n/**\n * The maximum number of archived log files to keep on disk.\n * For example, if this property is set to 3,\n * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk.\n * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted.\n * \n * You may optionally disable deleting old/rolled/archived log files by setting this property to zero.\n**/\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n// Public methods\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n// Private methods (only to be used by DDFileLogger)\n\n- (NSString *)createNewLogFile;\n\n@optional\n\n// Notifications from DDFileLogger\n\n- (void)didArchiveLogFile:(NSString *)logFilePath;\n- (void)didRollAndArchiveLogFile:(NSString *)logFilePath;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Default log file manager.\n * \n * All log files are placed inside the logsDirectory.\n * If a specific logsDirectory isn't specified, the default directory is used.\n * On Mac, this is in ~/Library/Logs/<Application Name>.\n * On iPhone, this is in ~/Library/Caches/Logs.\n * \n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n * \n * Archived log files are automatically deleted according to the maximumNumberOfLogFiles property.\n**/\n@interface DDLogFileManagerDefault : NSObject <DDLogFileManager>\n{\n    NSUInteger maximumNumberOfLogFiles;\n    NSString *_logsDirectory;\n}\n\n- (id)init;\n- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory;\n\n/*\n * Methods to override.\n *\n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n *\n * If you wish to change default filename, you can override following two methods.\n * - newLogFileName method would be called on new logfile creation.\n * - isLogFile: method would be called to filter logfiles from all other files in logsDirectory.\n *   You have to parse given filename and return YES if it is logFile.\n *\n * **NOTE**\n * newLogFileName returns filename. If appropriate file already exists, number would be added\n * to filename before extension. You have to handle this case in isLogFile: method.\n *\n * Example:\n * - newLogFileName returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 2.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03 1.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 3.log\" would be created.\n**/\n- (NSString *)newLogFileName;\n- (BOOL)isLogFile:(NSString *)fileName;\n\n/* Inherited from DDLogFileManager protocol:\n\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n*/\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Most users will want file log messages to be prepended with the date and time.\n * Rather than forcing the majority of users to write their own formatter,\n * we will supply a logical default formatter.\n * Users can easily replace this formatter with their own by invoking the setLogFormatter method.\n * It can also be removed by calling setLogFormatter, and passing a nil parameter.\n * \n * In addition to the convenience of having a logical default formatter,\n * it will also provide a template that makes it easy for developers to copy and change.\n**/\n@interface DDLogFileFormatterDefault : NSObject <DDLogFormatter>\n{\n    NSDateFormatter *dateFormatter;\n}\n\n- (id)init;\n- (instancetype)initWithDateFormatter:(NSDateFormatter *)dateFormatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDFileLogger : DDAbstractLogger <DDLogger>\n{\n    __strong id <DDLogFileManager> logFileManager;\n    \n    DDLogFileInfo *currentLogFileInfo;\n    NSFileHandle *currentLogFileHandle;\n    \n    dispatch_source_t currentLogFileVnode;\n    dispatch_source_t rollingTimer;\n    \n    unsigned long long maximumFileSize;\n    NSTimeInterval rollingFrequency;\n}\n\n- (id)init;\n- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)logFileManager;\n\n/**\n * Log File Rolling:\n * \n * maximumFileSize:\n *   The approximate maximum size to allow log files to grow.\n *   If a log file is larger than this value after a log statement is appended,\n *   then the log file is rolled.\n * \n * rollingFrequency\n *   How often to roll the log file.\n *   The frequency is given as an NSTimeInterval, which is a double that specifies the interval in seconds.\n *   Once the log file gets to be this old, it is rolled.\n * \n * Both the maximumFileSize and the rollingFrequency are used to manage rolling.\n * Whichever occurs first will cause the log file to be rolled.\n * \n * For example:\n * The rollingFrequency is 24 hours,\n * but the log file surpasses the maximumFileSize after only 20 hours.\n * The log file will be rolled at that 20 hour mark.\n * A new log file will be created, and the 24 hour timer will be restarted.\n * \n * You may optionally disable rolling due to filesize by setting maximumFileSize to zero.\n * If you do so, rolling is based solely on rollingFrequency.\n * \n * You may optionally disable rolling due to time by setting rollingFrequency to zero (or any non-positive number).\n * If you do so, rolling is based solely on maximumFileSize.\n * \n * If you disable both maximumFileSize and rollingFrequency, then the log file won't ever be rolled.\n * This is strongly discouraged.\n**/\n@property (readwrite, assign) unsigned long long maximumFileSize;\n@property (readwrite, assign) NSTimeInterval rollingFrequency;\n\n/**\n * The DDLogFileManager instance can be used to retrieve the list of log files,\n * and configure the maximum number of archived log files to keep.\n * \n * @see DDLogFileManager.maximumNumberOfLogFiles\n**/\n@property (strong, nonatomic, readonly) id <DDLogFileManager> logFileManager;\n\n\n// You can optionally force the current log file to be rolled with this method.\n// CompletionBlock will be called on main queue.\n\n- (void)rollLogFileWithCompletionBlock:(void (^)())completionBlock;\n\n// Method is deprecated. Use rollLogFileWithCompletionBlock: method instead.\n\n- (void)rollLogFile __attribute((deprecated));\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * DDLogFileInfo is a simple class that provides access to various file attributes.\n * It provides good performance as it only fetches the information if requested,\n * and it caches the information to prevent duplicate fetches.\n * \n * It was designed to provide quick snapshots of the current state of log files,\n * and to help sort log files in an array.\n * \n * This class does not monitor the files, or update it's cached attribute values if the file changes on disk.\n * This is not what the class was designed for.\n * \n * If you absolutely must get updated values,\n * you can invoke the reset method which will clear the cache.\n**/\n@interface DDLogFileInfo : NSObject\n{\n    __strong NSString *filePath;\n    __strong NSString *fileName;\n    \n    __strong NSDictionary *fileAttributes;\n    \n    __strong NSDate *creationDate;\n    __strong NSDate *modificationDate;\n    \n    unsigned long long fileSize;\n}\n\n@property (strong, nonatomic, readonly) NSString *filePath;\n@property (strong, nonatomic, readonly) NSString *fileName;\n\n@property (strong, nonatomic, readonly) NSDictionary *fileAttributes;\n\n@property (strong, nonatomic, readonly) NSDate *creationDate;\n@property (strong, nonatomic, readonly) NSDate *modificationDate;\n\n@property (nonatomic, readonly) unsigned long long fileSize;\n\n@property (nonatomic, readonly) NSTimeInterval age;\n\n@property (nonatomic, readwrite) BOOL isArchived;\n\n+ (instancetype)logFileWithPath:(NSString *)filePath;\n\n- (instancetype)initWithFilePath:(NSString *)filePath;\n\n- (void)reset;\n- (void)renameFile:(NSString *)newFileName;\n\n#if TARGET_IPHONE_SIMULATOR\n\n// So here's the situation.\n// Extended attributes are perfect for what we're trying to do here (marking files as archived).\n// This is exactly what extended attributes were designed for.\n// \n// But Apple screws us over on the simulator.\n// Everytime you build-and-go, they copy the application into a new folder on the hard drive,\n// and as part of the process they strip extended attributes from our log files.\n// Normally, a copy of a file preserves extended attributes.\n// So obviously Apple has gone to great lengths to piss us off.\n// \n// Thus we use a slightly different tactic for marking log files as archived in the simulator.\n// That way it \"just works\" and there's no confusion when testing.\n// \n// The difference in method names is indicative of the difference in functionality.\n// On the simulator we add an attribute by appending a filename extension.\n// \n// For example:\n// log-ABC123.txt -> log-ABC123.archived.txt\n\n- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName;\n\n- (void)addExtensionAttributeWithName:(NSString *)attrName;\n- (void)removeExtensionAttributeWithName:(NSString *)attrName;\n\n#else\n\n// Normal use of extended attributes used everywhere else,\n// such as on Macs and on iPhone devices.\n\n- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName;\n\n- (void)addExtendedAttributeWithName:(NSString *)attrName;\n- (void)removeExtendedAttributeWithName:(NSString *)attrName;\n\n#endif\n\n- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another;\n- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/DDLog.h",
    "content": "#import <Foundation/Foundation.h>\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * Otherwise, here is a quick refresher.\n * There are three steps to using the macros:\n * \n * Step 1:\n * Import the header in your implementation file:\n * \n * #import \"DDLog.h\"\n * \n * Step 2:\n * Define your logging level in your implementation file:\n * \n * // Log levels: off, error, warn, info, verbose\n * static const int ddLogLevel = LOG_LEVEL_VERBOSE;\n * \n * Step 2 [3rd party frameworks]:\n *\n * Define your LOG_LEVEL_DEF to a different variable/function than ddLogLevel:\n *\n * // #undef LOG_LEVEL_DEF // Undefine first only if needed\n * #define LOG_LEVEL_DEF myLibLogLevel\n *\n * Define your logging level in your implementation file:\n *\n * // Log levels: off, error, warn, info, verbose\n * static const int myLibLogLevel = LOG_LEVEL_VERBOSE;\n *\n * Step 3:\n * Replace your NSLog statements with DDLog statements according to the severity of the message.\n * \n * NSLog(@\"Fatal error, no dohickey found!\"); -> DDLogError(@\"Fatal error, no dohickey found!\");\n * \n * DDLog works exactly the same as NSLog.\n * This means you can pass it multiple variables just like NSLog.\n**/\n\n#ifndef LOG_LEVEL_DEF\n    #define LOG_LEVEL_DEF ddLogLevel\n#endif\n\n@class DDLogMessage;\n\n@protocol DDLogger;\n@protocol DDLogFormatter;\n\n/**\n * This is the single macro that all other macros below compile into.\n * This big multiline macro makes all the other macros easier to read.\n**/\n\n#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \\\n  [DDLog log:isAsynchronous                                             \\\n       level:lvl                                                        \\\n        flag:flg                                                        \\\n     context:ctx                                                        \\\n        file:__FILE__                                                   \\\n    function:fnct                                                       \\\n        line:__LINE__                                                   \\\n         tag:atag                                                       \\\n      format:(frmt), ##__VA_ARGS__]\n\n/**\n * Define the Objective-C and C versions of the macro.\n * These automatically inject the proper function name for either an objective-c method or c function.\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_OBJC_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MACRO(async, lvl, flg, ctx, nil, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MACRO(async, lvl, flg, ctx, nil, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define version of the macro that only execute if the logLevel is above the threshold.\n * The compiled versions essentially look like this:\n * \n * if (logFlagForThisLogMsg & ddLogLevel) { execute log message }\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels.\n * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques.\n * \n * Note that when compiler optimizations are enabled (as they are for your release builds),\n * the log messages above your logging threshold will automatically be compiled out.\n * \n * (If the compiler sees ddLogLevel declared as a constant, the compiler simply checks to see if the 'if' statement\n *  would execute, and if not it strips it from the binary.)\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define versions of the macros that also accept tags.\n * \n * The DDLogMessage object includes a 'tag' ivar that may be used for a variety of purposes.\n * It may be used to pass custom information to loggers or formatters.\n * Or it may be used by 3rd party extensions to the framework.\n * \n * Thes macros just make it a little easier to extend logging functionality.\n**/\n\n#define LOG_OBJC_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n                 LOG_MACRO(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n              LOG_MACRO(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n             LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n          LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n/**\n * Define the standard options.\n * \n * We default to only 4 levels because it makes it easier for beginners\n * to make the transition to a logging framework.\n * \n * More advanced users may choose to completely customize the levels (and level names) to suite their needs.\n * For more information on this see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n * \n * Advanced users may also notice that we're using a bitmask.\n * This is to allow for custom fine grained logging:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/FineGrainedLogging\n * \n * -- Flags --\n * \n * Typically you will use the LOG_LEVELS (see below), but the flags may be used directly in certain situations.\n * For example, say you have a lot of warning log messages, and you wanted to disable them.\n * However, you still needed to see your error and info log messages.\n * You could accomplish that with the following:\n * \n * static const int ddLogLevel = LOG_FLAG_ERROR | LOG_FLAG_INFO;\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * Flags may also be consulted when writing custom log formatters,\n * as the DDLogMessage class captures the individual flag that caused the log message to fire.\n * \n * -- Levels --\n * \n * Log levels are simply the proper bitmask of the flags.\n * \n * -- Booleans --\n * \n * The booleans may be used when your logging code involves more than one line.\n * For example:\n * \n * if (LOG_VERBOSE) {\n *     for (id sprocket in sprockets)\n *         DDLogVerbose(@\"sprocket: %@\", [sprocket description])\n * }\n * \n * -- Async --\n * \n * Defines the default asynchronous options.\n * The default philosophy for asynchronous logging is very simple:\n * \n * Log messages with errors should be executed synchronously.\n *     After all, an error just occurred. The application could be unstable.\n * \n * All other log messages, such as debug output, are executed asynchronously.\n *     After all, if it wasn't an error, then it was just informational output,\n *     or something the application was easily able to recover from.\n * \n * -- Changes --\n * \n * You are strongly discouraged from modifying this file.\n * If you do, you make it more difficult on yourself to merge future bug fixes and improvements from the project.\n * Instead, create your own MyLogging.h or ApplicationNameLogging.h or CompanyLogging.h\n * \n * For an example of customizing your logging experience, see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n**/\n\n#define LOG_FLAG_ERROR    (1 << 0)  // 0...00001\n#define LOG_FLAG_WARN     (1 << 1)  // 0...00010\n#define LOG_FLAG_INFO     (1 << 2)  // 0...00100\n#define LOG_FLAG_DEBUG    (1 << 3)  // 0...01000\n#define LOG_FLAG_VERBOSE  (1 << 4)  // 0...10000\n\n#define LOG_LEVEL_OFF     0\n#define LOG_LEVEL_ERROR   (LOG_FLAG_ERROR)                                                                          // 0...00001\n#define LOG_LEVEL_WARN    (LOG_FLAG_ERROR | LOG_FLAG_WARN)                                                          // 0...00011\n#define LOG_LEVEL_INFO    (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO)                                          // 0...00111\n#define LOG_LEVEL_DEBUG   (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG)                         // 0...01111\n#define LOG_LEVEL_VERBOSE (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG | LOG_FLAG_VERBOSE)      // 0...11111\n\n#define LOG_ERROR    (LOG_LEVEL_DEF & LOG_FLAG_ERROR)\n#define LOG_WARN     (LOG_LEVEL_DEF & LOG_FLAG_WARN)\n#define LOG_INFO     (LOG_LEVEL_DEF & LOG_FLAG_INFO)\n#define LOG_DEBUG    (LOG_LEVEL_DEF & LOG_FLAG_DEBUG)\n#define LOG_VERBOSE  (LOG_LEVEL_DEF & LOG_FLAG_VERBOSE)\n\n#define LOG_ASYNC_ENABLED YES\n\n#define LOG_ASYNC_ERROR    ( NO && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_WARN     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_INFO     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_DEBUG    (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_VERBOSE  (YES && LOG_ASYNC_ENABLED)\n\n#define DDLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogDebug(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define DDLogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogCDebug(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n/**\n * The THIS_FILE macro gives you an NSString of the file name.\n * For simplicity and clarity, the file name does not include the full path or file extension.\n * \n * For example: DDLogWarn(@\"%@: Unable to find thingy\", THIS_FILE) -> @\"MyViewController: Unable to find thingy\"\n**/\n\nNSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy);\n\n#define THIS_FILE (DDExtractFileNameWithoutExtension(__FILE__, NO))\n\n/**\n * The THIS_METHOD macro gives you the name of the current objective-c method.\n * \n * For example: DDLogWarn(@\"%@ - Requires non-nil strings\", THIS_METHOD) -> @\"setMake:model: requires non-nil strings\"\n * \n * Note: This does NOT work in straight C functions (non objective-c).\n * Instead you should use the predefined __FUNCTION__ macro.\n**/\n\n#define THIS_METHOD NSStringFromSelector(_cmd)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDLog : NSObject\n\n/**\n * Provides access to the underlying logging queue.\n * This may be helpful to Logger classes for things like thread synchronization.\n**/\n\n+ (dispatch_queue_t)loggingQueue;\n\n/**\n * Logging Primitive.\n * \n * This method is used by the macros above.\n * It is suggested you stick with the macros as they're easier to use.\n**/\n\n+ (void)log:(BOOL)synchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format, ... __attribute__ ((format (__NSString__, 9, 10)));\n\n/**\n * Logging Primitive.\n * \n * This method can be used if you have a prepared va_list.\n**/\n\n+ (void)log:(BOOL)asynchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format\n       args:(va_list)argList;\n\n\n/**\n * Since logging can be asynchronous, there may be times when you want to flush the logs.\n * The framework invokes this automatically when the application quits.\n**/\n\n+ (void)flushLog;\n\n/** \n * Loggers\n * \n * If you want your log statements to go somewhere,\n * you should create and add a logger.\n**/\n\n+ (void)addLogger:(id <DDLogger>)logger;    // adds the logger using maximum log level (LOG_LEVEL_VERBOSE)\n\n/**\n * Please use as logLevels the LOG_LEVEL_* macros\n *\n**/\n+ (void)addLogger:(id <DDLogger>)logger withLogLevel:(int)logLevel;\n\n+ (void)removeLogger:(id <DDLogger>)logger;\n+ (void)removeAllLoggers;\n\n/**\n * Registered Dynamic Logging\n * \n * These methods allow you to obtain a list of classes that are using registered dynamic logging,\n * and also provides methods to get and set their log level during run time.\n**/\n\n+ (NSArray *)registeredClasses;\n+ (NSArray *)registeredClassNames;\n\n+ (int)logLevelForClass:(Class)aClass;\n+ (int)logLevelForClassWithName:(NSString *)aClassName;\n\n+ (void)setLogLevel:(int)logLevel forClass:(Class)aClass;\n+ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogger <NSObject>\n@required\n\n- (void)logMessage:(DDLogMessage *)logMessage;\n\n/**\n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n**/\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@optional\n\n/**\n * Since logging is asynchronous, adding and removing loggers is also asynchronous.\n * In other words, the loggers are added and removed at appropriate times with regards to log messages.\n * \n * - Loggers will not receive log messages that were executed prior to when they were added.\n * - Loggers will not receive log messages that were executed after they were removed.\n * \n * These methods are executed in the logging thread/queue.\n * This is the same thread/queue that will execute every logMessage: invocation.\n * Loggers may use these methods for thread synchronization or other setup/teardown tasks.\n**/\n- (void)didAddLogger;\n- (void)willRemoveLogger;\n\n/**\n * Some loggers may buffer IO for optimization purposes.\n * For example, a database logger may only save occasionaly as the disk IO is slow.\n * In such loggers, this method should be implemented to flush any pending IO.\n * \n * This allows invocations of DDLog's flushLog method to be propogated to loggers that need it.\n * \n * Note that DDLog's flushLog method is invoked automatically when the application quits,\n * and it may be also invoked manually by the developer prior to application crashes, or other such reasons.\n**/\n- (void)flush;\n\n/**\n * Each logger is executed concurrently with respect to the other loggers.\n * Thus, a dedicated dispatch queue is used for each logger.\n * Logger implementations may optionally choose to provide their own dispatch queue.\n**/\n- (dispatch_queue_t)loggerQueue;\n\n/**\n * If the logger implementation does not choose to provide its own queue,\n * one will automatically be created for it.\n * The created queue will receive its name from this method.\n * This may be helpful for debugging or profiling reasons.\n**/\n- (NSString *)loggerName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogFormatter <NSObject>\n@required\n\n/**\n * Formatters may optionally be added to any logger.\n * This allows for increased flexibility in the logging environment.\n * For example, log messages for log files may be formatted differently than log messages for the console.\n * \n * For more information about formatters, see the \"Custom Formatters\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The formatter may also optionally filter the log message by returning nil,\n * in which case the logger will not log the message.\n**/\n- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;\n\n@optional\n\n/**\n * A single formatter instance can be added to multiple loggers.\n * These methods provides hooks to notify the formatter of when it's added/removed.\n *\n * This is primarily for thread-safety.\n * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers.\n * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter),\n * it could possibly use these hooks to switch to thread-safe versions of the code.\n**/\n- (void)didAddToLogger:(id <DDLogger>)logger;\n- (void)willRemoveFromLogger:(id <DDLogger>)logger;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDRegisteredDynamicLogging\n\n/**\n * Implement these methods to allow a file's log level to be managed from a central location.\n * \n * This is useful if you'd like to be able to change log levels for various parts\n * of your code from within the running application.\n * \n * Imagine pulling up the settings for your application,\n * and being able to configure the logging level on a per file basis.\n * \n * The implementation can be very straight-forward:\n * \n * + (int)ddLogLevel\n * {\n *     return ddLogLevel;\n * }\n *  \n * + (void)ddSetLogLevel:(int)logLevel\n * {\n *     ddLogLevel = logLevel;\n * }\n**/\n\n+ (int)ddLogLevel;\n+ (void)ddSetLogLevel:(int)logLevel;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogMessage class encapsulates information about the log message.\n * If you write custom loggers or formatters, you will be dealing with objects of this class.\n**/\n\nenum {\n    DDLogMessageCopyFile     = 1 << 0,\n    DDLogMessageCopyFunction = 1 << 1\n};\ntypedef int DDLogMessageOptions;\n\n@interface DDLogMessage : NSObject <NSCopying>\n{\n\n// The public variables below can be accessed directly (for speed).\n// For example: logMessage->logLevel\n    \n@public\n    int logLevel;\n    int logFlag;\n    int logContext;\n    NSString *logMsg;\n    NSDate *timestamp;\n    char *file;\n    char *function;\n    int lineNumber;\n    mach_port_t machThreadID;\n    char *queueLabel;\n    NSString *threadName;\n    \n    // For 3rd party extensions to the framework, where flags and contexts aren't enough.\n    id tag;\n    \n    // For 3rd party extensions that manually create DDLogMessage instances.\n    DDLogMessageOptions options;\n}\n\n/**\n * Standard init method for a log message object.\n * Used by the logging primitives. (And the macros use the logging primitives.)\n * \n * If you find need to manually create logMessage objects, there is one thing you should be aware of:\n * \n * If no flags are passed, the method expects the file and function parameters to be string literals.\n * That is, it expects the given strings to exist for the duration of the object's lifetime,\n * and it expects the given strings to be immutable.\n * In other words, it does not copy these strings, it simply points to them.\n * This is due to the fact that __FILE__ and __FUNCTION__ are usually used to specify these parameters,\n * so it makes sense to optimize and skip the unnecessary allocations.\n * However, if you need them to be copied you may use the options parameter to specify this.\n * Options is a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction.\n**/\n- (instancetype)initWithLogMsg:(NSString *)logMsg\n                         level:(int)logLevel\n                          flag:(int)logFlag\n                       context:(int)logContext\n                          file:(const char *)file\n                      function:(const char *)function\n                          line:(int)line\n                           tag:(id)tag\n                       options:(DDLogMessageOptions)optionsMask;\n\n/**\n * Returns the threadID as it appears in NSLog.\n * That is, it is a hexadecimal value which is calculated from the machThreadID.\n**/\n- (NSString *)threadID;\n\n/**\n * Convenience property to get just the file name, as the file variable is generally the full file path.\n * This method does not include the file extension, which is generally unwanted for logging purposes.\n**/\n- (NSString *)fileName;\n\n/**\n * Returns the function variable in NSString form.\n**/\n- (NSString *)methodName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogger protocol specifies that an optional formatter can be added to a logger.\n * Most (but not all) loggers will want to support formatters.\n * \n * However, writting getters and setters in a thread safe manner,\n * while still maintaining maximum speed for the logging process, is a difficult task.\n * \n * To do it right, the implementation of the getter/setter has strict requiremenets:\n * - Must NOT require the logMessage method to acquire a lock.\n * - Must NOT require the logMessage method to access an atomic property (also a lock of sorts).\n * \n * To simplify things, an abstract logger is provided that implements the getter and setter.\n * \n * Logger implementations may simply extend this class,\n * and they can ACCESS THE FORMATTER VARIABLE DIRECTLY from within their logMessage method!\n**/\n\n@interface DDAbstractLogger : NSObject <DDLogger>\n{\n    id <DDLogFormatter> formatter;\n    \n    dispatch_queue_t loggerQueue;\n}\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n// For thread-safety assertions\n- (BOOL)isOnGlobalLoggingQueue;\n- (BOOL)isOnInternalLoggerQueue;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/DDTTYLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#if TARGET_OS_IPHONE\n#import <UIKit/UIColor.h>   // iOS\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n#import <AppKit/NSColor.h>  // OS X with AppKit\n#else\n#import \"CLIColor.h\"        // OS X without AppKit\n#endif\n\n#import \"DDLog.h\"\n\n#define LOG_CONTEXT_ALL INT_MAX\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for Terminal output or Xcode console output,\n * depending on where you are running your code.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log (so it shows up in Console.app)\n * - StdErr (if stderr is a TTY, so log statements show up in Xcode console)\n * \n * To duplicate NSLog() functionality you can simply add this logger and an asl logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use only a file logger and a tty logger.\n**/\n\n@interface DDTTYLogger : DDAbstractLogger <DDLogger>\n{\n    NSCalendar *calendar;\n    NSUInteger calendarUnitFlags;\n    \n    NSString *appName;\n    char *app;\n    size_t appLen;\n    \n    NSString *processID;\n    char *pid;\n    size_t pidLen;\n    \n    BOOL colorsEnabled;\n    NSMutableArray *colorProfilesArray;\n    NSMutableDictionary *colorProfilesDict;\n}\n\n+ (instancetype)sharedInstance;\n\n/* Inherited from the DDLogger protocol:\n * \n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n * \n * More information about formatters can be found here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The actual implementation of these methods is inherited from DDAbstractLogger.\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n \n*/\n\n/**\n * Want to use different colors for different log levels?\n * Enable this property.\n * \n * If you run the application via the Terminal (not Xcode),\n * the logger will map colors to xterm-256color or xterm-color (if available).\n * \n * Xcode does NOT natively support colors in the Xcode debugging console.\n * You'll need to install the XcodeColors plugin to see colors in the Xcode console.\n * https://github.com/robbiehanson/XcodeColors\n * \n * The default value if NO.\n**/\n@property (readwrite, assign) BOOL colorsEnabled;\n\n/**\n * The default color set (foregroundColor, backgroundColor) is:\n * \n * - LOG_FLAG_ERROR = (red, nil)\n * - LOG_FLAG_WARN  = (orange, nil)\n * \n * You can customize the colors however you see fit.\n * Please note that you are passing a flag, NOT a level.\n * \n * GOOD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_FLAG_INFO];  // <- Good :)\n *  BAD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_LEVEL_INFO]; // <- BAD! :(\n * \n * LOG_FLAG_INFO  = 0...00100\n * LOG_LEVEL_INFO = 0...00111 <- Would match LOG_FLAG_INFO and LOG_FLAG_WARN and LOG_FLAG_ERROR\n * \n * If you run the application within Xcode, then the XcodeColors plugin is required.\n * \n * If you run the application from a shell, then DDTTYLogger will automatically map the given color to\n * the closest available color. (xterm-256color or xterm-color which have 256 and 16 supported colors respectively.)\n * \n * This method invokes setForegroundColor:backgroundColor:forFlag:context: and applies it to `LOG_CONTEXT_ALL`.\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask;\n#endif\n\n/**\n * Just like setForegroundColor:backgroundColor:flag, but allows you to specify a particular logging context.\n * \n * A logging context is often used to identify log messages coming from a 3rd party framework,\n * although logging context's can be used for many different functions.\n * \n * Use LOG_CONTEXT_ALL to set the deafult color for all contexts that have no specific color set defined.\n * \n * Logging context's are explained in further detail here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomContext\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#endif\n\n/**\n * Similar to the methods above, but allows you to map DDLogMessage->tag to a particular color profile.\n * For example, you could do something like this:\n * \n * static NSString *const PurpleTag = @\"PurpleTag\";\n * \n * #define DDLogPurple(frmt, ...) LOG_OBJC_TAG_MACRO(NO, 0, 0, 0, PurpleTag, frmt, ##__VA_ARGS__)\n * \n * And then in your applicationDidFinishLaunching, or wherever you configure Lumberjack:\n * \n * #if TARGET_OS_IPHONE\n *   UIColor *purple = [UIColor colorWithRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n * #else\n *   NSColor *purple = [NSColor colorWithCalibratedRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n *\n * Note: For CLI OS X projects that don't link with AppKit use CLIColor objects instead\n * \n * [[DDTTYLogger sharedInstance] setForegroundColor:purple backgroundColor:nil forTag:PurpleTag];\n * [DDLog addLogger:[DDTTYLogger sharedInstance]];\n * \n * This would essentially give you a straight NSLog replacement that prints in purple:\n * \n * DDLogPurple(@\"I'm a purple log message!\");\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forTag:(id <NSCopying>)tag;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forTag:(id <NSCopying>)tag;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forTag:(id <NSCopying>)tag;\n#endif\n\n/**\n * Clearing color profiles.\n**/\n- (void)clearColorsForFlag:(int)mask;\n- (void)clearColorsForFlag:(int)mask context:(int)context;\n- (void)clearColorsForTag:(id <NSCopying>)tag;\n- (void)clearColorsForAllFlags;\n- (void)clearColorsForAllTags;\n- (void)clearAllColors;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/NSJSONSerialization+ObjectWithNString.h",
    "content": "//\n//  NSJSONSerialization+ObjectWithNString.h\n//  Ejecta\n//\n//  Created by matth on 7/19/13.\n//\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (ObjectWithNString)\n+ (id)JSONObjectWithString:(NSString *)string options:(NSJSONReadingOptions)opt error:(NSError **)error;\n+ (NSString*)stringWithNSDictionary:(NSDictionary*)dictionary;\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/NSJSONSerialization+PBJSONHelpers.h",
    "content": "//\n//  NSJSONSerialization+PBJSONHelpers.h\n//  PebbleVendor\n//\n//  Created by matth on 9/17/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (PBJSONHelpers)\n\n/** @name Reflection helpers */\n\n/**\n * Derived from the Box SDK (MIT license) NSJSONSerialization+BoxAdditions...\n * https://github.com/box/box-ios-sdk-v2/tree/master/BoxSDK/Categories\n \n * Ensure that the object at `key` in `dictionary` is a member of the expected class.\n * `NSNull` may be specified as an allowable value. This method may return nil if `key`\n * is not present in `dictionary`.\n *\n * @param key The key to lookup in `dictionary`.\n * @param dictionary A dictionary resulting from deserializing a JSON object.\n * @param cls The expected class of the value at key.\n * @param nullAllowed If true, `NSNull` will be returned. If not, NSNull will be converted to nil. Property getters that pass `YES` for this parameter should have the return type of `id`.\n *\n * @return The object at `key` in `dictionary` if expectations are satisfied; `nil` otherwise.\n */\n+ (id)ensureObjectForKey:(NSString *)key inDictionary:(NSDictionary *)dictionary hasExpectedType:(Class)cls nullAllowed:(BOOL)nullAllowed;\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/NSString+HexData.h",
    "content": "//\n//  NSString+HexData.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 11/19/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSString (HexData)\n\n- (NSData*)hexData;\n\n@end\n\n\n@interface NSData (HexString)\n\n- (NSString*)hexString;\n\n@end"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/UIDevice-Hardware.h",
    "content": "/*\n Erica Sadun, http://ericasadun.com\n iPhone Developer's Cookbook, 6.x Edition\n BSD License, Use at your own risk\n */\n\n#import <UIKit/UIKit.h>\n\ntypedef enum {\n    UIDeviceFamilyiPhone,\n    UIDeviceFamilyiPod,\n    UIDeviceFamilyiPad,\n    UIDeviceFamilyAppleTV,\n    UIDeviceFamilyUnknown,\n    \n} UIDeviceFamily;\n\n@interface UIDevice (Hardware)\n- (NSString *) platform;\n- (NSString *) hwmodel;\n- (NSString *) platformString;\n\n- (NSUInteger) cpuFrequency;\n- (NSUInteger) busFrequency;\n- (NSUInteger) cpuCount;\n- (NSUInteger) totalMemory;\n- (NSUInteger) userMemory;\n\n- (NSNumber *) totalDiskSpace;\n- (NSNumber *) freeDiskSpace;\n\n- (NSString *) macaddress;\n\n- (BOOL) hasRetinaDisplay;\n- (BOOL) hasBluetoothMAP;\n- (UIDeviceFamily) deviceFamily;\n@end"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/PebbleKit/Readme.md",
    "content": "# PebbleKit iOS\n\nWelcome to Pebble's official iOS SDK!\n\n## Compatibility\n\n- iOS 5.0+\n- iPhone 3GS or later\n\n## Examples\n\nAll Pebble SDK examples are now grouped in Pebble SDK, please look into the `examples/` folder of your Pebble SDK for sample code.\n\n## Integrating PebbleKit using Cocoapods\n\n- Install [Cocoapods](http://www.cocoapods.org) or make sure it is up to date\n- Add a Podfile to your project if you don't have one already (Hint: use `pod init`).\n- Add this line to the Podfile: `pod 'PebbleKit', :path => \"/path/to/PebbleKit-iOS\"`\n- Run `pod install`\n\n## Integrating PebbleKit Manually\n\n- Drag PebbleKit.framework into project\n- Drag in PebbleVendor.framework into the project, or, drag the PebbleVendor.xcodeproj into project if you need to control the 3rd party components needed for PebbleKit.\n- Link ExternalAccessory.framework, libz.dylib, CoreBluetooth.framework, CoreMotion.framework and MessageUI.framework\n- Add \"-ObjC\" linker flag to your project's build settings\n- Add the value \"com.getpebble.public\" to the \"Supported external accessory protocols\" (UISupportedExternalAccessoryProtocols) array in your app's Info.plist\n- Optionally, add the value \"App communicates with an accessory\" (external-accessory) to the \"Required background modes\" (UIBackgroundModes) array in your app's Info.plist\n\n\n## Xcode Documentation\n\n- An Xcode docset is included with documentation about all public APIs.\n- Copy `com.getpebble.PebbleKit.docset` content into `~/Library/Developer/Shared/Documentation/DocSets`\n- Restart Xcode. The documentation will now be available from `Help > Documentation and API Reference`\n\n## Submitting iOS apps with PebbleKit to Apple's App Store\n\nIn order for Pebble to work with iPhones, Pebble is part of the Made For iPhone program (a requirement for hardware accessories to interact with iOS apps). Unfortunately this also means that if you build an iOS app with PebbleKit, we (Pebble) will need to whitelist your iOS app before you can upload it to the App Store. If you have completed a Pebble app and would like to learn more about making it available on the App Store, please visit [the whitelisting guide](https://developer.getpebble.com/2/distribute/whitelisting.html)\n\n## Change Log\n\n#### TODO-SetDate - 2.0\n\n- Remove examples from PebbleKit and move them into Pebble SDK\n\n#### 2013-07-03 - 1.12\n- Log errors to the console if there is no delegate set on PBWatch\n- Bugfixes\n-- Fix threading bugs in WeatherDemo\n-- Fix bugs that could cause callbacks to be called on the wrong thread\n-- Fix a bug that could cause a crash when re-connecting to the watch\n-- Fix a bug that caused some types to be unavailable (gtypes.h)\n\n#### 2013-05-06\n- Added WeatherDemo sample project to demonstrate custom use of the AppMessage subsystem\n- Added -[PBWatch closeSession:] to enable 3rd party apps to explicitely close the shared communication session.\n- Added PBBitmap helper class to convert UIImage to the native Pebble bitmap format\n- Exposed category methods on NSData/NSDictionary to (de)serialize from/to Pebble dicts\n- Added documentation for the NSNumber+stdint category\n\n#### 2013-03-25\n- Added generic bi-directional phone app <-> watch app communication layer, called \"App Messages\"\n- Refactored legacy Sports protocol to use App Messages\n- Added APIs to query the watch whether App / Sports Messages are supported (-appMessagesGetIsSupported: and -sportsGetIsSupported:)\n- Added API to set custom icon / title to the Sports watch app\n- Added API to receive Sports activity state changes by pressing the SELECT button on the watch (-sportsAppAddReceiveUpdateHandler:)\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/Pods-PebbleKit-Private.xcconfig",
    "content": "#include \"Pods-PebbleKit.xcconfig\"\nFRAMEWORK_SEARCH_PATHS = ${PODS_PEBBLEKIT_FRAMEWORK_SEARCH_PATHS}\nGCC_PREPROCESSOR_DEFINITIONS = COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/BuildHeaders\" \"${PODS_ROOT}/BuildHeaders/PebbleKit\" \"${PODS_ROOT}/Headers\" \"${PODS_ROOT}/Headers/PebbleKit\"\nOTHER_LDFLAGS = -ObjC ${PODS_PEBBLEKIT_OTHER_LDFLAGS}\nPODS_ROOT = ${SRCROOT}"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/Pods-PebbleKit-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_PebbleKit : NSObject\n@end\n@implementation PodsDummy_Pods_PebbleKit\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/Pods-PebbleKit-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n#import \"Pods-environment.h\"\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/Pods-PebbleKit.xcconfig",
    "content": "PODS_PEBBLEKIT_FRAMEWORK_SEARCH_PATHS = \"$(PODS_ROOT)/PebbleKit\" \"$(PODS_ROOT)/PebbleKit\"\nPODS_PEBBLEKIT_OTHER_LDFLAGS = -lz -framework PebbleKit -framework PebbleVendor -weak_framework CoreBluetooth -weak_framework CoreMotion -weak_framework ExternalAccessory -weak_framework MessageUI"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/Pods-acknowledgements.markdown",
    "content": "# Acknowledgements\nThis application makes use of the following third party libraries:\n\n## PebbleKit\n\n© 2014 Pebble Technology Corp. All rights reserved.\n\nGenerated by CocoaPods - http://cocoapods.org\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/Pods-acknowledgements.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreferenceSpecifiers</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>This application makes use of the following third party libraries:</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Acknowledgements</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>© 2014 Pebble Technology Corp. All rights reserved.\n</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>PebbleKit</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Generated by CocoaPods - http://cocoapods.org</string>\n\t\t\t<key>Title</key>\n\t\t\t<string></string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t</array>\n\t<key>StringsTable</key>\n\t<string>Acknowledgements</string>\n\t<key>Title</key>\n\t<string>Acknowledgements</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/Pods-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods : NSObject\n@end\n@implementation PodsDummy_Pods\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/Pods-environment.h",
    "content": "\n// To check if a library is compiled with CocoaPods you\n// can use the `COCOAPODS` macro definition which is\n// defined in the xcconfigs so it is available in\n// headers also when they are imported in the client\n// project.\n\n\n// PebbleKit\n#define COCOAPODS_POD_AVAILABLE_PebbleKit\n#define COCOAPODS_VERSION_MAJOR_PebbleKit 2\n#define COCOAPODS_VERSION_MINOR_PebbleKit 2\n#define COCOAPODS_VERSION_PATCH_PebbleKit 0\n\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/Pods-resources.sh",
    "content": "#!/bin/sh\nset -e\n\nRESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt\n> \"$RESOURCES_TO_COPY\"\n\ninstall_resource()\n{\n  case $1 in\n    *.storyboard)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}\"\n      ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .storyboard`.storyboardc\" \"${PODS_ROOT}/$1\" --sdk \"${SDKROOT}\"\n      ;;\n    *.xib)\n        echo \"ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}\"\n      ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .xib`.nib\" \"${PODS_ROOT}/$1\" --sdk \"${SDKROOT}\"\n      ;;\n    *.framework)\n      echo \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      mkdir -p \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      echo \"rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      rsync -av \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      ;;\n    *.xcdatamodel)\n      echo \"xcrun momc \\\"${PODS_ROOT}/$1\\\" \\\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\"`.mom\\\"\"\n      xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcdatamodel`.mom\"\n      ;;\n    *.xcdatamodeld)\n      echo \"xcrun momc \\\"${PODS_ROOT}/$1\\\" \\\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcdatamodeld`.momd\\\"\"\n      xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcdatamodeld`.momd\"\n      ;;\n    *.xcassets)\n      ;;\n    /*)\n      echo \"$1\"\n      echo \"$1\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n    *)\n      echo \"${PODS_ROOT}/$1\"\n      echo \"${PODS_ROOT}/$1\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n  esac\n}\n\nrsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nif [[ \"${ACTION}\" == \"install\" ]]; then\n  rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\nrm -f \"$RESOURCES_TO_COPY\"\n\nif [[ -n \"${WRAPPER_EXTENSION}\" ]] && [ `xcrun --find actool` ] && [ `find . -name '*.xcassets' | wc -l` -ne 0 ]\nthen\n  case \"${TARGETED_DEVICE_FAMILY}\" in \n    1,2)\n      TARGET_DEVICE_ARGS=\"--target-device ipad --target-device iphone\"\n      ;;\n    1)\n      TARGET_DEVICE_ARGS=\"--target-device iphone\"\n      ;;\n    2)\n      TARGET_DEVICE_ARGS=\"--target-device ipad\"\n      ;;\n    *)\n      TARGET_DEVICE_ARGS=\"--target-device mac\"\n      ;;  \n  esac \n  find \"${PWD}\" -name \"*.xcassets\" -print0 | xargs -0 actool --output-format human-readable-text --notices --warnings --platform \"${PLATFORM_NAME}\" --minimum-deployment-target \"${IPHONEOS_DEPLOYMENT_TARGET}\" ${TARGET_DEVICE_ARGS} --compress-pngs --compile \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/Pods.xcconfig",
    "content": "FRAMEWORK_SEARCH_PATHS = \"$(PODS_ROOT)/PebbleKit\" \"$(PODS_ROOT)/PebbleKit\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers\" \"${PODS_ROOT}/Headers/PebbleKit\"\nOTHER_CFLAGS = $(inherited) -isystem \"${PODS_ROOT}/Headers\" -isystem \"${PODS_ROOT}/Headers/PebbleKit\"\nOTHER_LDFLAGS = -ObjC -lz -framework PebbleKit -framework PebbleVendor -weak_framework CoreBluetooth -weak_framework CoreMotion -weak_framework ExternalAccessory -weak_framework MessageUI\nPODS_ROOT = ${SRCROOT}/Pods"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/Pods/Pods.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t4FFDD1D9A57E4B74BB91DED1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 89F309114A3D4047B41FB416 /* Foundation.framework */; };\n\t\t68CA9AC633D24DFD83DA3990 /* libPods-PebbleKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D8AFCFEE0CF4A50A86C1149 /* libPods-PebbleKit.a */; };\n\t\t838996875AAD40A09FCCF607 /* Pods-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 39E80ECAD9DD4065BBD9224C /* Pods-dummy.m */; };\n\t\tB5B485BCDFBE4AD58C4BCD6C /* Pods-PebbleKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E6793F187024E93860DA2E4 /* Pods-PebbleKit-dummy.m */; };\n\t\tBC33BE72602141C0AF36A9C7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 89F309114A3D4047B41FB416 /* Foundation.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\tECA99ACEC65E4CA4ADC5F7CF /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 93B9F122E4FE4AF8ADBCF78B /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = BE195FDB440F42F3B916BE5A;\n\t\t\tremoteInfo = \"Pods-PebbleKit\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t0F1972D97B10432EABD144A0 /* PebbleKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = PebbleKit.framework; sourceTree = \"<group>\"; };\n\t\t1AEF647B2F5F4CFF9937E4B1 /* Pods-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-resources.sh\"; sourceTree = \"<group>\"; };\n\t\t2E6793F187024E93860DA2E4 /* Pods-PebbleKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-PebbleKit-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t39E80ECAD9DD4065BBD9224C /* Pods-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t4D8AFCFEE0CF4A50A86C1149 /* libPods-PebbleKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-PebbleKit.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t743645F7F3E348A8B216A0D0 /* Pods-environment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Pods-environment.h\"; sourceTree = \"<group>\"; };\n\t\t76C65C5897004D0783587691 /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };\n\t\t7CC192FDBE9D4473948E7BBB /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7F755F2ECA364931A6AB7A42 /* Pods-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-acknowledgements.plist\"; sourceTree = \"<group>\"; };\n\t\t89F309114A3D4047B41FB416 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };\n\t\t9D857CD136E7401DAAD9EF7F /* Pods-PebbleKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-PebbleKit.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tA67948CF0A26465390E60AFC /* Pods-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = \"Pods-acknowledgements.markdown\"; sourceTree = \"<group>\"; };\n\t\tC9A96B904DE142998E976FEF /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.xcconfig; sourceTree = \"<group>\"; };\n\t\tCD49F6B18BD944F6877F53E5 /* Pods-PebbleKit-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-PebbleKit-Private.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tCD57F997D08547FA9CBBCEF6 /* PebbleVendor.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = PebbleVendor.framework; sourceTree = \"<group>\"; };\n\t\tF283B39B68344867AF3DD873 /* Pods-PebbleKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Pods-PebbleKit-prefix.pch\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t800D7882F458462ABB59691E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t4FFDD1D9A57E4B74BB91DED1 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8F10748A82A543E893D1F014 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tBC33BE72602141C0AF36A9C7 /* Foundation.framework in Frameworks */,\n\t\t\t\t68CA9AC633D24DFD83DA3990 /* libPods-PebbleKit.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t1AA9004B5C8A481B9639B4B2 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3D13F7AA83AA4A3FBCF9DE8F /* PebbleKit */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t28010FF2E3C74C5B8ED18677 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0F1972D97B10432EABD144A0 /* PebbleKit.framework */,\n\t\t\t\tCD57F997D08547FA9CBBCEF6 /* PebbleVendor.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3D13F7AA83AA4A3FBCF9DE8F /* PebbleKit */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t28010FF2E3C74C5B8ED18677 /* Frameworks */,\n\t\t\t\t8EC29EB211C345D7BB56F3DB /* Support Files */,\n\t\t\t);\n\t\t\tname = PebbleKit;\n\t\t\tpath = PebbleKit;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4240AC98365246F8AA2B5D3E /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC9A96B904DE142998E976FEF /* Pods.xcconfig */,\n\t\t\t\tA67948CF0A26465390E60AFC /* Pods-acknowledgements.markdown */,\n\t\t\t\t7F755F2ECA364931A6AB7A42 /* Pods-acknowledgements.plist */,\n\t\t\t\t39E80ECAD9DD4065BBD9224C /* Pods-dummy.m */,\n\t\t\t\t743645F7F3E348A8B216A0D0 /* Pods-environment.h */,\n\t\t\t\t1AEF647B2F5F4CFF9937E4B1 /* Pods-resources.sh */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4602A11140664FEBA23A1071 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFFF6DEFE635249699055AB0A /* iOS */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7C22C3AC25FF4837A73550B6 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7CC192FDBE9D4473948E7BBB /* libPods.a */,\n\t\t\t\t4D8AFCFEE0CF4A50A86C1149 /* libPods-PebbleKit.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8EC29EB211C345D7BB56F3DB /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9D857CD136E7401DAAD9EF7F /* Pods-PebbleKit.xcconfig */,\n\t\t\t\tCD49F6B18BD944F6877F53E5 /* Pods-PebbleKit-Private.xcconfig */,\n\t\t\t\t2E6793F187024E93860DA2E4 /* Pods-PebbleKit-dummy.m */,\n\t\t\t\tF283B39B68344867AF3DD873 /* Pods-PebbleKit-prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\tAB9F2D0B6AF64C4BB6B891DD /* Targets Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4240AC98365246F8AA2B5D3E /* Pods */,\n\t\t\t);\n\t\t\tname = \"Targets Support Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB89622390A154201ABC0C2CA = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76C65C5897004D0783587691 /* Podfile */,\n\t\t\t\t4602A11140664FEBA23A1071 /* Frameworks */,\n\t\t\t\t1AA9004B5C8A481B9639B4B2 /* Pods */,\n\t\t\t\t7C22C3AC25FF4837A73550B6 /* Products */,\n\t\t\t\tAB9F2D0B6AF64C4BB6B891DD /* Targets Support Files */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFFF6DEFE635249699055AB0A /* iOS */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t89F309114A3D4047B41FB416 /* Foundation.framework */,\n\t\t\t);\n\t\t\tname = iOS;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tBE195FDB440F42F3B916BE5A /* Pods-PebbleKit */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = CE83B89EF25E4D469DA25F27 /* Build configuration list for PBXNativeTarget \"Pods-PebbleKit\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tBFAC94F00384443DA1540949 /* Sources */,\n\t\t\t\t800D7882F458462ABB59691E /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Pods-PebbleKit\";\n\t\t\tproductName = \"Pods-PebbleKit\";\n\t\t\tproductReference = 4D8AFCFEE0CF4A50A86C1149 /* libPods-PebbleKit.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\tFFCB96C9B0EE423BA3229A77 /* Pods */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = FC248D2CE4364C06BEFBC4CF /* Build configuration list for PBXNativeTarget \"Pods\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t4D630544FD8E4A1F881E8507 /* Sources */,\n\t\t\t\t8F10748A82A543E893D1F014 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t81B154BAF24447ED90FA4C0C /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tproductName = Pods;\n\t\t\tproductReference = 7CC192FDBE9D4473948E7BBB /* libPods.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t93B9F122E4FE4AF8ADBCF78B /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0510;\n\t\t\t};\n\t\t\tbuildConfigurationList = FA6E6BBF7FDF4E258A7A448A /* Build configuration list for PBXProject \"Pods\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = B89622390A154201ABC0C2CA;\n\t\t\tproductRefGroup = 7C22C3AC25FF4837A73550B6 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectReferences = (\n\t\t\t);\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tFFCB96C9B0EE423BA3229A77 /* Pods */,\n\t\t\t\tBE195FDB440F42F3B916BE5A /* Pods-PebbleKit */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t4D630544FD8E4A1F881E8507 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t838996875AAD40A09FCCF607 /* Pods-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tBFAC94F00384443DA1540949 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB5B485BCDFBE4AD58C4BCD6C /* Pods-PebbleKit-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t81B154BAF24447ED90FA4C0C /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = BE195FDB440F42F3B916BE5A /* Pods-PebbleKit */;\n\t\t\ttargetProxy = ECA99ACEC65E4CA4ADC5F7CF /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t09EBFF3FA3944287B3568DF9 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = NO;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t18A3BF7234514D3885645510 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = NO;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t202AA5E2792144E0AAFE7E67 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = C9A96B904DE142998E976FEF /* Pods.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDSTROOT = /tmp/xcodeproj.dst;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINSTALL_PATH = \"$(BUILT_PRODUCTS_DIR)\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t66C81FF0C85F4DE3BE037290 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = CD49F6B18BD944F6877F53E5 /* Pods-PebbleKit-Private.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDSTROOT = /tmp/xcodeproj.dst;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Pods-PebbleKit-prefix.pch\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINSTALL_PATH = \"$(BUILT_PRODUCTS_DIR)\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tA24C18C57D7E4A43895006A8 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = CD49F6B18BD944F6877F53E5 /* Pods-PebbleKit-Private.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDSTROOT = /tmp/xcodeproj.dst;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Pods-PebbleKit-prefix.pch\";\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINSTALL_PATH = \"$(BUILT_PRODUCTS_DIR)\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"-DNS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tOTHER_CPLUSPLUSFLAGS = (\n\t\t\t\t\t\"-DNS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF55307558D6141688993D411 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = C9A96B904DE142998E976FEF /* Pods.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDSTROOT = /tmp/xcodeproj.dst;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINSTALL_PATH = \"$(BUILT_PRODUCTS_DIR)\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"-DNS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tOTHER_CPLUSPLUSFLAGS = (\n\t\t\t\t\t\"-DNS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tCE83B89EF25E4D469DA25F27 /* Build configuration list for PBXNativeTarget \"Pods-PebbleKit\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t66C81FF0C85F4DE3BE037290 /* Debug */,\n\t\t\t\tA24C18C57D7E4A43895006A8 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tFA6E6BBF7FDF4E258A7A448A /* Build configuration list for PBXProject \"Pods\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t18A3BF7234514D3885645510 /* Debug */,\n\t\t\t\t09EBFF3FA3944287B3568DF9 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tFC248D2CE4364C06BEFBC4CF /* Build configuration list for PBXNativeTarget \"Pods\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t202AA5E2792144E0AAFE7E67 /* Debug */,\n\t\t\t\tF55307558D6141688993D411 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 93B9F122E4FE4AF8ADBCF78B /* Project object */;\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo/SDAppDelegate.h",
    "content": "//\n//  SDAppDelegate.h\n//  SportsDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface SDAppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate>\n\n@property (strong, nonatomic) UIWindow *window;\n\n@property (strong, nonatomic) UITabBarController *tabBarController;\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo/SDAppDelegate.m",
    "content": "//\n//  SDAppDelegate.m\n//  SportsDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import \"SDAppDelegate.h\"\n#import \"SDAppViewController.h\"\n#import \"SDDataViewController.h\"\n#import \"SDIconViewController.h\"\n\n#import <PebbleKit/PebbleKit.h>\n\n@interface SDAppDelegate () <PBPebbleCentralDelegate>\n@end\n\n@implementation SDAppDelegate {\n  PBWatch *_targetWatch;\n  SDAppViewController *_appViewController;\n  SDDataViewController *_dataViewController;\n  SDIconViewController *_iconViewController;\n}\n\n- (void)setTargetWatch:(PBWatch*)watch {\n  _targetWatch = watch;\n\n  // NOTE:\n  // For demonstration purposes, we start communicating with the watch immediately upon connection,\n  // because we are calling -appMessagesGetIsSupported: here, which implicitely opens the communication session.\n  // Real world apps should communicate only if the user is actively using the app, because there\n  // is one communication session that is shared between all 3rd party iOS apps.\n\n  // Test if the Pebble's firmware supports AppMessages / Sports:\n  [watch appMessagesGetIsSupported:^(PBWatch *watch, BOOL isAppMessagesSupported) {\n    if (isAppMessagesSupported) {\n      // Configure our communications channel to target the sports app:\n      [[PBPebbleCentral defaultCentral] setAppUUID:PBSportsUUID];\n      [_appViewController setTargetWatch:_targetWatch];\n      [_dataViewController setTargetWatch:_targetWatch];\n      [_iconViewController setTargetWatch:_targetWatch];\n\n      NSString *message = [NSString stringWithFormat:@\"Yay! %@ supports AppMessages :D\", [watch name]];\n      [[[UIAlertView alloc] initWithTitle:@\"Connected!\" message:message delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n    } else {\n      [_appViewController setTargetWatch:nil];\n      [_dataViewController setTargetWatch:nil];\n      [_iconViewController setTargetWatch:nil];\n\n      NSString *message = [NSString stringWithFormat:@\"Blegh... %@ does NOT support AppMessages :'(\", [watch name]];\n      [[[UIAlertView alloc] initWithTitle:@\"Connected...\" message:message delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n    }\n  }];\n}\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];\n  // Override point for customization after application launch.\n  _appViewController = [[SDAppViewController alloc] init];\n  _dataViewController = [[SDDataViewController alloc] init];\n  _iconViewController = [[SDIconViewController alloc] init];\n  UINavigationController *nav1 = [[UINavigationController alloc] initWithRootViewController:_appViewController];\n  nav1.tabBarItem.title = @\"App\";\n  nav1.tabBarItem.image = [UIImage imageNamed:@\"first\"];\n  UINavigationController *nav2 = [[UINavigationController alloc] initWithRootViewController:_dataViewController];\n  nav2.tabBarItem.title = @\"Data\";\n  nav2.tabBarItem.image = [UIImage imageNamed:@\"second\"];\n  UINavigationController *nav3 = [[UINavigationController alloc] initWithRootViewController:_iconViewController];\n  nav3.tabBarItem.title = @\"Icon\";\n  nav3.tabBarItem.image = [UIImage imageNamed:@\"second\"];\n  self.tabBarController = [[UITabBarController alloc] init];\n  self.tabBarController.viewControllers = @[nav1, nav2, nav3];\n  self.window.rootViewController = self.tabBarController;\n  [self.window makeKeyAndVisible];\n\n  // We'd like to get called when Pebbles connect and disconnect, so become the delegate of PBPebbleCentral:\n  [[PBPebbleCentral defaultCentral] setDelegate:self];\n\n  // Initialize with the last connected watch:\n  [self setTargetWatch:[[PBPebbleCentral defaultCentral] lastConnectedWatch]];\n  return YES;\n}\n\n/*\n *  PBPebbleCentral delegate methods\n */\n\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidConnect:(PBWatch*)watch isNew:(BOOL)isNew {\n  [self setTargetWatch:watch];\n}\n\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidDisconnect:(PBWatch*)watch {\n  [[[UIAlertView alloc] initWithTitle:@\"Disconnected!\" message:[watch name] delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n  if (_targetWatch == watch || [watch isEqual:_targetWatch]) {\n    [self setTargetWatch:nil];\n  }\n}\n\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo/SDAppViewController.h",
    "content": "//\n//  SDAppViewController.h\n//  SportsDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import <PebbleKit/PebbleKit.h>\n\n@interface SDAppViewController : UIViewController\n- (void)setTargetWatch:(PBWatch*)watch;\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo/SDAppViewController.m",
    "content": "//\n//  SDAppViewController.m\n//  SportsDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import \"SDAppViewController.h\"\n\n@interface SDAppViewController ()\n\n@end\n\n@implementation SDAppViewController {\n  PBWatch *_watch;\n  __weak IBOutlet UITextView *_logTextView;\n}\n\n- (void)logIfNoWatch {\n  if (_watch == nil) {\n    _logTextView.text = [_logTextView.text stringByAppendingString:@\"No Pebble connected!\\n\"];\n  }\n}\n\n- (IBAction)launchAction:(id)sender {\n  [self logIfNoWatch];\n\n  [_watch sportsAppLaunch:^(PBWatch *watch, NSError *error) {\n    if (error) {\n      _logTextView.text = [_logTextView.text stringByAppendingString:@\"Failed sending launch command.\\n\"];\n    } else {\n      _logTextView.text = [_logTextView.text stringByAppendingString:@\"Launch command sent.\\n\"];\n    }\n  }];\n}\n\n- (IBAction)killAction:(id)sender {\n  [self logIfNoWatch];\n\n  [_watch sportsAppKill:^(PBWatch *watch, NSError *error) {\n    if (error) {\n      _logTextView.text = [_logTextView.text stringByAppendingString:@\"Failed sending kill command.\\n\"];\n    } else {\n      _logTextView.text = [_logTextView.text stringByAppendingString:@\"Kill command sent.\\n\"];\n    }\n  }];\n\n}\n\n- (void)setTargetWatch:(PBWatch*)watch {\n  _watch = watch;\n  self.navigationItem.prompt = _watch ? [_watch name] : @\"No Pebble\";\n}\n\n- (void)closeSession {\n  [_watch closeSession:^{\n    NSLog(@\"Session closed.\");\n  }];\n}\n\n- (void)dealloc {\n  [self setTargetWatch:nil];\n}\n\n- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {\n  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];\n  if (self) {\n    self.navigationItem.title = @\"Sports App\";\n    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@\"Close Session\" style:UIBarButtonItemStylePlain target:self action:@selector(closeSession)];\n  }\n  return self;\n}\n\t\t\t\t\t\t\t\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo/SDDataViewController.h",
    "content": "//\n//  SDDataViewController.h\n//  SportsDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import <PebbleKit/PebbleKit.h>\n\n@interface SDDataViewController : UIViewController\n- (void)setTargetWatch:(PBWatch*)watch;\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo/SDDataViewController.m",
    "content": "//\n//  SDSecondViewController.m\n//  SportsDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import \"SDDataViewController.h\"\n\nenum {\n  SDIndexTime = 0,\n  SDIndexDistance,\n  SDIndexData,\n};\n\n@interface SDDataViewController ()\n\n@end\n\n@implementation SDDataViewController {\n  PBWatch *_watch;\n  IBOutletCollection(UILabel) NSArray *_labels;\n  IBOutletCollection(UISlider) NSArray *_sliders;\n  __weak IBOutlet UITextView *_logTextView;\n  id _opaqueUpdateHandler;\n  __weak IBOutlet UISegmentedControl *_activityStateSegmentedControl;\n}\n\n- (void)setTargetWatch:(PBWatch*)watch {\n  if (_watch && _opaqueUpdateHandler) {\n    // Unregister the update handler that was registered below:\n    [_watch sportsAppRemoveUpdateHandler:_opaqueUpdateHandler];\n  }\n  _watch = watch;\n  if (_watch) {\n    // Add the handler for inbound (watch -> phone) updates:\n    // For the Sports protocol, there is currently only one value that can get updated, which is the \"activity state\".\n    __weak SDDataViewController *weakSelf = self;\n    _opaqueUpdateHandler = [_watch sportsAppAddReceiveUpdateHandler:^BOOL(PBWatch *watch, SportsAppActivityState state) {\n      NSString *newStateString = nil;\n      NSInteger index = 0;\n      switch (state) {\n        case SportsAppActivityStateInit:\n          newStateString = @\"Init\";\n          break;\n        case SportsAppActivityStateRunning:\n          newStateString = @\"Running\";\n          index = 1;\n          break;\n        case SportsAppActivityStatePaused:\n          newStateString = @\"Paused\";\n          break;\n        case SportsAppActivityStateEnd:\n          newStateString = @\"End\";\n          break;\n      }\n      SDDataViewController *strongSelf = weakSelf;\n      UITextView *logTextView = strongSelf->_logTextView;\n      logTextView.text = [logTextView.text stringByAppendingFormat:@\"Activity state: %@\\n\", newStateString];\n      UISegmentedControl *segmentedControl = strongSelf->_activityStateSegmentedControl;\n      segmentedControl.selectedSegmentIndex = index;\n      return YES;\n    }];\n  }\n  self.navigationItem.prompt = _watch ? [_watch name] : @\"No Pebble\";\n}\n\n- (IBAction)sliderAction:(UISlider *)sender {\n  NSUInteger index = [_sliders indexOfObject:sender];\n  UILabel *label = [_labels objectAtIndex:index];\n  switch (index) {\n    case SDIndexTime: {\n      int trucatedTime = ABS(truncf(sender.value));\n      BOOL isNegative = (sender.value < 0.f);\n      int seconds = trucatedTime % 60;\n      int minutes = (trucatedTime - seconds) / 60;\n      label.text = [NSString stringWithFormat:@\"Time: %s%i:%02i\", isNegative ? \"-\" : \"\", minutes, seconds];\n      break;\n    }\n    case SDIndexDistance:\n      label.text = [NSString stringWithFormat:@\"Distance: %2.1f\", sender.value];\n      break;\n    case SDIndexData:\n      label.text = [NSString stringWithFormat:@\"Data: %@\", [PBSportsUpdate timeStringFromFloat:sender.value]];\n      break;\n    default: break;\n  }\n}\n\n- (void)logIfNoWatch {\n  if (_watch == nil) {\n    _logTextView.text = [_logTextView.text stringByAppendingString:@\"No Pebble connected!\\n\"];\n  }\n}\n\n- (IBAction)stateAction:(UISegmentedControl *)sender {\n  [self logIfNoWatch];\n  SportsAppActivityState state;\n  switch (sender.selectedSegmentIndex) {\n    case 0:\n      state = SportsAppActivityStatePaused;\n      break;\n    case 1:\n    default:\n      state = SportsAppActivityStateRunning;\n      break;\n  }\n  NSString *log = [NSString stringWithFormat:@\"Set activity state: %@\\n\", state == SportsAppActivityStatePaused ? @\"Paused\" : @\"Running\"];\n  [_watch sportsAppSetActivityState:state onSent:^(PBWatch *watch, NSError *error) {\n    if (error) {\n      _logTextView.text = [_logTextView.text stringByAppendingFormat:@\"Failed sending activity state: %@\\n\", error];\n    } else {\n      _logTextView.text = [_logTextView.text stringByAppendingString:log];\n    }\n  }];\n}\n\n- (IBAction)updateAction:(id)sender {\n  [self logIfNoWatch];\n\n  NSUInteger count = _sliders.count;\n  float value[count];\n  for (int i = 0; i < count; ++i) {\n    value[i] = [(UISlider*)[_sliders objectAtIndex:i] value];\n  }\n\n  // Either use the helper PBSportsUpdate class:\n  /*\n  PBSportsUpdate *update = [PBSportsUpdate updateWithTime:value[SDIndexTime]\n                                                 distance:value[SDIndexDistance]\n\t\t\t\t\t\t     data:value[SDIndexData]];\n  NSDictionary *updateDict = [update dictionary];\n   */\n\n  // Or construct a dictionary with the one or more values you want to update:\n\n  NSDictionary *updateDict = @{ PBSportsTimeKey : [PBSportsUpdate timeStringFromFloat:value[SDIndexTime]],\n\t\t\t\tPBSportsDataKey : [PBSportsUpdate timeStringFromFloat:value[SDIndexData]],\n                                PBSportsDistanceKey : [NSString stringWithFormat:@\"%2.02f\", value[SDIndexDistance]]};\n\n  NSString *log = [NSString stringWithFormat:@\"Sent update: t:%2.2f, d:%2.2f, p:%2.1f\\n\", value[SDIndexTime], value[SDIndexDistance], value[SDIndexData]];\n  [_watch sportsAppUpdate:updateDict onSent:^(PBWatch *watch, NSError *error) {\n    if (error) {\n      _logTextView.text = [_logTextView.text stringByAppendingFormat:@\"Failed sending update: %@\\n\", error];\n    } else {\n      _logTextView.text = [_logTextView.text stringByAppendingString:log];\n    }\n  }];\n}\n\n- (IBAction)unitAction:(UISegmentedControl*)button {\n  [self logIfNoWatch];\n  \n  BOOL isMetric = (button.selectedSegmentIndex == 1);\n  [_watch sportsAppSetMetric:isMetric onSent:^(PBWatch *watch, NSError *error) {\n    if (error) {\n      _logTextView.text = [_logTextView.text stringByAppendingFormat:@\"Failed setting unit: %@\\n\", error];\n    } else {\n      _logTextView.text = [_logTextView.text stringByAppendingFormat:@\"Unit set: %@\\n\", isMetric ? @\"Metric\" : @\"Imperial\"];\n    }\n  }];\n}\n- (IBAction)paceAction:(UISegmentedControl*)button {\n  [self logIfNoWatch];\n\n  BOOL isPace = (button.selectedSegmentIndex == 0);\n  [_watch sportsAppSetLabel:isPace onSent:^(PBWatch *watch, NSError *error) {\n    if (error) {\n      _logTextView.text = [_logTextView.text stringByAppendingFormat:@\"Failed setting unit: %@\\n\", error];\n    } else {\n      _logTextView.text = [_logTextView.text stringByAppendingFormat:@\"Label set: %@\\n\", isPace ? @\"PACE\" : @\"SPEED\"];\n    }\n  }];\n}\n\n- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {\n  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];\n  if (self) {\n    self.navigationItem.title = @\"Sports Data\";\n  }\n  return self;\n}\n\n- (void)viewDidUnload {\n  _activityStateSegmentedControl = nil;\n  [super viewDidUnload];\n}\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo/SDIconViewController.h",
    "content": "//\n//  SDIconViewController.h\n//  SportsDemo\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import <PebbleKit/PebbleKit.h>\n\n@interface SDIconViewController : UIViewController\n- (void)setTargetWatch:(PBWatch*)watch;\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo/SDIconViewController.m",
    "content": "//\n//  SDIconViewController.m\n//  SportsDemo\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import \"SDIconViewController.h\"\n\n@interface SDIconViewController () <UITextFieldDelegate>\n\n@end\n\n@implementation SDIconViewController {\n  PBWatch *_watch;\n  __weak IBOutlet UITextField *_titleTextField;\n  __weak IBOutlet UISegmentedControl *_iconSegmentedControl;\n  __weak IBOutlet UITextView *_logTextView;\n}\n\n- (void)setTargetWatch:(PBWatch*)watch {\n  _watch = watch;\n  self.navigationItem.prompt = _watch ? [_watch name] : @\"No Pebble\";\n}\n\n- (void)dealloc {\n  [self setTargetWatch:nil];\n}\n\n- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {\n  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];\n  if (self) {\n    self.navigationItem.title = @\"Sports App\";\n  }\n  return self;\n}\n\n- (IBAction)assignAction:(id)sender {\n  NSString *fileName = (_iconSegmentedControl.selectedSegmentIndex == 0) ? @\"bike.png\" : @\"barefoot.png\";\n  UIImage *icon = [UIImage imageNamed:fileName];\n  __weak SDIconViewController *weakSelf = self;\n  [_watch sportsSetTitle:_titleTextField.text icon:icon onSent:^(PBWatch *watch, NSError *error) {\n    SDIconViewController *strongSelf = weakSelf;\n    NSString *log = error ? [error description] : @\"Icon + Title set!\";\n    [strongSelf->_logTextView setText:[strongSelf->_logTextView.text stringByAppendingFormat:@\"\\n%@\", log]];\n  }];\n}\n\n- (BOOL)textFieldShouldReturn:(UITextField *)textField {\n  [textField resignFirstResponder];\n  return YES;\n}\n\n- (void)viewDidUnload {\n  _titleTextField = nil;\n  _iconSegmentedControl = nil;\n  _logTextView = nil;\n  [super viewDidUnload];\n}\n@end\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo/SDIconViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"8.00\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1280</int>\n\t\t<string key=\"IBDocument.SystemVersion\">12D78</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">3084</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1187.37</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">626.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">2083</string>\n\t\t</object>\n\t\t<array key=\"IBDocument.IntegratedClassDependencies\">\n\t\t\t<string>IBProxyObject</string>\n\t\t\t<string>IBUIButton</string>\n\t\t\t<string>IBUILabel</string>\n\t\t\t<string>IBUISegmentedControl</string>\n\t\t\t<string>IBUITextField</string>\n\t\t\t<string>IBUITextView</string>\n\t\t\t<string>IBUIView</string>\n\t\t</array>\n\t\t<array key=\"IBDocument.PluginDependencies\">\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</array>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<string key=\"NS.key.0\">PluginDependencyRecalculationVersion</string>\n\t\t\t<integer value=\"1\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<array class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<object class=\"IBProxyObject\" id=\"372490531\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"975951072\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIView\" id=\"191373211\">\n\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t<object class=\"IBUISegmentedControl\" id=\"902871310\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 111}, {280, 44}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"602319143\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBNumberOfSegments\">2</int>\n\t\t\t\t\t\t<int key=\"IBSelectedSegmentIndex\">0</int>\n\t\t\t\t\t\t<array key=\"IBSegmentTitles\">\n\t\t\t\t\t\t\t<string/>\n\t\t\t\t\t\t\t<string/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentWidths\">\n\t\t\t\t\t\t\t<real value=\"0.0\"/>\n\t\t\t\t\t\t\t<real value=\"0.0\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentEnabledStates\">\n\t\t\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentContentOffsets\">\n\t\t\t\t\t\t\t<string>{0, 0}</string>\n\t\t\t\t\t\t\t<string>{0, 0}</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentImages\">\n\t\t\t\t\t\t\t<object class=\"NSCustomResource\">\n\t\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t\t<string key=\"NSResourceName\">bike.png</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"NSCustomResource\">\n\t\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t\t<string key=\"NSResourceName\">barefoot.png</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUITextField\" id=\"213212205\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 44}, {280, 30}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"95513918\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<string key=\"IBUIText\">SuperSweat</string>\n\t\t\t\t\t\t<int key=\"IBUIBorderStyle\">3</int>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUITextColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MAA</bytes>\n\t\t\t\t\t\t\t<object class=\"NSColorSpace\" key=\"NSCustomColorSpace\" id=\"893380889\">\n\t\t\t\t\t\t\t\t<int key=\"NSID\">2</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">YES</bool>\n\t\t\t\t\t\t<float key=\"IBUIMinimumFontSize\">17</float>\n\t\t\t\t\t\t<object class=\"IBUITextInputTraits\" key=\"IBUITextInputTraits\">\n\t\t\t\t\t\t\t<bool key=\"IBUIEnablesReturnKeyAutomatically\">YES</bool>\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<int key=\"IBUIClearButtonMode\">3</int>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\" id=\"144252832\">\n\t\t\t\t\t\t\t<int key=\"type\">1</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">14</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\" id=\"1010480037\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">14</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"739211888\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 15}, {280, 21}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"213212205\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Sports App Title:</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUITextColor\" id=\"937391241\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MCAwIDAAA</bytes>\n\t\t\t\t\t\t\t<string key=\"IBUIColorCocoaTouchKeyPath\">darkTextColor</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\" id=\"889205494\">\n\t\t\t\t\t\t\t<int key=\"type\">1</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">17</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\" id=\"441697935\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">17</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"95513918\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 82}, {280, 21}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"902871310\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Sports App Icon:</string>\n\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"937391241\"/>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"889205494\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"441697935\"/>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUIButton\" id=\"60452189\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 176}, {280, 75}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentHorizontalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIButtonType\">1</int>\n\t\t\t\t\t\t<string key=\"IBUINormalTitle\">Assign</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIHighlightedTitleColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleShadowColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MC41AA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\">\n\t\t\t\t\t\t\t<int key=\"type\">2</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">15</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica-Bold</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">15</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUITextView\" id=\"602319143\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{0, 271}, {320, 154}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"60452189\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MSAxIDEAA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<bool key=\"IBUIMultipleTouchEnabled\">YES</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<bool key=\"IBUIEditable\">NO</bool>\n\t\t\t\t\t\t<string key=\"IBUIText\"/>\n\t\t\t\t\t\t<object class=\"IBUITextInputTraits\" key=\"IBUITextInputTraits\">\n\t\t\t\t\t\t\t<int key=\"IBUIAutocapitalizationType\">2</int>\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"144252832\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"1010480037\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t\t<string key=\"NSFrame\">{{0, 94}, {320, 425}}</string>\n\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"739211888\"/>\n\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t<reference key=\"NSCustomColorSpace\" ref=\"893380889\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedNavigationBarMetrics\" key=\"IBUISimulatedTopBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedTabBarMetrics\" key=\"IBUISimulatedBottomBarMetrics\"/>\n\t\t\t\t<object class=\"IBUIScreenMetrics\" key=\"IBUISimulatedDestinationMetrics\">\n\t\t\t\t\t<string key=\"IBUISimulatedSizeMetricsClass\">IBUIScreenMetrics</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"IBUINormalizedOrientationToSizeMap\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<array key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<integer value=\"1\"/>\n\t\t\t\t\t\t\t<integer value=\"3\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array key=\"dict.values\">\n\t\t\t\t\t\t\t<string>{320, 568}</string>\n\t\t\t\t\t\t\t<string>{568, 320}</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</object>\n\t\t\t\t\t<string key=\"IBUITargetRuntime\">IBCocoaTouchFramework</string>\n\t\t\t\t\t<string key=\"IBUIDisplayName\">Retina 4 Full Screen</string>\n\t\t\t\t\t<int key=\"IBUIType\">2</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t</array>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<array class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">view</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">3</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_titleTextField</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"213212205\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">13</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_iconSegmentedControl</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"902871310\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">14</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_logTextView</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"602319143\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">16</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">delegate</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"213212205\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">17</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchEventConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">assignAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"60452189\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t\t<int key=\"IBEventType\">7</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">12</int>\n\t\t\t\t</object>\n\t\t\t</array>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<array key=\"orderedObjects\">\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<array key=\"object\" id=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"191373211\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"739211888\"/>\n\t\t\t\t\t\t\t<reference ref=\"213212205\"/>\n\t\t\t\t\t\t\t<reference ref=\"95513918\"/>\n\t\t\t\t\t\t\t<reference ref=\"902871310\"/>\n\t\t\t\t\t\t\t<reference ref=\"60452189\"/>\n\t\t\t\t\t\t\t<reference ref=\"602319143\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"975951072\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">4</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"902871310\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">8</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"213212205\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">9</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"739211888\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">10</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"95513918\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">11</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"60452189\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">15</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"602319143\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t</object>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<string key=\"-1.CustomClassName\">SDIconViewController</string>\n\t\t\t\t<string key=\"-1.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"-2.CustomClassName\">UIResponder</string>\n\t\t\t\t<string key=\"-2.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"1.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"10.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"11.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"15.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"4.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<integer value=\"0\" key=\"4.IUISegmentedControlInspectorSelectedSegmentMetadataKey\"/>\n\t\t\t\t<string key=\"8.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"9.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t</dictionary>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"unlocalizedProperties\"/>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"localizations\"/>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">17</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\"/>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>\n\t\t\t<real value=\"1280\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<dictionary class=\"NSMutableDictionary\" key=\"IBDocument.LastKnownImageSizes\">\n\t\t\t<string key=\"barefoot.png\">{22, 26}</string>\n\t\t\t<string key=\"bike.png\">{24, 22}</string>\n\t\t</dictionary>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">2083</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo/SportsDemo-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.getpebble.${PRODUCT_NAME:rfc1034identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UIStatusBarTintParameters</key>\n\t<dict>\n\t\t<key>UINavigationBar</key>\n\t\t<dict>\n\t\t\t<key>Style</key>\n\t\t\t<string>UIBarStyleDefault</string>\n\t\t\t<key>Translucent</key>\n\t\t\t<false/>\n\t\t</dict>\n\t</dict>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedExternalAccessoryProtocols</key>\n\t<array>\n\t\t<string>com.getpebble.public</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo/SportsDemo-Prefix.pch",
    "content": "//\n// Prefix header for all source files of the 'SportsDemo' target in the 'SportsDemo' project\n//\n\n#import <Availability.h>\n\n#ifndef __IPHONE_4_0\n#warning \"This project uses features only available in iOS SDK 4.0 and later.\"\n#endif\n\n#ifdef __OBJC__\n  #import <UIKit/UIKit.h>\n  #import <Foundation/Foundation.h>\n#endif\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo/en.lproj/SDAppViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"8.00\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1280</int>\n\t\t<string key=\"IBDocument.SystemVersion\">12C60</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">3084</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1187.34</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">625.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">2083</string>\n\t\t</object>\n\t\t<array key=\"IBDocument.IntegratedClassDependencies\">\n\t\t\t<string>IBProxyObject</string>\n\t\t\t<string>IBUIButton</string>\n\t\t\t<string>IBUITextView</string>\n\t\t\t<string>IBUIView</string>\n\t\t</array>\n\t\t<array key=\"IBDocument.PluginDependencies\">\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</array>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<string key=\"NS.key.0\">PluginDependencyRecalculationVersion</string>\n\t\t\t<integer value=\"1\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<array class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<object class=\"IBProxyObject\" id=\"372490531\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"263589821\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIView\" id=\"191373211\">\n\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t<object class=\"IBUITextView\" id=\"221023520\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t\t\t<string key=\"NSFrameSize\">{320, 276}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MSAxIDEAA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<bool key=\"IBUIMultipleTouchEnabled\">YES</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<bool key=\"IBUIEditable\">NO</bool>\n\t\t\t\t\t\t<string key=\"IBUIText\"/>\n\t\t\t\t\t\t<object class=\"IBUITextInputTraits\" key=\"IBUITextInputTraits\">\n\t\t\t\t\t\t\t<int key=\"IBUIAutocapitalizationType\">2</int>\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\">\n\t\t\t\t\t\t\t<int key=\"type\">1</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">14</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">14</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUIButton\" id=\"904047753\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">266</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 284}, {280, 65}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentHorizontalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIButtonType\">1</int>\n\t\t\t\t\t\t<string key=\"IBUINormalTitle\">Launch</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIHighlightedTitleColor\" id=\"1057852180\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleShadowColor\" id=\"889872547\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MC41AA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\" id=\"53014958\">\n\t\t\t\t\t\t\t<int key=\"type\">2</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">15</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\" id=\"581421605\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica-Bold</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">15</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUIButton\" id=\"926826579\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">266</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 371}, {280, 65}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentHorizontalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIButtonType\">1</int>\n\t\t\t\t\t\t<string key=\"IBUINormalTitle\">Kill</string>\n\t\t\t\t\t\t<reference key=\"IBUIHighlightedTitleColor\" ref=\"1057852180\"/>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"IBUINormalTitleShadowColor\" ref=\"889872547\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"53014958\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"581421605\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t\t<string key=\"NSFrame\">{{0, 64}, {320, 455}}</string>\n\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t<reference key=\"IBUIBackgroundColor\" ref=\"1057852180\"/>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedNavigationBarMetrics\" key=\"IBUISimulatedTopBarMetrics\">\n\t\t\t\t\t<bool key=\"IBUIPrompted\">NO</bool>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBUISimulatedTabBarMetrics\" key=\"IBUISimulatedBottomBarMetrics\"/>\n\t\t\t\t<object class=\"IBUIScreenMetrics\" key=\"IBUISimulatedDestinationMetrics\">\n\t\t\t\t\t<string key=\"IBUISimulatedSizeMetricsClass\">IBUIScreenMetrics</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"IBUINormalizedOrientationToSizeMap\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<array key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<integer value=\"1\"/>\n\t\t\t\t\t\t\t<integer value=\"3\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array key=\"dict.values\">\n\t\t\t\t\t\t\t<string>{320, 568}</string>\n\t\t\t\t\t\t\t<string>{568, 320}</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</object>\n\t\t\t\t\t<string key=\"IBUITargetRuntime\">IBCocoaTouchFramework</string>\n\t\t\t\t\t<string key=\"IBUIDisplayName\">Retina 4 Full Screen</string>\n\t\t\t\t\t<int key=\"IBUIType\">2</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t</array>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<array class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">view</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">3</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_logTextView</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"221023520\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">45</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchEventConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">launchAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"904047753\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t\t<int key=\"IBEventType\">7</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">46</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchEventConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">killAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"926826579\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t\t<int key=\"IBEventType\">7</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">47</int>\n\t\t\t\t</object>\n\t\t\t</array>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<array key=\"orderedObjects\">\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<array key=\"object\" id=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"191373211\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"221023520\"/>\n\t\t\t\t\t\t\t<reference ref=\"926826579\"/>\n\t\t\t\t\t\t\t<reference ref=\"904047753\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"263589821\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">18</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"221023520\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">28</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"904047753\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">40</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"926826579\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t</object>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<string key=\"-1.CustomClassName\">SDAppViewController</string>\n\t\t\t\t<string key=\"-1.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"-2.CustomClassName\">UIResponder</string>\n\t\t\t\t<string key=\"-2.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"1.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"18.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"28.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"40.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t</dictionary>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"unlocalizedProperties\"/>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"localizations\"/>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">47</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<array class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SDAppViewController</string>\n\t\t\t\t\t<string key=\"superclassName\">UIViewController</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/SDAppViewController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</array>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>\n\t\t\t<real value=\"1280\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">2083</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo/en.lproj/SDDataViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"8.00\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1280</int>\n\t\t<string key=\"IBDocument.SystemVersion\">12D78</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">3084</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1187.37</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">626.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t<string key=\"NS.object.0\">2083</string>\n\t\t</object>\n\t\t<array key=\"IBDocument.IntegratedClassDependencies\">\n\t\t\t<string>IBProxyObject</string>\n\t\t\t<string>IBUIButton</string>\n\t\t\t<string>IBUILabel</string>\n\t\t\t<string>IBUISegmentedControl</string>\n\t\t\t<string>IBUISlider</string>\n\t\t\t<string>IBUITextView</string>\n\t\t\t<string>IBUIView</string>\n\t\t</array>\n\t\t<array key=\"IBDocument.PluginDependencies\">\n\t\t\t<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t</array>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<string key=\"NS.key.0\">PluginDependencyRecalculationVersion</string>\n\t\t\t<integer value=\"1\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<array class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1000\">\n\t\t\t<object class=\"IBProxyObject\" id=\"372490531\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFilesOwner</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBProxyObject\" id=\"263589821\">\n\t\t\t\t<string key=\"IBProxiedObjectIdentifier\">IBFirstResponder</string>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t\t<object class=\"IBUIView\" id=\"191373211\">\n\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t<array class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t<object class=\"IBUISlider\" id=\"891731845\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{137, 33}, {165, 23}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"11362645\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentHorizontalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<float key=\"IBUIValue\">615</float>\n\t\t\t\t\t\t<float key=\"IBUIMinValue\">-3600</float>\n\t\t\t\t\t\t<float key=\"IBUIMaxValue\">3600</float>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUISlider\" id=\"310774627\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{137, 90}, {165, 23}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"231123424\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentHorizontalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<float key=\"IBUIValue\">21.5</float>\n\t\t\t\t\t\t<float key=\"IBUIMinValue\">-42.194999694824219</float>\n\t\t\t\t\t\t<float key=\"IBUIMaxValue\">42.194999694824219</float>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUISlider\" id=\"808342873\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{137, 147}, {165, 23}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"608235232\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentHorizontalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<float key=\"IBUIValue\">125</float>\n\t\t\t\t\t\t<float key=\"IBUIMaxValue\">250</float>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"595364284\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{139, 9}, {161, 21}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"891731845\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Time</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUITextColor\" id=\"1038888864\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MCAwIDAAA</bytes>\n\t\t\t\t\t\t\t<string key=\"IBUIColorCocoaTouchKeyPath\">darkTextColor</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\" id=\"545284918\">\n\t\t\t\t\t\t\t<int key=\"type\">1</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">17</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\" id=\"783142302\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">17</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"655424278\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{139, 61}, {280, 21}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"310774627\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Distance</string>\n\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"1038888864\"/>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"545284918\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"783142302\"/>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUILabel\" id=\"623918684\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{139, 118}, {280, 21}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"808342873\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<int key=\"IBUIContentMode\">7</int>\n\t\t\t\t\t\t<bool key=\"IBUIUserInteractionEnabled\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<string key=\"IBUIText\">Data</string>\n\t\t\t\t\t\t<reference key=\"IBUITextColor\" ref=\"1038888864\"/>\n\t\t\t\t\t\t<nil key=\"IBUIHighlightedColor\"/>\n\t\t\t\t\t\t<int key=\"IBUIBaselineAdjustment\">0</int>\n\t\t\t\t\t\t<reference key=\"IBUIFontDescription\" ref=\"545284918\"/>\n\t\t\t\t\t\t<reference key=\"IBUIFont\" ref=\"783142302\"/>\n\t\t\t\t\t\t<bool key=\"IBUIAdjustsFontSizeToFit\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUITextView\" id=\"936456972\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{0, 255}, {320, 200}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIBackgroundColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MSAxIDEAA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<bool key=\"IBUIClipsSubviews\">YES</bool>\n\t\t\t\t\t\t<bool key=\"IBUIMultipleTouchEnabled\">YES</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<bool key=\"IBUIEditable\">NO</bool>\n\t\t\t\t\t\t<string key=\"IBUIText\"/>\n\t\t\t\t\t\t<object class=\"IBUITextInputTraits\" key=\"IBUITextInputTraits\">\n\t\t\t\t\t\t\t<int key=\"IBUIAutocapitalizationType\">2</int>\n\t\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\">\n\t\t\t\t\t\t\t<int key=\"type\">1</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">14</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">14</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUIButton\" id=\"608235232\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{102, 197}, {116, 44}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"936456972\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBUIContentHorizontalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIContentVerticalAlignment\">0</int>\n\t\t\t\t\t\t<int key=\"IBUIButtonType\">1</int>\n\t\t\t\t\t\t<string key=\"IBUINormalTitle\">Send Update</string>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUIHighlightedTitleColor\" id=\"779778186\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSColor\" key=\"IBUINormalTitleShadowColor\">\n\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MC41AA</bytes>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"IBUIFontDescription\" key=\"IBUIFontDescription\">\n\t\t\t\t\t\t\t<int key=\"type\">2</int>\n\t\t\t\t\t\t\t<double key=\"pointSize\">15</double>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSFont\" key=\"IBUIFont\">\n\t\t\t\t\t\t\t<string key=\"NSName\">Helvetica-Bold</string>\n\t\t\t\t\t\t\t<double key=\"NSSize\">15</double>\n\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUISegmentedControl\" id=\"793119812\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{28, 20}, {85, 44}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"595364284\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBNumberOfSegments\">2</int>\n\t\t\t\t\t\t<int key=\"IBSelectedSegmentIndex\">0</int>\n\t\t\t\t\t\t<array key=\"IBSegmentTitles\">\n\t\t\t\t\t\t\t<string>||</string>\n\t\t\t\t\t\t\t<string>&gt;</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentWidths\">\n\t\t\t\t\t\t\t<real value=\"0.0\"/>\n\t\t\t\t\t\t\t<real value=\"0.0\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentEnabledStates\">\n\t\t\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentContentOffsets\">\n\t\t\t\t\t\t\t<string>{0, 0}</string>\n\t\t\t\t\t\t\t<string>{0, 0}</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentImages\">\n\t\t\t\t\t\t\t<object class=\"NSNull\" id=\"4\"/>\n\t\t\t\t\t\t\t<reference ref=\"4\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUISegmentedControl\" id=\"231123424\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{10, 136}, {121, 44}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"623918684\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBNumberOfSegments\">2</int>\n\t\t\t\t\t\t<int key=\"IBSelectedSegmentIndex\">0</int>\n\t\t\t\t\t\t<array key=\"IBSegmentTitles\">\n\t\t\t\t\t\t\t<string>pace</string>\n\t\t\t\t\t\t\t<string>speed</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentWidths\">\n\t\t\t\t\t\t\t<real value=\"0.0\"/>\n\t\t\t\t\t\t\t<real value=\"0.0\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentEnabledStates\">\n\t\t\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentContentOffsets\">\n\t\t\t\t\t\t\t<string>{0, 0}</string>\n\t\t\t\t\t\t\t<string>{0, 0}</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentImages\">\n\t\t\t\t\t\t\t<reference ref=\"4\"/>\n\t\t\t\t\t\t\t<reference ref=\"4\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBUISegmentedControl\" id=\"11362645\">\n\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"191373211\"/>\n\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t<string key=\"NSFrame\">{{10, 79}, {121, 44}}</string>\n\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"191373211\"/>\n\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"655424278\"/>\n\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t<bool key=\"IBUIOpaque\">NO</bool>\n\t\t\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t\t\t\t<int key=\"IBNumberOfSegments\">2</int>\n\t\t\t\t\t\t<int key=\"IBSelectedSegmentIndex\">0</int>\n\t\t\t\t\t\t<array key=\"IBSegmentTitles\">\n\t\t\t\t\t\t\t<string>Imp.</string>\n\t\t\t\t\t\t\t<string>Met.</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentWidths\">\n\t\t\t\t\t\t\t<real value=\"0.0\"/>\n\t\t\t\t\t\t\t<real value=\"0.0\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentEnabledStates\">\n\t\t\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentContentOffsets\">\n\t\t\t\t\t\t\t<string>{0, 0}</string>\n\t\t\t\t\t\t\t<string>{0, 0}</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"IBSegmentImages\">\n\t\t\t\t\t\t\t<reference ref=\"4\"/>\n\t\t\t\t\t\t\t<reference ref=\"4\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t\t<string key=\"NSFrame\">{{0, 64}, {320, 455}}</string>\n\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"793119812\"/>\n\t\t\t\t<reference key=\"IBUIBackgroundColor\" ref=\"779778186\"/>\n\t\t\t\t<object class=\"IBUISimulatedStatusBarMetrics\" key=\"IBUISimulatedStatusBarMetrics\"/>\n\t\t\t\t<object class=\"IBUISimulatedNavigationBarMetrics\" key=\"IBUISimulatedTopBarMetrics\">\n\t\t\t\t\t<bool key=\"IBUIPrompted\">NO</bool>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBUISimulatedTabBarMetrics\" key=\"IBUISimulatedBottomBarMetrics\"/>\n\t\t\t\t<object class=\"IBUIScreenMetrics\" key=\"IBUISimulatedDestinationMetrics\">\n\t\t\t\t\t<string key=\"IBUISimulatedSizeMetricsClass\">IBUIScreenMetrics</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"IBUINormalizedOrientationToSizeMap\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<array key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<integer value=\"1\"/>\n\t\t\t\t\t\t\t<integer value=\"3\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<array key=\"dict.values\">\n\t\t\t\t\t\t\t<string>{320, 568}</string>\n\t\t\t\t\t\t\t<string>{568, 320}</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</object>\n\t\t\t\t\t<string key=\"IBUITargetRuntime\">IBCocoaTouchFramework</string>\n\t\t\t\t\t<string key=\"IBUIDisplayName\">Retina 4 Full Screen</string>\n\t\t\t\t\t<int key=\"IBUIType\">2</int>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"targetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t\t</object>\n\t\t</array>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<array class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">view</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">3</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_labels</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"595364284\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">73</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_labels</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"655424278\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">74</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_labels</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"623918684\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">76</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_sliders</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"891731845\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">79</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_sliders</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"310774627\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">80</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletCollectionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_sliders</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"808342873\"/>\n\t\t\t\t\t\t<string key=\"cachedDesigntimeCollectionClassName\">NSArray</string>\n\t\t\t\t\t\t<bool key=\"addsContentToExistingCollection\">NO</bool>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">81</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_logTextView</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"936456972\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">103</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">_activityStateSegmentedControl</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"793119812\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">109</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchEventConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">sliderAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"891731845\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t\t<int key=\"IBEventType\">13</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">82</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchEventConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">sliderAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"310774627\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t\t<int key=\"IBEventType\">13</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">84</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchEventConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">sliderAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"808342873\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t\t<int key=\"IBEventType\">13</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">85</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchEventConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">updateAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"608235232\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t\t<int key=\"IBEventType\">7</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">102</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchEventConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">stateAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"793119812\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t\t<int key=\"IBEventType\">13</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">108</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchEventConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">paceAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"231123424\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t\t<int key=\"IBEventType\">13</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">111</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBCocoaTouchEventConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">unitAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"11362645\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"372490531\"/>\n\t\t\t\t\t\t<int key=\"IBEventType\">13</int>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">114</int>\n\t\t\t\t</object>\n\t\t\t</array>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<array key=\"orderedObjects\">\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<array key=\"object\" id=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1000\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"191373211\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<reference ref=\"891731845\"/>\n\t\t\t\t\t\t\t<reference ref=\"595364284\"/>\n\t\t\t\t\t\t\t<reference ref=\"310774627\"/>\n\t\t\t\t\t\t\t<reference ref=\"808342873\"/>\n\t\t\t\t\t\t\t<reference ref=\"623918684\"/>\n\t\t\t\t\t\t\t<reference ref=\"655424278\"/>\n\t\t\t\t\t\t\t<reference ref=\"608235232\"/>\n\t\t\t\t\t\t\t<reference ref=\"936456972\"/>\n\t\t\t\t\t\t\t<reference ref=\"793119812\"/>\n\t\t\t\t\t\t\t<reference ref=\"11362645\"/>\n\t\t\t\t\t\t\t<reference ref=\"231123424\"/>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"372490531\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"263589821\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">18</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"891731845\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">25</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"310774627\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">29</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"808342873\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">33</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"595364284\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">36</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"655424278\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">40</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"623918684\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">60</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"936456972\"/>\n\t\t\t\t\t\t<array class=\"NSMutableArray\" key=\"children\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">101</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"608235232\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">107</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"793119812\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">110</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"231123424\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">112</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"11362645\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"191373211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</array>\n\t\t\t</object>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<string key=\"-1.CustomClassName\">SDDataViewController</string>\n\t\t\t\t<string key=\"-1.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"-2.CustomClassName\">UIResponder</string>\n\t\t\t\t<string key=\"-2.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"1.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"101.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"107.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"110.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"112.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"18.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"25.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"29.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"33.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"36.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"40.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t\t<string key=\"60.IBPluginDependency\">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>\n\t\t\t</dictionary>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"unlocalizedProperties\"/>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<dictionary class=\"NSMutableDictionary\" key=\"localizations\"/>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">115</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\"/>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaTouchFramework</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>\n\t\t\t<real value=\"1280\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<string key=\"IBCocoaTouchPluginVersion\">2083</string>\n\t</data>\n</archive>\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo/main.m",
    "content": "//\n//  main.m\n//  SportsDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n#import \"SDAppDelegate.h\"\n\nint main(int argc, char *argv[])\n{\n  @autoreleasepool {\n      return UIApplicationMain(argc, argv, nil, NSStringFromClass([SDAppDelegate class]));\n  }\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1030EB5E16C4DB1A006F46EA /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1030EB5D16C4DB1A006F46EA /* UIKit.framework */; };\n\t\t1030EB6016C4DB1A006F46EA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1030EB5F16C4DB1A006F46EA /* Foundation.framework */; };\n\t\t1030EB6216C4DB1A006F46EA /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1030EB6116C4DB1A006F46EA /* CoreGraphics.framework */; };\n\t\t1030EB6816C4DB1A006F46EA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB6616C4DB1A006F46EA /* InfoPlist.strings */; };\n\t\t1030EB6A16C4DB1A006F46EA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1030EB6916C4DB1A006F46EA /* main.m */; };\n\t\t1030EB6E16C4DB1A006F46EA /* SDAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1030EB6D16C4DB1A006F46EA /* SDAppDelegate.m */; };\n\t\t1030EB7016C4DB1A006F46EA /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB6F16C4DB1A006F46EA /* Default.png */; };\n\t\t1030EB7216C4DB1A006F46EA /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB7116C4DB1A006F46EA /* Default@2x.png */; };\n\t\t1030EB7416C4DB1A006F46EA /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB7316C4DB1A006F46EA /* Default-568h@2x.png */; };\n\t\t1030EB7716C4DB1A006F46EA /* SDAppViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1030EB7616C4DB1A006F46EA /* SDAppViewController.m */; };\n\t\t1030EB7916C4DB1A006F46EA /* first.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB7816C4DB1A006F46EA /* first.png */; };\n\t\t1030EB7B16C4DB1A006F46EA /* first@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB7A16C4DB1A006F46EA /* first@2x.png */; };\n\t\t1030EB7E16C4DB1A006F46EA /* SDDataViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1030EB7D16C4DB1A006F46EA /* SDDataViewController.m */; };\n\t\t1030EB8016C4DB1A006F46EA /* second.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB7F16C4DB1A006F46EA /* second.png */; };\n\t\t1030EB8216C4DB1A006F46EA /* second@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB8116C4DB1A006F46EA /* second@2x.png */; };\n\t\t1030EB8516C4DB1A006F46EA /* SDAppViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB8316C4DB1A006F46EA /* SDAppViewController.xib */; };\n\t\t1030EB8816C4DB1A006F46EA /* SDDataViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB8616C4DB1A006F46EA /* SDDataViewController.xib */; };\n\t\t1030EB9616C4DECC006F46EA /* ExternalAccessory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1030EB9516C4DECC006F46EA /* ExternalAccessory.framework */; };\n\t\t104820FE16C5970F00F2AFC8 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 104820FD16C5970F00F2AFC8 /* libz.dylib */; };\n\t\t1048210016C5972E00F2AFC8 /* CoreBluetooth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 104820FF16C5972E00F2AFC8 /* CoreBluetooth.framework */; };\n\t\t1048210216C5973B00F2AFC8 /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1048210116C5973B00F2AFC8 /* CoreMotion.framework */; };\n\t\t1048210416C5974800F2AFC8 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1048210316C5974800F2AFC8 /* MessageUI.framework */; };\n\t\t10B6DA0716FFF89F0079E460 /* SDIconViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 10B6DA0516FFF89F0079E460 /* SDIconViewController.m */; };\n\t\t10B6DA0816FFF89F0079E460 /* SDIconViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 10B6DA0616FFF89F0079E460 /* SDIconViewController.xib */; };\n\t\t10B6DA0A16FFFC960079E460 /* bike.png in Resources */ = {isa = PBXBuildFile; fileRef = 10B6DA0916FFFC960079E460 /* bike.png */; };\n\t\t10B6DA0C16FFFDA90079E460 /* barefoot.png in Resources */ = {isa = PBXBuildFile; fileRef = 10B6DA0B16FFFDA90079E460 /* barefoot.png */; };\n\t\t2ABD333B182A003B0077C1C8 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2ABD333A182A003B0077C1C8 /* CFNetwork.framework */; };\n\t\tCC681FEF86EF48CD98E30F0B /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 408364FC1CD9451A8C117004 /* libPods.a */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t1030EB5A16C4DB1A006F46EA /* SportsDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SportsDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1030EB5D16C4DB1A006F46EA /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };\n\t\t1030EB5F16C4DB1A006F46EA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t1030EB6116C4DB1A006F46EA /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };\n\t\t1030EB6516C4DB1A006F46EA /* SportsDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"SportsDemo-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t1030EB6716C4DB1A006F46EA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t1030EB6916C4DB1A006F46EA /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t1030EB6B16C4DB1A006F46EA /* SportsDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"SportsDemo-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t1030EB6C16C4DB1A006F46EA /* SDAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDAppDelegate.h; sourceTree = \"<group>\"; };\n\t\t1030EB6D16C4DB1A006F46EA /* SDAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDAppDelegate.m; sourceTree = \"<group>\"; };\n\t\t1030EB6F16C4DB1A006F46EA /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = \"<group>\"; };\n\t\t1030EB7116C4DB1A006F46EA /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Default@2x.png\"; sourceTree = \"<group>\"; };\n\t\t1030EB7316C4DB1A006F46EA /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Default-568h@2x.png\"; sourceTree = \"<group>\"; };\n\t\t1030EB7516C4DB1A006F46EA /* SDAppViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDAppViewController.h; sourceTree = \"<group>\"; };\n\t\t1030EB7616C4DB1A006F46EA /* SDAppViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDAppViewController.m; sourceTree = \"<group>\"; };\n\t\t1030EB7816C4DB1A006F46EA /* first.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = first.png; sourceTree = \"<group>\"; };\n\t\t1030EB7A16C4DB1A006F46EA /* first@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"first@2x.png\"; sourceTree = \"<group>\"; };\n\t\t1030EB7C16C4DB1A006F46EA /* SDDataViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDDataViewController.h; sourceTree = \"<group>\"; };\n\t\t1030EB7D16C4DB1A006F46EA /* SDDataViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDDataViewController.m; sourceTree = \"<group>\"; };\n\t\t1030EB7F16C4DB1A006F46EA /* second.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = second.png; sourceTree = \"<group>\"; };\n\t\t1030EB8116C4DB1A006F46EA /* second@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"second@2x.png\"; sourceTree = \"<group>\"; };\n\t\t1030EB8416C4DB1A006F46EA /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/SDAppViewController.xib; sourceTree = \"<group>\"; };\n\t\t1030EB8716C4DB1A006F46EA /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/SDDataViewController.xib; sourceTree = \"<group>\"; };\n\t\t1030EB9516C4DECC006F46EA /* ExternalAccessory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ExternalAccessory.framework; path = System/Library/Frameworks/ExternalAccessory.framework; sourceTree = SDKROOT; };\n\t\t104820FD16C5970F00F2AFC8 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.dylib\"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };\n\t\t104820FF16C5972E00F2AFC8 /* CoreBluetooth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreBluetooth.framework; path = System/Library/Frameworks/CoreBluetooth.framework; sourceTree = SDKROOT; };\n\t\t1048210116C5973B00F2AFC8 /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; };\n\t\t1048210316C5974800F2AFC8 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; };\n\t\t10B6DA0416FFF89F0079E460 /* SDIconViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDIconViewController.h; sourceTree = \"<group>\"; };\n\t\t10B6DA0516FFF89F0079E460 /* SDIconViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDIconViewController.m; sourceTree = \"<group>\"; };\n\t\t10B6DA0616FFF89F0079E460 /* SDIconViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SDIconViewController.xib; sourceTree = \"<group>\"; };\n\t\t10B6DA0916FFFC960079E460 /* bike.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bike.png; sourceTree = \"<group>\"; };\n\t\t10B6DA0B16FFFDA90079E460 /* barefoot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = barefoot.png; sourceTree = \"<group>\"; };\n\t\t2ABD333A182A003B0077C1C8 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; };\n\t\t408364FC1CD9451A8C117004 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tB3618B9941FF43ABA5D5A95A /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.xcconfig; path = Pods/Pods.xcconfig; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t1030EB5716C4DB1A006F46EA /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2ABD333B182A003B0077C1C8 /* CFNetwork.framework in Frameworks */,\n\t\t\t\t1048210416C5974800F2AFC8 /* MessageUI.framework in Frameworks */,\n\t\t\t\t1048210216C5973B00F2AFC8 /* CoreMotion.framework in Frameworks */,\n\t\t\t\t1048210016C5972E00F2AFC8 /* CoreBluetooth.framework in Frameworks */,\n\t\t\t\t104820FE16C5970F00F2AFC8 /* libz.dylib in Frameworks */,\n\t\t\t\t1030EB9616C4DECC006F46EA /* ExternalAccessory.framework in Frameworks */,\n\t\t\t\t1030EB5E16C4DB1A006F46EA /* UIKit.framework in Frameworks */,\n\t\t\t\t1030EB6016C4DB1A006F46EA /* Foundation.framework in Frameworks */,\n\t\t\t\t1030EB6216C4DB1A006F46EA /* CoreGraphics.framework in Frameworks */,\n\t\t\t\tCC681FEF86EF48CD98E30F0B /* libPods.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t1030EB5116C4DB1A006F46EA = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB6316C4DB1A006F46EA /* SportsDemo */,\n\t\t\t\t1030EB5C16C4DB1A006F46EA /* Frameworks */,\n\t\t\t\t1030EB5B16C4DB1A006F46EA /* Products */,\n\t\t\t\tB3618B9941FF43ABA5D5A95A /* Pods.xcconfig */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1030EB5B16C4DB1A006F46EA /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB5A16C4DB1A006F46EA /* SportsDemo.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1030EB5C16C4DB1A006F46EA /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2ABD333A182A003B0077C1C8 /* CFNetwork.framework */,\n\t\t\t\t1048210316C5974800F2AFC8 /* MessageUI.framework */,\n\t\t\t\t1048210116C5973B00F2AFC8 /* CoreMotion.framework */,\n\t\t\t\t104820FF16C5972E00F2AFC8 /* CoreBluetooth.framework */,\n\t\t\t\t104820FD16C5970F00F2AFC8 /* libz.dylib */,\n\t\t\t\t1030EB9516C4DECC006F46EA /* ExternalAccessory.framework */,\n\t\t\t\t1030EB5D16C4DB1A006F46EA /* UIKit.framework */,\n\t\t\t\t1030EB5F16C4DB1A006F46EA /* Foundation.framework */,\n\t\t\t\t1030EB6116C4DB1A006F46EA /* CoreGraphics.framework */,\n\t\t\t\t408364FC1CD9451A8C117004 /* libPods.a */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1030EB6316C4DB1A006F46EA /* SportsDemo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB6C16C4DB1A006F46EA /* SDAppDelegate.h */,\n\t\t\t\t1030EB6D16C4DB1A006F46EA /* SDAppDelegate.m */,\n\t\t\t\t10B6DA0416FFF89F0079E460 /* SDIconViewController.h */,\n\t\t\t\t10B6DA0516FFF89F0079E460 /* SDIconViewController.m */,\n\t\t\t\t10B6DA0616FFF89F0079E460 /* SDIconViewController.xib */,\n\t\t\t\t1030EB7516C4DB1A006F46EA /* SDAppViewController.h */,\n\t\t\t\t1030EB7616C4DB1A006F46EA /* SDAppViewController.m */,\n\t\t\t\t1030EB8316C4DB1A006F46EA /* SDAppViewController.xib */,\n\t\t\t\t1030EB7816C4DB1A006F46EA /* first.png */,\n\t\t\t\t1030EB7A16C4DB1A006F46EA /* first@2x.png */,\n\t\t\t\t1030EB7C16C4DB1A006F46EA /* SDDataViewController.h */,\n\t\t\t\t1030EB7D16C4DB1A006F46EA /* SDDataViewController.m */,\n\t\t\t\t1030EB8616C4DB1A006F46EA /* SDDataViewController.xib */,\n\t\t\t\t1030EB7F16C4DB1A006F46EA /* second.png */,\n\t\t\t\t1030EB8116C4DB1A006F46EA /* second@2x.png */,\n\t\t\t\t10B6DA0916FFFC960079E460 /* bike.png */,\n\t\t\t\t10B6DA0B16FFFDA90079E460 /* barefoot.png */,\n\t\t\t\t1030EB6416C4DB1A006F46EA /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = SportsDemo;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1030EB6416C4DB1A006F46EA /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB6516C4DB1A006F46EA /* SportsDemo-Info.plist */,\n\t\t\t\t1030EB6616C4DB1A006F46EA /* InfoPlist.strings */,\n\t\t\t\t1030EB6916C4DB1A006F46EA /* main.m */,\n\t\t\t\t1030EB6B16C4DB1A006F46EA /* SportsDemo-Prefix.pch */,\n\t\t\t\t1030EB6F16C4DB1A006F46EA /* Default.png */,\n\t\t\t\t1030EB7116C4DB1A006F46EA /* Default@2x.png */,\n\t\t\t\t1030EB7316C4DB1A006F46EA /* Default-568h@2x.png */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t1030EB5916C4DB1A006F46EA /* SportsDemo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1030EB8B16C4DB1B006F46EA /* Build configuration list for PBXNativeTarget \"SportsDemo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tEC1803460A2A41D3800F4613 /* Check Pods Manifest.lock */,\n\t\t\t\t1030EB5616C4DB1A006F46EA /* Sources */,\n\t\t\t\t1030EB5716C4DB1A006F46EA /* Frameworks */,\n\t\t\t\t1030EB5816C4DB1A006F46EA /* Resources */,\n\t\t\t\tBC9F230C01B746408F934B4A /* Copy Pods Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = SportsDemo;\n\t\t\tproductName = SportsDemo;\n\t\t\tproductReference = 1030EB5A16C4DB1A006F46EA /* SportsDemo.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t1030EB5216C4DB1A006F46EA /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tCLASSPREFIX = SD;\n\t\t\t\tLastUpgradeCheck = 0460;\n\t\t\t\tORGANIZATIONNAME = \"Pebble Technology Corp.\";\n\t\t\t};\n\t\t\tbuildConfigurationList = 1030EB5516C4DB1A006F46EA /* Build configuration list for PBXProject \"SportsDemo\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 1030EB5116C4DB1A006F46EA;\n\t\t\tproductRefGroup = 1030EB5B16C4DB1A006F46EA /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t1030EB5916C4DB1A006F46EA /* SportsDemo */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t1030EB5816C4DB1A006F46EA /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1030EB6816C4DB1A006F46EA /* InfoPlist.strings in Resources */,\n\t\t\t\t1030EB7016C4DB1A006F46EA /* Default.png in Resources */,\n\t\t\t\t1030EB7216C4DB1A006F46EA /* Default@2x.png in Resources */,\n\t\t\t\t1030EB7416C4DB1A006F46EA /* Default-568h@2x.png in Resources */,\n\t\t\t\t1030EB7916C4DB1A006F46EA /* first.png in Resources */,\n\t\t\t\t1030EB7B16C4DB1A006F46EA /* first@2x.png in Resources */,\n\t\t\t\t1030EB8016C4DB1A006F46EA /* second.png in Resources */,\n\t\t\t\t1030EB8216C4DB1A006F46EA /* second@2x.png in Resources */,\n\t\t\t\t1030EB8516C4DB1A006F46EA /* SDAppViewController.xib in Resources */,\n\t\t\t\t1030EB8816C4DB1A006F46EA /* SDDataViewController.xib in Resources */,\n\t\t\t\t10B6DA0816FFF89F0079E460 /* SDIconViewController.xib in Resources */,\n\t\t\t\t10B6DA0A16FFFC960079E460 /* bike.png in Resources */,\n\t\t\t\t10B6DA0C16FFFDA90079E460 /* barefoot.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\tBC9F230C01B746408F934B4A /* Copy Pods Resources */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Copy Pods Resources\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/Pods/Pods-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tEC1803460A2A41D3800F4613 /* Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Check Pods Manifest.lock\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_ROOT}/../Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [[ $? != 0 ]] ; then\\n    cat << EOM\\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\nEOM\\n    exit 1\\nfi\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t1030EB5616C4DB1A006F46EA /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1030EB6A16C4DB1A006F46EA /* main.m in Sources */,\n\t\t\t\t1030EB6E16C4DB1A006F46EA /* SDAppDelegate.m in Sources */,\n\t\t\t\t1030EB7716C4DB1A006F46EA /* SDAppViewController.m in Sources */,\n\t\t\t\t1030EB7E16C4DB1A006F46EA /* SDDataViewController.m in Sources */,\n\t\t\t\t10B6DA0716FFF89F0079E460 /* SDIconViewController.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t1030EB6616C4DB1A006F46EA /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB6716C4DB1A006F46EA /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1030EB8316C4DB1A006F46EA /* SDAppViewController.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB8416C4DB1A006F46EA /* en */,\n\t\t\t);\n\t\t\tname = SDAppViewController.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1030EB8616C4DB1A006F46EA /* SDDataViewController.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB8716C4DB1A006F46EA /* en */,\n\t\t\t);\n\t\t\tname = SDDataViewController.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t1030EB8916C4DB1A006F46EA /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.1;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1030EB8A16C4DB1A006F46EA /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.1;\n\t\t\t\tOTHER_CFLAGS = \"-DNS_BLOCK_ASSERTIONS=1\";\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1030EB8C16C4DB1B006F46EA /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = B3618B9941FF43ABA5D5A95A /* Pods.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"SportsDemo/SportsDemo-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"SportsDemo/SportsDemo-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1030EB8D16C4DB1B006F46EA /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = B3618B9941FF43ABA5D5A95A /* Pods.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"SportsDemo/SportsDemo-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"SportsDemo/SportsDemo-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1030EB5516C4DB1A006F46EA /* Build configuration list for PBXProject \"SportsDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1030EB8916C4DB1A006F46EA /* Debug */,\n\t\t\t\t1030EB8A16C4DB1A006F46EA /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1030EB8B16C4DB1B006F46EA /* Build configuration list for PBXNativeTarget \"SportsDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1030EB8C16C4DB1B006F46EA /* Debug */,\n\t\t\t\t1030EB8D16C4DB1B006F46EA /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 1030EB5216C4DB1A006F46EA /* Project object */;\n}\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:SportsDemo.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo.xcodeproj/project.xcworkspace/xcshareddata/SportsDemo.xccheckout",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDESourceControlProjectIdentifier</key>\n\t<string>DBB11C62-7E67-47B1-A59F-9AADA79275BF</string>\n\t<key>IDESourceControlProjectName</key>\n\t<string>SportsDemo</string>\n\t<key>IDESourceControlProjectOriginsDictionary</key>\n\t<dict>\n\t\t<key>630595BA-D44E-488F-AADC-D591EB6CCAA1</key>\n\t\t<string>ssh://github.com/pebble/pebblesdk-examples.git</string>\n\t</dict>\n\t<key>IDESourceControlProjectPath</key>\n\t<string>sports-demo/SportsDemo-iOS/SportsDemo.xcodeproj/project.xcworkspace</string>\n\t<key>IDESourceControlProjectRelativeInstallPathDictionary</key>\n\t<dict>\n\t\t<key>630595BA-D44E-488F-AADC-D591EB6CCAA1</key>\n\t\t<string>../../../..</string>\n\t</dict>\n\t<key>IDESourceControlProjectURL</key>\n\t<string>ssh://github.com/pebble/pebblesdk-examples.git</string>\n\t<key>IDESourceControlProjectVersion</key>\n\t<integer>110</integer>\n\t<key>IDESourceControlProjectWCCIdentifier</key>\n\t<string>630595BA-D44E-488F-AADC-D591EB6CCAA1</string>\n\t<key>IDESourceControlProjectWCConfigurations</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>IDESourceControlRepositoryExtensionIdentifierKey</key>\n\t\t\t<string>public.vcs.git</string>\n\t\t\t<key>IDESourceControlWCCIdentifierKey</key>\n\t\t\t<string>630595BA-D44E-488F-AADC-D591EB6CCAA1</string>\n\t\t\t<key>IDESourceControlWCCName</key>\n\t\t\t<string>pebblesdk-examples</string>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "sports-demo/SportsDemo-iOS/SportsDemo.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version='1.0' encoding='UTF-8'?><Workspace version='1.0'><FileRef location='group:SportsDemo.xcodeproj'/><FileRef location='group:Pods/Pods.xcodeproj'/></Workspace>"
  },
  {
    "path": "watchapps/app_font_browser/README.md",
    "content": "# app_font_browser\n\n![screenshot](app_font_browser-screenshot.png)\n\nThis example show how to load and display all the Pebble built-in system fonts. \n\nIt also uses the [`Clicks`](https://developer.getpebble.com/docs/c/group___clicks.html) API to allow the user to cycle through each font in both\ndirections.\n"
  },
  {
    "path": "watchapps/app_font_browser/appinfo.json",
    "content": "{\n  \"uuid\": \"75f25e48-c4c0-402f-a935-fcb7857d1ed4\",\n  \"shortName\": \"Font Browser\",\n  \"longName\": \"Font Browser\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/app_font_browser/src/app_font_browser.c",
    "content": "/*\n * This app uses two Windows:\n *  - s_main_window which uses a MenuLayer to display a list of fonts;\n *  - s_font_window.\n *\n * The font window uses three TextLayers:\n *  - to display a sample of text at the top of the screen (s_text_layer),\n *  - to display at the bottom of the screen the name (s_font_name_layer),\n *  - and variant (s_font_variant_layer) of the currently selected font.\n */\n\n#include \"pebble.h\"\n\n#define NUM_FONTS 16\n#define NUM_MESSAGES 3\n\ntypedef struct {\n char *name;\n char *variant;\n char *res;\n} PebbleFont;\n\nstatic PebbleFont pebble_fonts[] = {\n { .name = \"Gothic\", .variant = \"14\", .res = FONT_KEY_GOTHIC_14 },\n { .name = \"Gothic\", .variant = \"14 Bold\", .res = FONT_KEY_GOTHIC_14_BOLD },\n { .name = \"Gothic\", .variant = \"18\", .res = FONT_KEY_GOTHIC_18 },\n { .name = \"Gothic\", .variant = \"18 Bold\", .res = FONT_KEY_GOTHIC_18_BOLD },\n { .name = \"Gothic\", .variant = \"24\", .res = FONT_KEY_GOTHIC_24 },\n { .name = \"Gothic\", .variant = \"24 Bold\", .res = FONT_KEY_GOTHIC_24_BOLD },\n { .name = \"Gothic\", .variant = \"28\", .res = FONT_KEY_GOTHIC_28 },\n { .name = \"Gothic\", .variant = \"28 Bold\", .res = FONT_KEY_GOTHIC_28_BOLD },\n\n { .name = \"Bitham\", .variant = \"30 Black\", .res = FONT_KEY_BITHAM_30_BLACK },\n { .name = \"Bitham\", .variant = \"42 Bold\", .res = FONT_KEY_BITHAM_42_BOLD },\n { .name = \"Bitham\", .variant = \"42 Light\", .res = FONT_KEY_BITHAM_42_LIGHT },\n\n { .name = \"Bitham\", .variant = \"34 Medium Numbers\", .res = FONT_KEY_BITHAM_34_MEDIUM_NUMBERS },\n { .name = \"Bitham\", .variant = \"42 Medium Numbers\", .res = FONT_KEY_BITHAM_42_MEDIUM_NUMBERS },\n\n { .name = \"Roboto\", .variant = \"21 Condensed\", .res = FONT_KEY_ROBOTO_CONDENSED_21 },\n { .name = \"Roboto\", .variant = \"49 Bold Subset\", .res = FONT_KEY_ROBOTO_BOLD_SUBSET_49 },\n { .name = \"Droid\",  .variant = \"28 Bold\", .res = FONT_KEY_DROID_SERIF_28_BOLD }\n};\n\nstatic char *s_messages[] = {\n  \"0123456789\",\n  \"abcdef ABCDEF\",\n  \"09:42\"\n};\n\nstatic Window *s_main_window, *s_font_window;\nstatic MenuLayer *s_menu_layer;\nstatic TextLayer *s_text_layer, *s_font_name_layer, *s_font_variant_layer, *s_font_size_layer;\n\n/* Store the index of the currently selected font and text message. */\nstatic int s_current_font;\nstatic int s_current_message;\n\n/* Text buffer for the size required to display font and message */\nstatic char s_size_text[256] = \"size\";\n\nstatic uint16_t get_num_rows(struct MenuLayer* menu_layer, uint16_t section_index, void *callback_context) {\n  return NUM_FONTS;\n}\n\nstatic void draw_row(GContext *ctx, const Layer *cell_layer, MenuIndex *cell_index, void *callback_context) {\n  PebbleFont *font_array = (PebbleFont*) callback_context;\n  PebbleFont *this_font = &font_array[cell_index->row];\n\n  menu_cell_basic_draw(ctx, cell_layer, this_font->name, this_font->variant, NULL);\n}\n\nstatic void select_click(struct MenuLayer *menu_layer, MenuIndex *cell_index, void *callback_context) {\n  s_current_font = cell_index->row;\n\n  window_stack_push(s_font_window, true);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n\n  s_menu_layer = menu_layer_create(layer_get_bounds(window_layer));\n  menu_layer_set_callbacks(s_menu_layer, pebble_fonts, (MenuLayerCallbacks) {\n    .get_num_rows = get_num_rows,\n    .draw_row = draw_row,\n    .select_click = select_click\n  });\n  menu_layer_set_click_config_onto_window(s_menu_layer, window);\n\n  layer_add_child(window_layer, menu_layer_get_layer(s_menu_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  menu_layer_destroy(s_menu_layer);\n}\n\n/*\n * Update the font window with the currently selected font.\n *\n * This is called:\n *  - When the s_font_window is initialized\n *  - When the user presses up/down/select in the font window\n */\nstatic void show_selected_font_and_message() {\n  PebbleFont *font = &pebble_fonts[s_current_font];\n\n  // Update the font and text for the demo message\n  text_layer_set_font(s_text_layer, fonts_get_system_font(font->res));\n  text_layer_set_text(s_text_layer, s_messages[s_current_message]);\n\n  // Update the font name and font variant at the bottom of the screen\n  text_layer_set_text(s_font_name_layer, font->name);\n  text_layer_set_text(s_font_variant_layer, font->variant);\n\n  // Update Font Size Layer\n  GSize textSize = text_layer_get_content_size(s_text_layer);\n  snprintf(s_size_text, sizeof(s_size_text), \"H: %d W: %d\", textSize.h, textSize.w);\n\n  text_layer_set_text(s_font_size_layer, s_size_text);\n}\n\nstatic void select_click_handler(ClickRecognizerRef recognizer, void *context) {\n  s_current_message++;\n  if ((unsigned)s_current_message >= NUM_MESSAGES) {\n    s_current_message = 0;\n  }\n\n  show_selected_font_and_message();\n}\n\nstatic void up_click_handler(ClickRecognizerRef recognizer, void *context) {\n  s_current_font--;\n  if (s_current_font < 0) {\n    s_current_font = NUM_FONTS - 1;\n  }\n\n  MenuIndex idx = menu_layer_get_selected_index(s_menu_layer);\n  idx.row = s_current_font;\n  menu_layer_set_selected_index(s_menu_layer, idx, MenuRowAlignCenter, false);\n  \n  show_selected_font_and_message();\n}\n\nstatic void down_click_handler(ClickRecognizerRef recognizer, void *context) {\n  s_current_font++;\n  if ((unsigned)s_current_font >= NUM_FONTS) {\n    s_current_font = 0;\n  }\n\n  MenuIndex idx = menu_layer_get_selected_index(s_menu_layer);\n  idx.row = s_current_font;\n  menu_layer_set_selected_index(s_menu_layer, idx, MenuRowAlignCenter, false);\n  \n  show_selected_font_and_message();\n}\n\nstatic void click_config_provider(void *context) {\n  window_single_click_subscribe(BUTTON_ID_SELECT, (ClickHandler)select_click_handler);\n  window_single_click_subscribe(BUTTON_ID_UP, (ClickHandler)up_click_handler);\n  window_single_click_subscribe(BUTTON_ID_DOWN, (ClickHandler)down_click_handler);\n}\n\nstatic void font_window_load(Window *window) {\n  // Define some event handlers for clicks\n  window_set_click_config_provider(window, (ClickConfigProvider) click_config_provider);\n\n  Layer *window_layer = window_get_root_layer(window);\n  GRect window_bounds = layer_get_bounds(window_layer);\n\n  // Arrange the three text layers on top of each other\n  window_bounds.size.h -= 40;\n  s_text_layer = text_layer_create(window_bounds);\n\n  window_bounds.origin.x = 2;\n  window_bounds.size.w -= 4;\n\n  window_bounds.origin.y += window_bounds.size.h;\n  window_bounds.size.h = 18;\n\n  s_font_name_layer = text_layer_create(window_bounds);\n  text_layer_set_font(s_font_name_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD));\n\n  window_bounds.origin.y += window_bounds.size.h;\n  s_font_variant_layer = text_layer_create(window_bounds);\n  text_layer_set_font(s_font_variant_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD));\n\n  window_bounds.origin.y -= 2.0 * window_bounds.size.h;\n  s_font_size_layer = text_layer_create(window_bounds);\n  text_layer_set_font(s_font_size_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD));\n\n  // Add the child layer to the current window (s_font_window)\n  layer_add_child(window_layer, text_layer_get_layer(s_text_layer));\n  layer_add_child(window_layer, text_layer_get_layer(s_font_name_layer));\n  layer_add_child(window_layer, text_layer_get_layer(s_font_variant_layer));\n  layer_add_child(window_layer, text_layer_get_layer(s_font_size_layer));\n\n  // Finally, update the text and font in the layers\n  show_selected_font_and_message();\n}\n\nstatic void font_window_unload(Window *window) {\n  layer_remove_child_layers(window_get_root_layer(window));\n\n  text_layer_destroy(s_text_layer);\n  text_layer_destroy(s_font_name_layer);\n  text_layer_destroy(s_font_variant_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload\n  });\n\n  s_font_window = window_create();\n  window_set_window_handlers(s_font_window, (WindowHandlers) {\n    .load = font_window_load,\n    .unload = font_window_unload\n  });\n\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_font_window);\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/app_font_browser/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/app_font_viewer/README.md",
    "content": "# app_font_viewer\n\n![screenshot](app_font_viewer_screenshot.png)\n\nThis example allows you to cycle through some of the characters in a symbol font.\n"
  },
  {
    "path": "watchapps/app_font_viewer/appinfo.json",
    "content": "{\n  \"uuid\": \"2f085772-ad3f-4f2c-8730-86c9181f593c\",\n  \"shortName\": \"Font Viewer\",\n  \"longName\": \"Font Viewer\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"type\": \"font\",\n        \"name\": \"FONT_UNICONS_30\",\n        \"file\": \"fonts/unicons_30.ttf\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/app_font_viewer/resources/fonts/SIL - Open Font License.txt",
    "content": "Copyright (c) 2012, wmk69 (wmk69@o2.pl),\nwith Reserved Font Names 'ConsolaMono', 'Consola Mono', \"Consola Mono Bold\".\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL\n\n\n\nSIL OPEN FONT LICENSE\n\nVersion 1.1 - 26 February 2007\n\n\nPREAMBLE\n\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded,\nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\n\nDEFINITIONS\n\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting — in part or in whole — any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\n\nPERMISSION & CONDITIONS\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\n\nTERMINATION\n\nThis license becomes null and void if any of the above conditions are\nnot met.\n\n\nDISCLAIMER\n\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "watchapps/app_font_viewer/src/app_font_viewer.c",
    "content": "// Font Viewer -- Cycle through some of the characters in a symbol font.\n\n#include <pebble.h>\n\n#define PADDING 5\n#define REPEAT_INTERVAL_MS 100\n\nstatic Window *s_main_window;\nstatic TextLayer *s_text_layer;\nstatic TextLayer *s_char_text_layer;\n\nstatic char s_text_buffer[] = \"Aa\";\n\nstatic void down_single_click_handler(ClickRecognizerRef recognizer, void *context) {\n  if (s_text_buffer[0] != 'Z') {\n    s_text_buffer[0]++;\n    s_text_buffer[1]++;\n\n    text_layer_set_text(s_text_layer, s_text_buffer);\n    text_layer_set_text(s_char_text_layer, s_text_buffer);\n  }\n}\n\nstatic void up_single_click_handler(ClickRecognizerRef recognizer, void *context) {\n  if (s_text_buffer[0] != 'A') {\n    s_text_buffer[0]--;\n    s_text_buffer[1]--;\n\n    text_layer_set_text(s_text_layer, s_text_buffer);\n    text_layer_set_text(s_char_text_layer, s_text_buffer);\n  }\n}\n\nstatic void click_config_provider(void *context) {\n  window_single_repeating_click_subscribe(BUTTON_ID_UP, REPEAT_INTERVAL_MS, up_single_click_handler);\n  window_single_repeating_click_subscribe(BUTTON_ID_DOWN, REPEAT_INTERVAL_MS, down_single_click_handler);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_bounds(window_layer);\n\n  s_text_layer = text_layer_create((GRect) { { PADDING, 0 }, { bounds.size.w - 2*PADDING, bounds.size.h } });\n  text_layer_set_text(s_text_layer, s_text_buffer);\n  text_layer_set_font(s_text_layer, fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_UNICONS_30)));\n  layer_add_child(window_layer, text_layer_get_layer(s_text_layer));\n\n  s_char_text_layer = text_layer_create((GRect) { { PADDING, bounds.size.h - 60 }, { bounds.size.w - 2*PADDING, 40 } });\n  text_layer_set_text(s_char_text_layer, s_text_buffer);\n  text_layer_set_font(s_char_text_layer, fonts_get_system_font(FONT_KEY_BITHAM_30_BLACK));\n  layer_add_child(window_layer, text_layer_get_layer(s_char_text_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_text_layer);\n  text_layer_destroy(s_char_text_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_click_config_provider(s_main_window, click_config_provider);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/app_font_viewer/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/app_mockup_helper/README.md",
    "content": "# app_mockup_helper\n\n![screenshot](app_mockup_helper_screenshot.png)\n\nThis example helps with watch face mockups by displaying the `mockup.png` as a fullscreen image in a watch app so you can see how it looks without writing any code.\n"
  },
  {
    "path": "watchapps/app_mockup_helper/appinfo.json",
    "content": "{\n  \"uuid\": \"6cc4967f-a06e-4a00-bf46-8a326aceaf31\",\n  \"shortName\": \"Mockup Helper\",\n  \"longName\": \"Mockup Helper\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_MOCKUP\",\n        \"file\": \"images/mockup.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/app_mockup_helper/src/app_mockup_helper.c",
    "content": "/*\n * Helps with watch face mockups by displaying the s_mockup_bitmap `mockup.png` as a\n * fullscreen image in a watch app so you can see how it looks without writing\n * any code.\n */\n\n#include \"pebble.h\"\n\nstatic Window *s_main_window;\n\nstatic GBitmap *s_mockup_bitmap;\nstatic BitmapLayer *s_mockup_layer;\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(s_main_window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_mockup_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_MOCKUP);\n\n  s_mockup_layer = bitmap_layer_create(bounds);\n  bitmap_layer_set_bitmap(s_mockup_layer, s_mockup_bitmap);\n  layer_add_child(window_layer, bitmap_layer_get_layer(s_mockup_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  gbitmap_destroy(s_mockup_bitmap);\n  bitmap_layer_destroy(s_mockup_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/app_mockup_helper/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature-background-counter/README.md",
    "content": "# feature-background-counter\n\n![screenshot](feature_background_counter_screenshot.png)\n\nThis example shows how to use the [`Worker`](https://developer.getpebble.com/docs/c/group___worker.html) (background worker).\n"
  },
  {
    "path": "watchapps/feature-background-counter/appinfo.json",
    "content": "{\n  \"uuid\": \"f6ec79cb-6d10-4ee9-9c13-f99169d952fe\",\n  \"shortName\": \"Background Example\",\n  \"longName\": \"Background Example\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 1,\n  \"versionLabel\": \"1.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature-background-counter/src/main.c",
    "content": "#include <pebble.h>\n\n#define WORKER_TICKS 0\n\nstatic Window *s_main_window;\nstatic TextLayer *s_output_layer, *s_ticks_layer;\n\nstatic void worker_message_handler(uint16_t type, AppWorkerMessage *data) {\n  if(type == WORKER_TICKS) { \n    // Read ticks from worker's packet\n    int ticks = data->data0;\n\n    // Show to user in TextLayer\n    static char s_buffer[32];\n    snprintf(s_buffer, sizeof(s_buffer), \"%d background ticks\", ticks);\n    text_layer_set_text(s_ticks_layer, s_buffer);\n  }\n}\n\nstatic void select_click_handler(ClickRecognizerRef recognizer, void *context) {\n  // Check to see if the worker is currently active\n  bool running = app_worker_is_running();\n\n  // Toggle running state\n  AppWorkerResult result;\n  if(running) {\n    result = app_worker_kill();\n\n    if(result == APP_WORKER_RESULT_SUCCESS) {\n      text_layer_set_text(s_ticks_layer, \"Worker stopped!\");\n    } else {\n      text_layer_set_text(s_ticks_layer, \"Error killing worker!\");\n    }\n  } else {\n    result = app_worker_launch();\n\n    if(result == APP_WORKER_RESULT_SUCCESS) {\n      text_layer_set_text(s_ticks_layer, \"Worker launched!\");\n    } else {\n      text_layer_set_text(s_ticks_layer, \"Error launching worker!\");\n    }\n  }\n\n  APP_LOG(APP_LOG_LEVEL_INFO, \"Result: %d\", result);\n}\n\nstatic void click_config_provider(void *context) {\n  window_single_click_subscribe(BUTTON_ID_SELECT, select_click_handler);\n}\n\nstatic void main_window_load(Window *window) {\n  // Create UI\n  s_output_layer = text_layer_create(GRect(0, 0, 144, 168));\n  text_layer_set_text(s_output_layer, \"Use SELECT to start/stop the background worker.\");\n  text_layer_set_text_alignment(s_output_layer, GTextAlignmentCenter);\n  layer_add_child(window_get_root_layer(window), text_layer_get_layer(s_output_layer));\n\n  s_ticks_layer = text_layer_create(GRect(5, 135, 144, 30));\n  text_layer_set_text(s_ticks_layer, \"No data yet.\");\n  text_layer_set_text_alignment(s_ticks_layer, GTextAlignmentLeft);\n  layer_add_child(window_get_root_layer(window), text_layer_get_layer(s_ticks_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  // Destroy UI\n  text_layer_destroy(s_output_layer);\n  text_layer_destroy(s_ticks_layer);\n}\n\nstatic void init(void) {\n  // Setup main Window\n  s_main_window = window_create();\n  window_set_click_config_provider(s_main_window, click_config_provider);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n\n  // Subscribe to Worker messages\n  app_worker_message_subscribe(worker_message_handler);\n}\n\nstatic void deinit(void) {\n  // Destroy main Window\n  window_destroy(s_main_window);\n\n  // No more worker updates\n  app_worker_message_unsubscribe();\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature-background-counter/worker_src/worker.c",
    "content": "#include <pebble_worker.h>\n\n#define WORKER_TICKS 0\n\nstatic uint16_t s_ticks = 0;\n\nstatic void tick_handler(struct tm *tick_timer, TimeUnits units_changed) {\n  // Update value\n  s_ticks++;\n\n  // Construct a data packet\n  AppWorkerMessage msg_data = {\n    .data0 = s_ticks\n  };\n\n  // Send the data to the foreground app\n  app_worker_send_message(WORKER_TICKS, &msg_data);\n}\n\nstatic void worker_init() {\n  // Use the TickTimer Service as a data source\n  tick_timer_service_subscribe(SECOND_UNIT, tick_handler);\n}\n\nstatic void worker_deinit() {\n  // Stop using the TickTimerService\n  tick_timer_service_unsubscribe();\n}\n\nint main(void) {\n  worker_init();\n  worker_event_loop();\n  worker_deinit();\n}\n\n"
  },
  {
    "path": "watchapps/feature-background-counter/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_accel_discs/README.md",
    "content": "# feature_accel_discs\n\n![screenshot](feature_accel_discs_screenshot.png)\n\nThis example shows how to use the [accelerometer](https://developer.getpebble.com/docs/c/group___accelerometer_service.html).\n"
  },
  {
    "path": "watchapps/feature_accel_discs/appinfo.json",
    "content": "{\n  \"uuid\": \"3aa643c5-acd4-4897-9213-5e6812da3857\",\n  \"shortName\": \"Accel Discs\",\n  \"longName\": \"Accel Discs\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_accel_discs/src/feature_accel_discs.c",
    "content": "#include \"pebble.h\"\n\n#define MATH_PI 3.141592653589793238462\n#define NUM_DISCS 20\n#define DISC_DENSITY 0.25\n#define ACCEL_RATIO 0.05\n#define ACCEL_STEP_MS 50\n\ntypedef struct Vec2d {\n  double x;\n  double y;\n} Vec2d;\n\ntypedef struct Disc {\n#ifdef PBL_COLOR\n  GColor color;\n#endif\n  Vec2d pos;\n  Vec2d vel;\n  double mass;\n  double radius;\n} Disc;\n\n\nstatic Window *s_main_window;\nstatic Layer *s_disc_layer;\n\nstatic Disc disc_array[NUM_DISCS];\nstatic GRect window_frame;\n\nstatic double disc_calc_mass(Disc *disc) {\n  return MATH_PI * disc->radius * disc->radius * DISC_DENSITY;\n}\n\nstatic void disc_init(Disc *disc) {\n  static double next_radius = 3;\n\n  GRect frame = window_frame;\n  disc->pos.x = frame.size.w/2;\n  disc->pos.y = frame.size.h/2;\n  disc->vel.x = 0;\n  disc->vel.y = 0;\n  disc->radius = next_radius;\n  disc->mass = disc_calc_mass(disc);\n#ifdef PBL_COLOR\n  disc->color = GColorFromRGB(rand() % 255, rand() % 255, rand() % 255);\n#endif\n  next_radius += 0.5;\n}\n\nstatic void disc_apply_force(Disc *disc, Vec2d force) {\n  disc->vel.x += force.x / disc->mass;\n  disc->vel.y += force.y / disc->mass;\n}\n\nstatic void disc_apply_accel(Disc *disc, AccelData accel) {\n  disc_apply_force(disc, (Vec2d) {\n    .x = accel.x * ACCEL_RATIO,\n    .y = -accel.y * ACCEL_RATIO\n  });\n}\n\nstatic void disc_update(Disc *disc) {\n  double e = 0.5;\n\n  if ((disc->pos.x - disc->radius < 0 && disc->vel.x < 0)\n    || (disc->pos.x + disc->radius > window_frame.size.w && disc->vel.x > 0)) {\n    disc->vel.x = -disc->vel.x * e;\n  }\n\n  if ((disc->pos.y - disc->radius < 0 && disc->vel.y < 0)\n    || (disc->pos.y + disc->radius > window_frame.size.h && disc->vel.y > 0)) {\n    disc->vel.y = -disc->vel.y * e;\n  }\n\n  disc->pos.x += disc->vel.x;\n  disc->pos.y += disc->vel.y;\n}\n\nstatic void disc_draw(GContext *ctx, Disc *disc) {\n#ifdef PBL_COLOR\n  graphics_context_set_fill_color(ctx, disc->color);\n#else\n  graphics_context_set_fill_color(ctx, GColorWhite);\n#endif\n  graphics_fill_circle(ctx, GPoint(disc->pos.x, disc->pos.y), disc->radius);\n}\n\nstatic void disc_layer_update_callback(Layer *me, GContext *ctx) {\n  for (int i = 0; i < NUM_DISCS; i++) {\n    disc_draw(ctx, &disc_array[i]);\n  }\n}\n\nstatic void timer_callback(void *data) {\n  AccelData accel = (AccelData) { .x = 0, .y = 0, .z = 0 };\n  accel_service_peek(&accel);\n\n  for (int i = 0; i < NUM_DISCS; i++) {\n    Disc *disc = &disc_array[i];\n    disc_apply_accel(disc, accel);\n    disc_update(disc);\n  }\n\n  layer_mark_dirty(s_disc_layer);\n\n  app_timer_register(ACCEL_STEP_MS, timer_callback, NULL);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect frame = window_frame = layer_get_frame(window_layer);\n\n  s_disc_layer = layer_create(frame);\n  layer_set_update_proc(s_disc_layer, disc_layer_update_callback);\n  layer_add_child(window_layer, s_disc_layer);\n\n  for (int i = 0; i < NUM_DISCS; i++) {\n    disc_init(&disc_array[i]);\n  }\n}\n\nstatic void main_window_unload(Window *window) {\n  layer_destroy(s_disc_layer);\n}\n\nstatic void init(void) {\n  s_main_window = window_create();\n  window_set_background_color(s_main_window, GColorBlack);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload\n  });\n  window_stack_push(s_main_window, true);\n\n  accel_data_service_subscribe(0, NULL);\n\n  app_timer_register(ACCEL_STEP_MS, timer_callback, NULL);\n}\n\nstatic void deinit(void) {\n  accel_data_service_unsubscribe();\n\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_accel_discs/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_app_logging/README.md",
    "content": "# feature_app_logging\n\n![screenshot](feature_app_logging_screenshot.png)\n\nThis example shows how to use [logging](https://developer.getpebble.com/docs/c/group___logging.html) in your apps.\n"
  },
  {
    "path": "watchapps/feature_app_logging/appinfo.json",
    "content": "{\n  \"uuid\": \"4e56054d-067a-44bb-ba19-02eb6cd8b5a1\",\n  \"shortName\": \"App Log Demo\",\n  \"longName\": \"App Log Demo\",\n  \"companyName\": \"Pebble Tecnology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_app_logging/src/feature_app_logging.c",
    "content": "#include \"pebble.h\"\n\n#define REPEAT_INTERVAL_MS 1000\n\nstatic Window *s_main_window;\nstatic TextLayer *s_text_layer;\n\nstatic void select_single_click_handler(ClickRecognizerRef recognizer, void *context) {\n  APP_LOG(APP_LOG_LEVEL_DEBUG, \"Single Click\");\n}\n\nstatic void select_multi_click_handler(ClickRecognizerRef recognizer, void *context) {\n  APP_LOG(APP_LOG_LEVEL_DEBUG, \"Multi-Click: %u clicks\", click_number_of_clicks_counted(recognizer));\n}\n\nstatic void select_long_click_handler(ClickRecognizerRef recognizer, void *context) {\n  APP_LOG(APP_LOG_LEVEL_DEBUG, \"Long-Click: START\");\n}\n\nstatic void select_long_click_release_handler(ClickRecognizerRef recognizer, void *context) {\n  APP_LOG(APP_LOG_LEVEL_DEBUG, \"Long-Click: RELEASE\");\n}\n\nstatic void config_provider(void *context) {\n  window_single_repeating_click_subscribe(BUTTON_ID_SELECT, REPEAT_INTERVAL_MS, select_single_click_handler);\n  window_multi_click_subscribe(BUTTON_ID_SELECT, 2, 10, 0, true, select_multi_click_handler);\n  window_long_click_subscribe(BUTTON_ID_SELECT, 700, select_long_click_handler, select_long_click_release_handler);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(s_main_window);\n  GRect bounds = layer_get_frame(window_layer);\n  \n  s_text_layer = text_layer_create(bounds);\n  text_layer_set_text(s_text_layer,\n      \"Press the select button to try out different clicks and watch your Bluetooth logs\");\n  text_layer_set_text_color(s_text_layer, GColorBlack);\n  text_layer_set_font(s_text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD));\n  text_layer_set_text_alignment(s_text_layer, GTextAlignmentCenter);\n  layer_add_child(window_layer, text_layer_get_layer(s_text_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_text_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_click_config_provider(s_main_window, config_provider);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();  \n}\n"
  },
  {
    "path": "watchapps/feature_app_logging/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_app_wakeup/README.md",
    "content": "# feature_app_wakeup\n\n![screenshot](feature_app_wakeup_screenshot.png)\n\nThis example shows how the [`Wakeup`](https://developer.getpebble.com/docs/c/group___wakeup.html) API works.\n"
  },
  {
    "path": "watchapps/feature_app_wakeup/appinfo.json",
    "content": "{\n  \"uuid\": \"89bcd079-41b7-4d8c-bc38-af385d86a55c\",\n  \"shortName\": \"Tea Timer\",\n  \"longName\": \"Tea Timer\",\n  \"companyName\": \"MakeAwesomeHappen\",\n  \"versionCode\": \"1\",\n  \"versionLabel\": \"1.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {\n    \"dummy\": 0\n  },\n  \"resources\": {\n    \"media\": [\n      {\n        \"menuIcon\": true,\n        \"type\": \"png\",\n        \"name\": \"IMAGE_ICON\",\n        \"file\": \"cup_icon.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"TEA_SIGN\",\n        \"file\": \"tea-sign.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_app_wakeup/src/tea_timer.c",
    "content": "#include <pebble.h>\n\n#define TEA_TEXT_GAP 14\n\nstatic Window *s_menu_window, *s_countdown_window, *s_wakeup_window;\nstatic MenuLayer *s_menu_layer;\nstatic TextLayer *s_error_text_layer, *s_tea_text_layer, *s_countdown_text_layer, *s_cancel_text_layer;\nstatic BitmapLayer *s_bitmap_layer;\nstatic GBitmap *s_tea_bitmap;\n\nstatic WakeupId s_wakeup_id = -1;\nstatic time_t s_wakeup_timestamp = 0;\nstatic char s_tea_text[32];\nstatic char s_countdown_text[32];\n\ntypedef struct {\n  char name[16];  // Name of this tea\n  int mins;       // Minutes to steep this tea\n} TeaInfo;\n\n// Array of different teas for tea timer\n// {<Tea Name>, <Brew time in minutes>}\nTeaInfo tea_array[] = {\n  {\"Green Tea\", 1},\n  {\"Black Tea\", 2},\n  {\"Oolong Tea\", 3},\n  {\"Darjeeling\", 4},\n  {\"Herbal Tea\", 5},\n  {\"Mate Tea\", 6},\n  {\"Chai Tea\", 10}\n};\n\nenum {\n  PERSIST_WAKEUP // Persistent storage key for wakeup_id\n};\n\nstatic void select_callback(struct MenuLayer *s_menu_layer, MenuIndex *cell_index, void *callback_context) {\n  // If we were displaying s_error_text_layer, remove it and return\n  if (!layer_get_hidden(text_layer_get_layer(s_error_text_layer))) {\n    layer_set_hidden(text_layer_get_layer(s_error_text_layer), true);\n    return;\n  }\n\n  // Wakeup time is a timestamp in the future\n  // so time(NULL) + delay_time_in_seconds = wakeup_time\n  time_t wakeup_time = time(NULL) + tea_array[cell_index->row].mins * 60;\n\n  // Use the tea_array index as the wakeup reason, so on wakeup trigger\n  // we know which tea is brewed\n  s_wakeup_id = wakeup_schedule(wakeup_time, cell_index->row, true);\n\n  // If we couldn't schedule the wakeup event, display error_text overlay\n  if (s_wakeup_id <= 0) {\n    layer_set_hidden(text_layer_get_layer(s_error_text_layer), false);\n    return;\n  }\n\n  // Store the handle so we can cancel if necessary, or look it up next launch\n  persist_write_int(PERSIST_WAKEUP, s_wakeup_id);\n\n  // Switch to countdown window\n  window_stack_push(s_countdown_window, false);\n}\n\nstatic uint16_t get_sections_count_callback(struct MenuLayer *menulayer, uint16_t section_index, void *callback_context) {\n  int count = sizeof(tea_array) / sizeof(TeaInfo);\n  return count;\n}\n\nstatic void draw_row_handler(GContext *ctx, const Layer *cell_layer, MenuIndex *cell_index, void *callback_context) {\n  char* name = tea_array[cell_index->row].name;\n  int text_gap_size = TEA_TEXT_GAP - strlen(name);\n  int mins = tea_array[cell_index->row].mins;\n\n  // Using simple space padding between name and s_tea_text for appearance of edge-alignment\n  snprintf(s_tea_text, sizeof(s_tea_text), \"%s%*s%d min\", name, text_gap_size, \"\", mins);\n\n  menu_cell_basic_draw(ctx, cell_layer, s_tea_text, NULL, NULL);\n}\n\nstatic void menu_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_bounds(window_layer);\n\n  s_menu_layer = menu_layer_create(bounds);\n  menu_layer_set_callbacks(s_menu_layer, NULL, (MenuLayerCallbacks){\n    .get_num_rows = get_sections_count_callback,\n    .draw_row = draw_row_handler,\n    .select_click = select_callback\n  }); \n  menu_layer_set_click_config_onto_window(s_menu_layer,\twindow);\n  layer_add_child(window_layer, menu_layer_get_layer(s_menu_layer));\n\n  s_error_text_layer = text_layer_create((GRect) { .origin = {0, 44}, .size = {bounds.size.w, 60}});\n  text_layer_set_text(s_error_text_layer, \"Cannot\\nschedule\");\n  text_layer_set_text_alignment(s_error_text_layer, GTextAlignmentCenter);\n  text_layer_set_font(s_error_text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));\n  text_layer_set_text_color(s_error_text_layer, GColorWhite);\n  text_layer_set_background_color(s_error_text_layer, GColorBlack);\n  layer_set_hidden(text_layer_get_layer(s_error_text_layer), true);\n  layer_add_child(window_layer, text_layer_get_layer(s_error_text_layer));\n}\n\nstatic void menu_window_unload(Window *window) {\n  menu_layer_destroy(s_menu_layer);\n  text_layer_destroy(s_error_text_layer);\n}\n\nstatic void timer_handler(void *data) {\n  if (s_wakeup_timestamp == 0) {\n    // get the wakeup timestamp for showing a countdown\n    wakeup_query(s_wakeup_id, &s_wakeup_timestamp);\n  }\n  int countdown = s_wakeup_timestamp - time(NULL);\n  snprintf(s_countdown_text, sizeof(s_countdown_text), \"%d seconds\", countdown);\n  layer_mark_dirty(text_layer_get_layer(s_countdown_text_layer));\n  app_timer_register(1000, timer_handler, data);\n}\n\nstatic void countdown_back_handler(ClickRecognizerRef recognizer, void *context) {\n  window_stack_pop_all(true); // Exit app while waiting for tea to brew\n}\n\n// Cancel the current wakeup event on the countdown screen\nstatic void countdown_cancel_handler(ClickRecognizerRef recognizer, void *context) {\n  wakeup_cancel(s_wakeup_id);\n  s_wakeup_id = -1;\n  persist_delete(PERSIST_WAKEUP);\n  window_stack_pop(true); // Go back to tea selection window\n}\n\nstatic void countdown_click_config_provider(void *context) {\n  window_single_click_subscribe(BUTTON_ID_BACK, countdown_back_handler);\n  window_single_click_subscribe(BUTTON_ID_DOWN, countdown_cancel_handler);\n}\n\nstatic void countdown_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_bounds(window_layer);\n\n  window_set_click_config_provider(window, countdown_click_config_provider);\n\n  s_tea_text_layer = text_layer_create(GRect(0, 32, bounds.size.w, 20));\n  text_layer_set_text(s_tea_text_layer, \"Steeping time left\");\n  text_layer_set_text_alignment(s_tea_text_layer, GTextAlignmentCenter);\n  layer_add_child(window_layer, text_layer_get_layer(s_tea_text_layer));\n\n  s_countdown_text_layer = text_layer_create(GRect(0, 72, bounds.size.w, 20));\n  text_layer_set_text(s_countdown_text_layer, s_countdown_text);\n  text_layer_set_text_alignment(s_countdown_text_layer, GTextAlignmentCenter);\n  layer_add_child(window_layer, text_layer_get_layer(s_countdown_text_layer));\n\n  // Place a cancel \"X\" next to the bottom button to cancel wakeup timer\n  s_cancel_text_layer = text_layer_create(GRect(124, 116, 24, 28));\n  text_layer_set_text(s_cancel_text_layer, \"X\");\n  text_layer_set_font(s_cancel_text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));\n  text_layer_set_text_alignment(s_cancel_text_layer, GTextAlignmentLeft);\n  layer_add_child(window_layer, text_layer_get_layer(s_cancel_text_layer));\n\n  s_wakeup_timestamp = 0;\n  app_timer_register(0, timer_handler, NULL);\n}\n\nstatic void countdown_window_unload(Window *window) {\n  text_layer_destroy(s_countdown_text_layer);\n  text_layer_destroy(s_cancel_text_layer);\n  text_layer_destroy(s_tea_text_layer);\n}\n\nstatic void wakeup_click_handler(ClickRecognizerRef recognizer, void *context) {\n  // Exit app after tea is done\n  window_stack_pop_all(true);\n}\n\nstatic void wakeup_click_config_provider(void *context) {\n  window_single_click_subscribe(BUTTON_ID_SELECT, wakeup_click_handler);\n  window_single_click_subscribe(BUTTON_ID_UP, wakeup_click_handler);\n  window_single_click_subscribe(BUTTON_ID_DOWN, wakeup_click_handler);\n  window_single_click_subscribe(BUTTON_ID_BACK, wakeup_click_handler);\n}\n\nstatic void wakeup_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_bounds(window_layer);\n\n  window_set_click_config_provider(window, wakeup_click_config_provider);\n\n  // Bitmap layer for wakeup \"tea is ready\" image\n  s_bitmap_layer = bitmap_layer_create(bounds);\n  s_tea_bitmap = gbitmap_create_with_resource(RESOURCE_ID_TEA_SIGN);\n  bitmap_layer_set_bitmap(s_bitmap_layer, s_tea_bitmap);\n  layer_add_child(window_layer, bitmap_layer_get_layer(s_bitmap_layer));\n}\n\nstatic void wakeup_window_unload(Window *window) {\n  gbitmap_destroy(s_tea_bitmap);\n  bitmap_layer_destroy(s_bitmap_layer);\n}\n\nstatic void wakeup_handler(WakeupId id, int32_t reason) {\n  //Delete persistent storage value\n  persist_delete(PERSIST_WAKEUP);\n  window_stack_push(s_wakeup_window, false);\n  vibes_double_pulse();\n}\n\nstatic void init(void) {\n  bool wakeup_scheduled = false;\n\n  // Check if we have already scheduled a wakeup event\n  // so we can transition to the countdown window\n  if (persist_exists(PERSIST_WAKEUP)) {\n    s_wakeup_id = persist_read_int(PERSIST_WAKEUP);\n    // query if event is still valid, otherwise delete\n    if (wakeup_query(s_wakeup_id, NULL)) {\n      wakeup_scheduled = true;\n    } else {\n      persist_delete(PERSIST_WAKEUP);\n      s_wakeup_id = -1;\n    }\n  }\n\n  s_menu_window = window_create();\n  window_set_window_handlers(s_menu_window, (WindowHandlers){\n    .load = menu_window_load,\n    .unload = menu_window_unload,\n  });\n\n  s_countdown_window = window_create();\n  window_set_window_handlers(s_countdown_window, (WindowHandlers){\n    .load = countdown_window_load,\n    .unload = countdown_window_unload,\n  });\n\n  s_wakeup_window = window_create();\n  window_set_window_handlers(s_wakeup_window, (WindowHandlers){\n    .load = wakeup_window_load,\n    .unload = wakeup_window_unload,\n  });\n\n  // Check to see if we were launched by a wakeup event\n  if (launch_reason() == APP_LAUNCH_WAKEUP) {\n    // If woken by wakeup event, get the event display \"tea is ready\"\n    WakeupId id = 0;\n    int32_t reason = 0;\n    if (wakeup_get_launch_event(&id, &reason)) {\n      wakeup_handler(id, reason);\n    }\n  } else if (wakeup_scheduled) {\n    window_stack_push(s_countdown_window, false);\n  } else {\n    window_stack_push(s_menu_window, false);\n  }\n\n  // subscribe to wakeup service to get wakeup events while app is running\n  wakeup_service_subscribe(wakeup_handler);\n}\n\nstatic void deinit(void) {\n  window_destroy(s_menu_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_app_wakeup/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_clock_mode/README.md",
    "content": "# feature_clock_mode\n\n![screenshot](feature_clock_mode_screenshot.png)\n\nThis example shows how to detect and use the user's 12/24h clock style preference.\n"
  },
  {
    "path": "watchapps/feature_clock_mode/appinfo.json",
    "content": "{\n  \"uuid\": \"4846a572-4eb2-4eaa-a949-0dc4fea76eab\",\n  \"shortName\": \"12/24 Mode\",\n  \"longName\": \"12/24 Mode\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_clock_mode/src/feature_clock_mode.c",
    "content": "#include \"pebble.h\"\n\nstatic Window *s_main_window;\nstatic TextLayer *s_text_layer;\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(s_main_window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_text_layer = text_layer_create(GRect(0, 30, bounds.size.h, bounds.size.w));\n  text_layer_set_text(s_text_layer, clock_is_24h_style() ? \"Mode:\\n24\" : \"Mode:\\n12\");\n  text_layer_set_font(s_text_layer, fonts_get_system_font(FONT_KEY_BITHAM_42_LIGHT));\n  text_layer_set_text_alignment(s_text_layer, GTextAlignmentCenter);\n  text_layer_set_background_color(s_text_layer, GColorBlack);\n  text_layer_set_text_color(s_text_layer, GColorWhite);\n\n  layer_add_child(window_layer, text_layer_get_layer(s_text_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_text_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_background_color(s_main_window, GColorBlack);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_clock_mode/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_custom_font/README.md",
    "content": "# feature_custom_font\n\n![screenshot](feature_custom_font_screenshot.png)\n\nThis example shows how to use a custom font.\n\nCheck out our [guide](https://developer.getpebble.com/guides/pebble-apps/display-and-animations/resources/) on how to use app resources.\n"
  },
  {
    "path": "watchapps/feature_custom_font/appinfo.json",
    "content": "{\n  \"uuid\": \"47d2fd2a-7809-4cfe-9144-08173353aaad\",\n  \"shortName\": \"Custom Font\",\n  \"longName\": \"Custom Font\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"type\": \"font\",\n        \"name\": \"FONT_OSP_DIN_44\",\n        \"file\": \"fonts/osp-din/OSP-DIN_44.ttf\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_custom_font/resources/fonts/osp-din/COPYING.txt",
    "content": "Copyright (C) 2011 OSP \nhttp://ospublish.constantvzw.org.\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\n\nSee the project website for the current trunk and the various branches:\nhttp://ospublish.constantvzw.org/foundry/osp-din/\n"
  },
  {
    "path": "watchapps/feature_custom_font/resources/fonts/osp-din/FONTLOG",
    "content": "\nFONTLOG for OSP-DIN\n-------------------\nThis file provides detailed information on the OSP-DIN font software.\nThis information should be distributed along with the OSP-DIN fonts\nand any derivative works.\n\nBasic Font Information\n--------------------------\nCopyright (c) 2011, OSP (http://ospublish.constantvzw.org)\nThe first cut of OSP-DIN was drawn for the festival Cinema du réel 2009, when we were invited to work on a cartographic version of the programme (see \"OSP_cine-du-reel2009.jpg\" in the documentation folder).\nWe drew the first cut of the open source DIN from grid based drawings similar to the original 1932 drawings of the DIN we saw during our investigative trip to Berlin in february 2008.\nhttp://ospublish.constantvzw.org/type/din-4\nWe recently added a basic set of latin lowercases and we are hoping to rapidly complete the set to Latin -1 (ISO/IEC 8859-1)\n\nsee\nhttp://ospublish.constantvzw.org/works/index.php?/projects/cinema-du-reel-/\nhttp://ospublish.constantvzw.org/works/osp-bpi-cinema-du-reel\nhttp://ospublish.constantvzw.org/news/osp-full-scale-in-beaubourg\n\nOSP-DIN currently provides the following Unicode coverage:\nBasic Latin: 90/95 \nLatin-1 Supplement: 48/96 \n\nInformation for Contributors\n------------------------------\nCopyright (C) 2011 OSP \nhttp://ospublish.constantvzw.org.\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\n\nSee the project website for the current trunk and the various branches:\nhttp://ospublish.constantvzw.org/foundry/osp-din/\n\nChangeLog\n----------\n(This should list both major and minor changes, most recent first.)\n\nAcknowledgements\n-------------------------\nIf you make modifications be sure to add your name (N), email (E), web-address\n(W) and description (D). This list is sorted by last name in alphabetical\norder.)\n\nN: Antoine Begon\nE: ant.begon@gmail.com\nW: begon.antoine.free.fr \n\nN: Ludivine Loiseau\nE: hello@ludi.be\nW: ludi.be \n\nN: Harrisson\nW: http://ospublish.constantvzw.org \n\n\n"
  },
  {
    "path": "watchapps/feature_custom_font/resources/fonts/osp-din/OFL-1.1.txt",
    "content": "This file is part of OSP-DIN and is for description.\n\nCopyright (C) 2011 OSP \nhttp://ospublish.constantvzw.org.\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL\n\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded, \nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "watchapps/feature_custom_font/resources/fonts/osp-din/README.pebble",
    "content": "During the build process for a Pebble App, each font is converted from a\nvector TrueType format into a bitmap of a particular point size.\n\nThe desired point size is specified by including the value in the name\nof the source `.ttf` file.\n\n e.g. copy the file `OSP-DIN.ttf` to a file named `OSP-DIN_44.ttf` to get\n      the OSP-DIN font rendered at 44 points.\n\nIf you want to have a font rendered at multiple sizes you need a copy\nof the file with the correct name for each size.\n\n\nThe `OSP-DIN` font is from here: http://openfontlibrary.org/en/font/osp-din"
  },
  {
    "path": "watchapps/feature_custom_font/src/feature_custom_font.c",
    "content": "#include \"pebble.h\"\n\nstatic Window *s_main_window;\nstatic TextLayer *s_text_layer;\n\nstatic void init() {\n  s_main_window = window_create();\n  window_stack_push(s_main_window, true);\n\n  Layer *window_layer = window_get_root_layer(s_main_window);\n  GRect bounds = layer_get_bounds(window_layer);\n\n  GFont custom_font = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_OSP_DIN_44));\n\n  s_text_layer = text_layer_create(bounds);\n  text_layer_set_text(s_text_layer, \"  Hello,\\n  World!\");\n  text_layer_set_font(s_text_layer, custom_font);\n  layer_add_child(window_layer, text_layer_get_layer(s_text_layer));\n}\n\nstatic void deinit() {\n  text_layer_destroy(s_text_layer);\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_custom_font/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_draw_bitmap/README.md",
    "content": "# feature_draw_bitmap\n\n![screenshot](feature_draw_bitmap_screenshot.png)\n\nThis example shows how to draw a bitmap.\n\nCheck out our [guide](https://developer.getpebble.com/guides/pebble-apps/display-and-animations/resources/) on how to use app resources.\n"
  },
  {
    "path": "watchapps/feature_draw_bitmap/appinfo.json",
    "content": "{\n  \"uuid\": \"2ff7fa04-6011-4a98-8a3b-a826a4b899f8\",\n  \"shortName\": \"Draw Bitmap\",\n  \"longName\": \"Draw Bitmap\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NO_LITTER\",\n        \"file\": \"images/no_litter_crop.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_draw_bitmap/src/feature_draw_bitmap.c",
    "content": "/*\n * The original source image is from:\n *   <http://openclipart.org/detail/26728/aiga-litter-disposal-by-anonymous>\n *\n * The source image was converted from an SVG into a RGB bitmap using\n * Inkscape. It has no transparency and uses only black and white as\n * colors.\n */\n\n#include \"pebble.h\"\n\nstatic Window *s_main_window;\nstatic Layer *s_image_layer;\nstatic GBitmap *s_image;\n\nstatic void layer_update_callback(Layer *layer, GContext* ctx) {\n  // We make sure the dimensions of the GRect to draw into\n  // are equal to the size of the bitmap--otherwise the image\n  // will automatically tile. Which might be what *you* want.\n\n#ifdef PBL_PLATFORM_BASALT\n  GSize image_size = gbitmap_get_bounds(s_image).size;\n#else \n  GSize image_size = s_image->bounds.size;\n#endif\n\n  graphics_draw_bitmap_in_rect(ctx, s_image, GRect(5, 5, image_size.w, image_size.h));\n  graphics_draw_bitmap_in_rect(ctx, s_image, GRect(80, 60, image_size.w, image_size.h));\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(s_main_window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_image_layer = layer_create(bounds);\n  layer_set_update_proc(s_image_layer, layer_update_callback);\n  layer_add_child(window_layer, s_image_layer);\n\n  s_image = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_NO_LITTER);\n}\n\nstatic void main_window_unload(Window *window) {\n  gbitmap_destroy(s_image);\n  layer_destroy(s_image_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_draw_bitmap/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_draw_bitmap_composite/README.md",
    "content": "# feature_draw_bitmap_composite\n\n![screenshot](feature_draw_bitmap_composite_screenshot.png)\n\nThis example shows how to draw a bitmap using different compositing modes.\n"
  },
  {
    "path": "watchapps/feature_draw_bitmap_composite/appinfo.json",
    "content": "{\n  \"uuid\": \"23eedd80-6ec1-4e58-89e4-98700ed0799c\",\n  \"shortName\": \"GCompOp Demo\",\n  \"longName\": \"GCompOp Demo\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_PUG\",\n        \"file\": \"images/pug.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_draw_bitmap_composite/src/feature_draw_bitmap_composite.c",
    "content": "#include \"pebble.h\"\n\ntypedef struct GCompOpInfo {\n  char *name;\n  GCompOp op;\n} GCompOpInfo;\n\n// These are the compositing modes available\nstatic GCompOpInfo s_gcompops[] = {\n  {\"GCompOpAssign\", GCompOpAssign},\n  {\"GCompOpAssignInverted\", GCompOpAssignInverted},\n  {\"GCompOpOr\", GCompOpOr},\n  {\"GCompOpAnd\", GCompOpAnd},\n  {\"GCompOpClear\", GCompOpClear},\n  {\"GCompOpSet\", GCompOpSet}\n};\n\n#define NUM_COMP_OP_TYPES 6\n\nstatic int s_current_gcompop = 0;\n\nstatic Window *s_main_window;\nstatic Layer *s_image_layer;\nstatic GBitmap *s_image;\n\n// This is a layer update callback where compositing will take place\nstatic void layer_update_callback(Layer *layer, GContext *ctx) {\n  GRect bounds = layer_get_frame(layer);\n\n  // Display the name of the current compositing operation\n  graphics_context_set_text_color(ctx, GColorBlack);\n  graphics_draw_text(ctx, s_gcompops[s_current_gcompop].name, fonts_get_system_font(FONT_KEY_GOTHIC_18), bounds, GTextOverflowModeTrailingEllipsis, GTextAlignmentCenter, NULL);\n\n  // Draw the large circle the image will composite with\n  graphics_context_set_fill_color(ctx, GColorBlack);\n  graphics_fill_circle(ctx, GPoint(bounds.size.w / 2, bounds.size.h + 110), 180);\n\n  // Use the image size to help center the image\n#ifdef PBL_PLATFORM_BASALT\n  GRect destination = gbitmap_get_bounds(s_image);\n#else\n  GRect destination = s_image->bounds;\n#endif\n\n  // Center horizontally using the window frame size\n  destination.origin.x = (bounds.size.w - destination.size.w) / 2;\n  destination.origin.y = 50;\n\n  // Set the current compositing operation\n  // This will only cause bitmaps to composite\n  graphics_context_set_compositing_mode(ctx, s_gcompops[s_current_gcompop].op);\n\n  // Draw the bitmap; it will use current compositing operation set\n  graphics_draw_bitmap_in_rect(ctx, s_image, destination);\n}\n\nstatic void up_click_handler(ClickRecognizerRef recognizer, void *context) {\n  if (--s_current_gcompop < 0) {\n    s_current_gcompop = NUM_COMP_OP_TYPES - 1;\n  }\n  layer_mark_dirty(s_image_layer);\n}\n\nstatic void down_click_handler(ClickRecognizerRef recognizer, void *context) {\n  if (++s_current_gcompop >= NUM_COMP_OP_TYPES) {\n    s_current_gcompop = 0;\n  }\n  layer_mark_dirty(s_image_layer);\n}\n\nstatic void click_config_provider(void *context) {\n  window_single_click_subscribe(BUTTON_ID_UP, up_click_handler);\n  window_single_click_subscribe(BUTTON_ID_DOWN, down_click_handler);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(s_main_window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_image_layer = layer_create(bounds);\n  layer_set_update_proc(s_image_layer, layer_update_callback);\n  layer_add_child(window_layer, s_image_layer);\n\n  s_image = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_PUG);\n}\n\nstatic void main_window_unload(Window *window) {\n  gbitmap_destroy(s_image);\n  layer_destroy(s_image_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_click_config_provider(s_main_window, click_config_provider);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_draw_bitmap_composite/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_focus_handler/README.md",
    "content": "# feature_focus_handler\n\n![screenshot](feature_focus_handler_screenshot.png)\n\nThis example shows how to use the [`AppFocusService`](https://developer.getpebble.com/docs/c/group___app_focus_service.html) to handle app focus.\n\nCheck out our [guide](https://developer.getpebble.com/guides/pebble-apps/app-events/app-interruptions/) on how to manage app interruptions.\n"
  },
  {
    "path": "watchapps/feature_focus_handler/appinfo.json",
    "content": "{\n  \"uuid\": \"4dfa9fb7-d01f-4380-97e4-5b44817a4b6d\",\n  \"shortName\": \"Focus Demo\",\n  \"longName\": \"Focus Handler Demo\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 1,\n  \"versionLabel\": \"1.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {\n    \"dummy\": 0\n  },\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_focus_handler/src/feature_focus_handler.c",
    "content": "#include <pebble.h>\n\n#define BUF_LEN 32\n\nstatic char s_in_buf[BUF_LEN];\nstatic char s_out_buf[BUF_LEN];\nstatic TextLayer *s_in_time;\nstatic TextLayer *s_out_time;\nstatic Window *s_main_window;\n\nstatic void focus_handler(bool in_focus) {\n  static char time_str[BUF_LEN];\n  time_t t = time(NULL);\n  struct tm *lt = localtime(&t);\n  strftime(time_str, BUF_LEN, \"%H:%M:%S\", lt);\n\n  if (in_focus) {\n    snprintf(s_in_buf, sizeof(s_in_buf), \"Last in focus:\\n%s\", time_str);\n    layer_mark_dirty(text_layer_get_layer(s_in_time));\n  }\n  else {\n    snprintf(s_out_buf, sizeof(s_out_buf), \"Last out focus:\\n%s\", time_str);\n    layer_mark_dirty(text_layer_get_layer(s_out_time));\n  }\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(s_main_window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_in_time = text_layer_create(bounds);\n  text_layer_set_text(s_in_time, s_in_buf);\n  text_layer_set_font(s_in_time, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));\n  layer_add_child(window_layer, text_layer_get_layer(s_in_time));\n \n  bounds.origin.y = 50;\n\n  s_out_time = text_layer_create(bounds);\n  text_layer_set_text(s_out_time, s_out_buf);\n  text_layer_set_font(s_out_time, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));\n  layer_add_child(window_layer, text_layer_get_layer(s_out_time));\n\n  snprintf(s_in_buf, sizeof(s_in_buf), \"Last in focus:\\nNever\");\n  snprintf(s_out_buf, sizeof(s_out_buf), \"Last out focus:\\nNever\");\n\n  app_focus_service_subscribe(focus_handler);\n}\n\nstatic void main_window_unload(Window *window) {\n  app_focus_service_unsubscribe();\n  text_layer_destroy(s_in_time);\n  text_layer_destroy(s_out_time);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit(void) {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_focus_handler/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_frame_buffer/README.md",
    "content": "# feature_frame_buffer\n\n![screenshot](feature_frame_buffer_screenshot.png)\n\nThis example shows how to capture and manipulate the frame buffer.\n"
  },
  {
    "path": "watchapps/feature_frame_buffer/appinfo.json",
    "content": "{\n  \"uuid\": \"e1e0aee0-22bd-4128-859d-86ebb14c72a5\",\n  \"shortName\": \"feature_frame_buffer\",\n  \"longName\": \"feature_frame_buffer\",\n  \"companyName\": \"MakeAwesomeHappen\",\n  \"versionCode\": 1,\n  \"versionLabel\": \"1.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {\n    \"dummy\": 0\n  },\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_frame_buffer/src/feature_frame_buffer.c",
    "content": "#include <pebble.h>\n\nstatic Window *s_main_window;\nstatic GSize s_window_size;\n\n/*\n * Gray values for the animated gradient.\n */\nstatic int s_gray_top;\nstatic int s_gray_bottom;\n\n/*\n * Helper value for draw_method_feedback().\n */\nstatic int s_time_feedback_y;\n\n/*\n * Bayer matrix for ordered dithering.\n *\n * Have a look at http://en.wikipedia.org/wiki/Ordered_dithering\n */\nstatic const uint8_t ditherMatrix[8][8] = {\n  {  0, 128,  32, 160,   8, 136,  40, 168},\n  {192,  64, 224,  96, 200,  72, 232, 104},\n  { 48, 176,  16, 144,  56, 184,  24, 152},\n  {240, 112, 208,  80, 248, 120, 216,  88},\n  { 12, 140,  44, 172,   4, 132,  36, 164},\n  {204,  76, 236, 108, 196,  68, 228, 100},\n  { 60, 188,  28, 156,  52, 180,  20, 148},\n  {252, 124, 220,  92, 244, 116, 212,  84}\n};\n\n/*\n * Converts a gray value to CGColor by using ordered dithering.\n *\n * As ordered dithering uses a stable pattern relative to the output image\n * you need to specific the target coordinate of the resulting pixel.\n *\n */\nstatic GColor color_for_gray(int16_t x, int16_t y, uint8_t gray) {\n  // dithering performs a quantizing step to map many colors to a reduced set of colors.\n  // it does so by comparing the actual color (here: gray) against a threshold to ultimately\n  // find the closet matching color of the given palette (here: black or white)\n  // please read http://en.wikipedia.org/wiki/Ordered_dithering for details\n\n  // here's a simple implementation that does this with an ordered dithering matrix and\n  // only two possible output colors\n\n  // find the threshold value for a given pixel coordinate by \"looping through\" the dither matrix\n  const uint8_t threshold_value = ditherMatrix[y % 8][x % 8];\n\n  // with only two colors (black and white) finding the closest matching color is trivial\n  return gray > threshold_value ? GColorWhite : GColorBlack;\n}\n\n/*\n * Calculates GColor values for 8 adjacent pixels at once and returns them as a single byte.\n */\n#ifndef PBL_COLOR\nstatic uint8_t dither_pattern_8(int16_t y, uint8_t gray) {\n  return color_for_gray(0, y, gray) << 7 |\n         color_for_gray(1, y, gray) << 6 |\n         color_for_gray(2, y, gray) << 5 |\n         color_for_gray(3, y, gray) << 4 |\n         color_for_gray(4, y, gray) << 3 |\n         color_for_gray(5, y, gray) << 2 |\n         color_for_gray(6, y, gray) << 1 |\n         color_for_gray(7, y, gray) << 0;\n}\n#endif\n\n/*\n * Draws textual feedback about the currently used update procedure.\n *\n * Y-coordinate is determined by s_time_feedback_y which is updated by update_animation().\n *\n */\nstatic void draw_method_feedback(GContext *ctx, char *method_text) {\n  GFont font = fonts_get_system_font(FONT_KEY_GOTHIC_18);\n  graphics_context_set_fill_color(ctx, GColorBlack);\n\n  struct GRect text_bounds = {.size = s_window_size};\n  text_bounds.size.h = (int16_t)(graphics_text_layout_get_content_size(method_text, font, text_bounds,\n      GTextOverflowModeTrailingEllipsis, GTextAlignmentCenter).h + 5); // space for descender\n  text_bounds.origin.y = (int16_t)(s_time_feedback_y % (s_window_size.h - text_bounds.size.h));\n\n  graphics_fill_rect(ctx, text_bounds, 0, GCornerNone);\n  graphics_draw_text(ctx, method_text, font, text_bounds,\n      GTextOverflowModeTrailingEllipsis, GTextAlignmentCenter, NULL);\n}\n\n/*\n * Returns interpolated gray value between s_gray_top and s_gray_bottom for a given row.\n */\nuint8_t gray_for_row(int16_t y) {\n  const int16_t h = s_window_size.h;\n\n  // linear interpolation without floats, equivalent to\n  //   float f = (float)y / (float)h;\n  //   return = (uint8_t)(s_gray_top * (1-f) + f * s_gray_bottom);\n  return (uint8_t)((s_gray_top * (h - y) + y * s_gray_bottom) / h);\n}\n\n/*\n * Draws linear gradient using graphics_draw_pixel() + draws info about used method.\n */\nstatic void update_proc_draw_pixel(Layer *layer, GContext *ctx) {\n  // determines gray value per row,\n  // calculates dithered pixel color per pixel, and\n  // uses graphics_draw_pixel for each pixel to draw the actual color\n\n  for (int16_t y = 0; y < s_window_size.h; y++) {\n    const uint8_t row_gray = gray_for_row(y);\n    for (int16_t x = 0; x < s_window_size.w; x++) {\n      graphics_context_set_stroke_color(ctx, color_for_gray(x, y, row_gray));\n      graphics_draw_pixel(ctx, GPoint(x, y));\n    }\n  }\n  draw_method_feedback(ctx, \"draw_pixel\");\n}\n\n/*\n * Draws linear gradient using direct frame buffer access.\n *\n * This function isn't being used directly by any layer. Instead, update_proc_frame_buffer_1()\n * and update_proc_frame_buffer_20() will call it before they draw additional information.\n */\nstatic void update_proc_frame_buffer(Layer *layer, GContext *ctx) {\n  // obtains direct access to the frame buffer,\n  // determines gray_ values per row\n  // calculates dithering pattern for the row, and\n  // sets all pixels of the row at once\n\n  // obtain frame buffer (must be released again using graphics_release_frame_buffer!)\n  GBitmap *fb = graphics_capture_frame_buffer(ctx);\n\n  // during the loop, row always points to the byte of the first 8 pixels of the current row\n#ifdef PBL_PLATFORM_BASALT\n  GRect fb_bounds = gbitmap_get_bounds(fb);\n  uint8_t *row = gbitmap_get_data(fb);\n  uint16_t row_bytes = gbitmap_get_bytes_per_row(fb);\n#else\n  GRect fb_bounds = fb->bounds;\n  uint8_t *row = fb->addr;\n  uint16_t row_bytes = fb->row_size_bytes;\n#endif\n  row += fb_bounds.origin.y * row_bytes;\n\n  // For all rows\n  for (int16_t y = fb_bounds.origin.y; y < fb_bounds.size.h; y++) {\n  const uint8_t row_gray = gray_for_row(y);\n#ifdef PBL_PLATFORM_BASALT\n    // Each pixel is one whole byte\n    for(int x = fb_bounds.origin.x; x < fb_bounds.size.w; x++) {\n      memset(&row[(y * fb_bounds.size.w) + x], color_for_gray(x, y, row_gray).argb, 1);\n    }\n#else\n    // as our dither pattern repeats itself after 8 pixels (8x8 dither matrix), we can store the\n    // whole pattern of this row in a single byte and set all pixels with a single call to memset\n    uint8_t row_gray_dither_pattern = dither_pattern_8(y, row_gray);\n    memset(row, row_gray_dither_pattern, row_bytes);\n    row += row_bytes;\n#endif\n  }\n\n  // do not forget to release the frame buffer after usage. Other graphics_* functions are blocked\n  // while it is capture.\n  graphics_release_frame_buffer(ctx, fb);\n}\n\n/*\n * Draws linear gradient once using direct frame buffer access + draws info about used method.\n */\nstatic void update_proc_frame_buffer_1(Layer *layer, GContext *ctx) {\n  update_proc_frame_buffer(layer, ctx);\n  draw_method_feedback(ctx, \"frame_buffer\");\n}\n\n/*\n * Draws linear gradient 20 times using direct frame buffer access + draws info about used method.\n */\nstatic void update_proc_frame_buffer_20(Layer *layer, GContext *ctx) {\n  for (int i = 0; i < 20; i++) {\n    update_proc_frame_buffer(layer, ctx);\n  }\n  draw_method_feedback(ctx, \"20 x frame_buffer\");\n}\n\n/*\n * Updates global helper variables and marks root layer dirty for the next animation step.\n *\n * This function calls app_timer_register() for itself to enter an infinite update loop.\n */\nstatic void update_animation(void *data) {\n  // input_top/_bottom are angles and change with each update so s_gray_top/_bottom will update\n  // smoothly thanks to sin_lookup\n  // The magic numbers you see had been determined via trial and error\n  static int input_top = TRIG_MAX_ANGLE * 1 / 4;\n  static int input_bottom = TRIG_MAX_ANGLE * 3 / 4;\n  input_top += TRIG_MAX_ANGLE * 7 / 360;\n  input_bottom += TRIG_MAX_ANGLE * 3 / 360;\n\n  // gray values used for the actual drawing\n  s_gray_top = (127 + sin_lookup(input_top) * 127 / TRIG_MAX_RATIO);\n  s_gray_bottom = (127 + sin_lookup(input_bottom) * 127 / TRIG_MAX_RATIO);\n\n  // y-coordinate for draw_method_feedback to give additional visual feedback about the speed\n  s_time_feedback_y += 5;\n\n  // trigger the actual redraw\n  layer_mark_dirty(window_get_root_layer(s_main_window));\n\n  // enter the infinite update loop\n  app_timer_register(1000 / 30, update_animation, NULL);\n}\n\nstatic LayerUpdateProc update_procs[] = {\n    update_proc_frame_buffer_1,\n    update_proc_draw_pixel,\n    update_proc_frame_buffer_20,\n};\n\nstatic int s_current_update_proc = 0;\n\nstatic void toggle_update_proc_click_handler(ClickRecognizerRef recognizer, void *context) {\n  s_current_update_proc = (s_current_update_proc + 1) % ARRAY_LENGTH(update_procs);\n  layer_set_update_proc(window_get_root_layer(s_main_window), update_procs[s_current_update_proc]);\n}\n\nstatic void click_config_provider(void *context) {\n  window_single_click_subscribe(BUTTON_ID_SELECT, toggle_update_proc_click_handler);\n  window_single_click_subscribe(BUTTON_ID_UP, toggle_update_proc_click_handler);\n  window_single_click_subscribe(BUTTON_ID_DOWN, toggle_update_proc_click_handler);\n}\n\nstatic void window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  layer_set_update_proc(window_layer, update_procs[0]);\n  s_window_size = layer_get_bounds(window_layer).size;\n\n  // start update loop\n  update_animation(NULL);\n}\n\nstatic void init(void) {\n  s_main_window = window_create();\n  window_set_click_config_provider(s_main_window, click_config_provider);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = window_load,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit(void) {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_frame_buffer/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_gpath/README.md",
    "content": "# feature_gpath\n\n![screenshot](feature_gpath_screenshot.png)\n\nThis example shows how to draw a path.\n"
  },
  {
    "path": "watchapps/feature_gpath/appinfo.json",
    "content": "{\n  \"uuid\": \"6d5f57f9-b01c-4a6a-88f0-ec024d38ba41\",\n  \"shortName\": \"GPath Demo\",\n  \"longName\": \"GPath Demo\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_gpath/src/feature_gpath.c",
    "content": "#include \"pebble.h\"\n\n#define NUM_PATHS 2\n\n// This defines graphics path information to be loaded as a path later\nstatic const GPathInfo HOUSE_PATH_POINTS = {\n  // This is the amount of points\n  11,\n  // A path can be concave, but it should not twist on itself\n  // The points should be defined in clockwise order due to the rendering\n  // implementation. Counter-clockwise will work in older firmwares, but\n  // it is not officially supported\n  (GPoint []) {\n    {-40, 0},\n    {0, -40},\n    {40, 0},\n    {28, 0},\n    {28, 40},\n    {10, 40},\n    {10, 16},\n    {-10, 16},\n    {-10, 40},\n    {-28, 40},\n    {-28, 0}\n  }\n};\n\n// This is an example of a path that looks like a compound path\n// If you rotate it however, you will see it is a single shape\nstatic const GPathInfo INFINITY_RECT_PATH_POINTS = {\n  16,\n  (GPoint []) {\n    {-50, 0},\n    {-50, -60},\n    {10, -60},\n    {10, -20},\n    {-10, -20},\n    {-10, -40},\n    {-30, -40},\n    {-30, -20},\n    {50, -20},\n    {50, 40},\n    {-10, 40},\n    {-10, 0},\n    {10, 0},\n    {10, 20},\n    {30, 20},\n    {30, 0}\n  }\n};\n\nstatic Window *s_main_window;\nstatic Layer *s_path_layer;\n\nstatic GPath *s_path_array[NUM_PATHS];\nstatic GPath *s_house_path, *s_infinity_path, *s_current_path;\n\nstatic int s_current_path_index;\nstatic int s_path_angle;\nstatic bool s_outline_mode;\n\n// This is the layer update callback which is called on render updates\nstatic void path_layer_update_callback(Layer *layer, GContext *ctx) {\n  // You can rotate the path before rendering\n  gpath_rotate_to(s_current_path, (TRIG_MAX_ANGLE / 360) * s_path_angle);\n\n  // There are two ways you can draw a GPath: outline or filled\n  // In this example, only one or the other is drawn, but you can draw\n  // multiple instances of the same path filled or outline.\n  if (s_outline_mode) {\n    // draw outline uses the stroke color\n    graphics_context_set_stroke_color(ctx, GColorWhite);\n    gpath_draw_outline(ctx, s_current_path);\n  } else {\n    // draw filled uses the fill color\n    graphics_context_set_fill_color(ctx, GColorWhite);\n    gpath_draw_filled(ctx, s_current_path);\n  }\n}\n\nstatic int path_angle_add(int angle) {\n  return s_path_angle = (s_path_angle + angle) % 360;\n}\n\nstatic void up_click_handler(ClickRecognizerRef recognizer, void *context) {\n  // Rotate the path counter-clockwise\n  path_angle_add(-10);\n  layer_mark_dirty(s_path_layer);\n}\n\nstatic void down_click_handler(ClickRecognizerRef recognizer, void *context) {\n  // Rotate the path clockwise\n  path_angle_add(10);\n  layer_mark_dirty(s_path_layer);\n}\n\nstatic void select_raw_down_handler(ClickRecognizerRef recognizer, void *context) {\n  // Show the outline of the path when select is held down\n  s_outline_mode = true;\n  layer_mark_dirty(s_path_layer);\n}\nstatic void select_raw_up_handler(ClickRecognizerRef recognizer, void *context) {\n  // Show the path filled\n  s_outline_mode = false;\n\n  // Cycle to the next path\n  s_current_path_index = (s_current_path_index + 1) % NUM_PATHS;\n  s_current_path = s_path_array[s_current_path_index];\n  layer_mark_dirty(s_path_layer);\n}\n\nstatic void config_provider(void *context) {\n  window_single_click_subscribe(BUTTON_ID_UP, up_click_handler);\n  window_single_click_subscribe(BUTTON_ID_DOWN, down_click_handler);\n  window_raw_click_subscribe(BUTTON_ID_SELECT, select_raw_down_handler, select_raw_up_handler, NULL);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_path_layer = layer_create(bounds);\n  layer_set_update_proc(s_path_layer, path_layer_update_callback);\n  layer_add_child(window_layer, s_path_layer);\n\n  // Move all paths to the center of the screen\n  for (int i = 0; i < NUM_PATHS; i++) {\n    gpath_move_to(s_path_array[i], GPoint(bounds.size.w/2, bounds.size.h/2));\n  }\n}\n\nstatic void main_window_unload(Window *window) {\n  layer_destroy(s_path_layer);\n}\n\nstatic void init() {\n  // Pass the corresponding GPathInfo to initialize a GPath\n  s_house_path = gpath_create(&HOUSE_PATH_POINTS);\n  s_infinity_path = gpath_create(&INFINITY_RECT_PATH_POINTS);\n\n  // This demo allows you to cycle paths in an array\n  // Try adding more GPaths to cycle through\n  // You'll need to define another GPathInfo\n  // Remember to update NUM_PATHS accordingly\n  s_path_array[0] = s_house_path;\n  s_path_array[1] = s_infinity_path;\n\n  s_current_path = s_path_array[0];\n\n  // Create Window\n  s_main_window = window_create();\n  window_set_background_color(s_main_window, GColorBlack);\n  window_set_click_config_provider(s_main_window, config_provider);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n\n  gpath_destroy(s_house_path);\n  gpath_destroy(s_infinity_path);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_gpath/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_image/README.md",
    "content": "# feature_image\n\n![screenshot](feature_image_screenshot.png)\n\nThis example demonstrates how to display a two color, black and white bitmap image with no transparency.\n"
  },
  {
    "path": "watchapps/feature_image/appinfo.json",
    "content": "{\n  \"uuid\": \"3cf2450e-5f6f-4f22-baaa-8c2a968cfc28\",\n  \"shortName\": \"Image Demo\",\n  \"longName\": \"Image Demo\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NO_LITTER\",\n        \"file\": \"images/no_litter.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_image/src/feature_image.c",
    "content": "/*\n * Demonstrate how to display a two color, black and white bitmap image with no\n * transparency.\n *\n * The original source image is from:\n *  <http://openclipart.org/detail/26728/aiga-litter-disposal-by-anonymous>\n *\n * The source image was converted from an SVG into a RGB bitmap using Inkscape.\n * It has no transparency and uses only black and white as colors.\n */\n\n#include \"pebble.h\"\n\nstatic Window *s_main_window;\nstatic BitmapLayer *s_image_layer;\nstatic GBitmap *s_image_bitmap;\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_image_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_NO_LITTER);\n\n  s_image_layer = bitmap_layer_create(bounds);\n  bitmap_layer_set_bitmap(s_image_layer, s_image_bitmap);\n  bitmap_layer_set_alignment(s_image_layer, GAlignCenter);\n  layer_add_child(window_layer, bitmap_layer_get_layer(s_image_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  bitmap_layer_destroy(s_image_layer);\n  gbitmap_destroy(s_image_bitmap);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_image/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_image_transparent/README.md",
    "content": "# feature_image_transparent\n\n![screenshot](feature_image_transparent_screenshot.png)\n\nThis example demonstrates how to display an image with black, white and transparent sections.\n"
  },
  {
    "path": "watchapps/feature_image_transparent/appinfo.json",
    "content": "{\n  \"uuid\": \"20c30673-36bc-4e9a-a05e-ac9d7dc5977e\",\n  \"shortName\": \"Transparent Demo\",\n  \"longName\": \"Transparent Demo\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"type\": \"png-trans\",\n        \"name\": \"IMAGE_PANDA\",\n        \"file\": \"images/panda.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_image_transparent/src/feature_image_transparent.c",
    "content": "/*\n * Demonstrate how to display an image with black, white and transparent sections.\n *\n * To achieve this effect you need to use GCompOp with two bitmaps: one is black\n * and transparent, the other is white and transparent.\n *\n * The two bitmaps are created during the build process from a RGBA format PNG file.\n *\n * The image can also be rotated at runtime.\n *\n * The demonstration image is a modified version of the following SVG\n * exported from Inkscape:\n *\n * <http://openclipart.org/detail/48919/panda-with-bamboo-leaves-by-adam_lowe>\n */\n\n#include \"pebble.h\"\n\nstatic Window *s_main_window;\nstatic TextLayer *s_text_layer;\nstatic GBitmap *s_white_bitmap, *s_black_bitmap;\nstatic BitmapLayer *s_white_layer, *s_black_layer;\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_bounds(window_layer);\n\n  // We do this to account for the offset due to the status bar\n  // at the top of the app window.\n  GRect layer_frame_description = layer_get_frame(window_layer);\n  layer_frame_description.origin.x = 0;\n  layer_frame_description.origin.y = 0;\n\n  // Add some background content to help demonstrate transparency.\n  s_text_layer = text_layer_create(layer_frame_description);\n  text_layer_set_text(s_text_layer,\n      \"pandamonium pandamon\\n\"\n      \"ium pandamonium panda\\n\"\n      \"monium     pandamonium\\n\"\n      \"pandamonium pandamon\\n\"\n      \"ium pandamonium panda\\n\"\n      \"monium     pandamonium\\n\"\n      \"pandamonium pandamon\\n\"\n      \"ium pandamonium panda\\n\"\n      \"monium pandamonium p\\n\"\n      \"andamonium pandamoni\\n\");\n  layer_add_child(window_layer, text_layer_get_layer(s_text_layer));\n\n  s_white_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_PANDA_WHITE);\n  s_black_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_PANDA_BLACK);\n\n  GPoint center = grect_center_point(&bounds);\n#ifdef PBL_PLATFORM_BASALT\n  GSize image_size = gbitmap_get_bounds(s_white_bitmap).size;\n#else\n  GSize image_size = s_white_bitmap->bounds.size;\n#endif\n  GRect image_frame = GRect(center.x, center.y, image_size.w, image_size.h);\n  image_frame.origin.x -= image_size.w / 2;\n  image_frame.origin.y -= image_size.h / 2;\n\n  // Use GCompOpOr to display the white portions of the image\n  s_white_layer = bitmap_layer_create(image_frame);\n  bitmap_layer_set_bitmap(s_white_layer, s_white_bitmap);\n  bitmap_layer_set_compositing_mode(s_white_layer, GCompOpOr);\n  layer_add_child(window_layer, bitmap_layer_get_layer(s_white_layer));\n\n  // Use GCompOpClear to display the black portions of the image\n  s_black_layer = bitmap_layer_create(image_frame);\n  bitmap_layer_set_bitmap(s_black_layer, s_black_bitmap);\n  bitmap_layer_set_compositing_mode(s_black_layer, GCompOpClear);\n  layer_add_child(window_layer, bitmap_layer_get_layer(s_black_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  bitmap_layer_destroy(s_white_layer);\n  bitmap_layer_destroy(s_black_layer);\n  text_layer_destroy(s_text_layer);\n  gbitmap_destroy(s_white_bitmap);\n  gbitmap_destroy(s_black_bitmap);\n}\n\nstatic void init(void) {\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit(void) {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_image_transparent/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_inverter_layer/README.md",
    "content": "# feature_inverter_layer\n\n![screenshot](feature_inverter_layer_screenshot.png)\n\nThis example shows how to use the [`InverterLayer`](https://developer.getpebble.com/docs/c/group___inverter_layer.html) to invert an area in a graphics context to make the black pixels white and vice versa.\n"
  },
  {
    "path": "watchapps/feature_inverter_layer/appinfo.json",
    "content": "{\n  \"uuid\": \"0c136b6e-7f4c-4888-92e2-756392fc0f3b\",\n  \"shortName\": \"Inverter Layer\",\n  \"longName\": \"Inverter Layer\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_inverter_layer/src/feature_inverter_layer.c",
    "content": "#include \"pebble.h\"\n\nstatic Window *s_main_window;\nstatic TextLayer *s_text_below, *s_text_above;\nstatic InverterLayer *s_inverter_layer;\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_text_below = text_layer_create(GRect(0, 54, bounds.size.w, bounds.size.h-54 /* height */));\n  text_layer_set_text(s_text_below, \"below\");\n  text_layer_set_font(s_text_below, fonts_get_system_font(FONT_KEY_ROBOTO_CONDENSED_21));\n  text_layer_set_text_alignment(s_text_below, GTextAlignmentCenter);\n  layer_add_child(window_layer, text_layer_get_layer(s_text_below));\n\n  s_inverter_layer = inverter_layer_create(GRect(bounds.size.w/2, 0, bounds.size.w, bounds.size.h));\n  layer_add_child(window_layer, inverter_layer_get_layer(s_inverter_layer));\n\n  s_text_above = text_layer_create(GRect(0, 84, bounds.size.w, 168-84 /* height */));\n  text_layer_set_text(s_text_above, \"above\");\n  text_layer_set_font(s_text_above, fonts_get_system_font(FONT_KEY_ROBOTO_CONDENSED_21));\n  text_layer_set_text_alignment(s_text_above, GTextAlignmentCenter);\n  text_layer_set_background_color(s_text_above, GColorClear);\n  layer_add_child(window_layer, text_layer_get_layer(s_text_above));\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_text_above);\n  text_layer_destroy(s_text_below);\n  inverter_layer_destroy(s_inverter_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_inverter_layer/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_layer_data/README.md",
    "content": "# feature_layer_data\n\n![screenshot](feature_layer_data_screenshot.png)\n\nThis example shows how to use the layer data.\n"
  },
  {
    "path": "watchapps/feature_layer_data/appinfo.json",
    "content": "{\n  \"uuid\": \"4dbf3472-da52-462c-9de2-77b92caabe8c\",\n  \"shortName\": \"Layer Data Demo\",\n  \"longName\": \"Layer Data Demo\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 1,\n  \"versionLabel\": \"1.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {\n    \"dummy\": 0\n  },\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_layer_data/src/feature_layer_data.c",
    "content": "/* Inspired by peapod's progress bar layer: https://github.com/Kathatrine/peapod */\n#include <pebble.h>\n\n#define SPEED_MAX 5000\n#define SPEED_MIN 50\n#define DEFAULT_SPEED 750\n\ntypedef Layer ProgressBarLayer;\n\nstatic Window *s_main_window;\nstatic TextLayer *s_done_text, *s_instruction_text;\nstatic AppTimer *s_progress_timer;\nstatic ProgressBarLayer *s_progress_bar;\nstatic unsigned int s_current_speed = DEFAULT_SPEED;\n\ntypedef struct {\n  unsigned int progress; // how full the progress bar is\n} ProgressData;\n\nstatic void progress_timer_callback(void *data) {\n  ProgressData *d = layer_get_data(s_progress_bar);\n  if (d->progress > 129) {\n    s_progress_timer = NULL;\n    text_layer_set_text(s_done_text, \"Done!\");\n  } else {\n    s_progress_timer = app_timer_register(s_current_speed, progress_timer_callback, NULL);\n    layer_mark_dirty(s_progress_bar);\n  }\n}\n\nstatic void select_click_handler(ClickRecognizerRef recognizer, void *context) {\n  ProgressData *data = layer_get_data(s_progress_bar);\n  data->progress = 0;\n  s_current_speed = DEFAULT_SPEED;\n  if (s_progress_timer) {\n    app_timer_cancel(s_progress_timer);\n  }\n  s_progress_timer = app_timer_register(s_current_speed, progress_timer_callback, NULL);\n  text_layer_set_text(s_done_text, \"\");\n  layer_mark_dirty(s_progress_bar);\n}\n\nstatic void up_click_handler(ClickRecognizerRef recognizer, void *context) {\n  if (s_current_speed > SPEED_MIN) {\n    s_current_speed -= 50;\n  }\n}\n\nstatic void down_click_handler(ClickRecognizerRef recognizer, void *context) {\n  if (s_current_speed < SPEED_MAX) {\n    s_current_speed += 50;\n  }\n}\n\nstatic void config_provider(void *context) {\n  window_single_click_subscribe(BUTTON_ID_UP, up_click_handler);\n  window_single_click_subscribe(BUTTON_ID_SELECT, select_click_handler);\n  window_single_click_subscribe(BUTTON_ID_DOWN, down_click_handler);\n}\n\nstatic void progress_bar_layer_update(ProgressBarLayer *bar, GContext *ctx) {\n  ProgressData *data = (ProgressData *)layer_get_data(bar);\n\n  // Outline the progress bar\n  graphics_context_set_stroke_color(ctx, GColorBlack);\n  GRect bounds = layer_get_bounds(bar);\n  graphics_draw_round_rect(ctx, GRect(0, 0, bounds.size.w, bounds.size.h), 4);\n\n  // Fill the progress bar\n  graphics_context_set_fill_color(ctx, GColorBlack);\n  graphics_fill_rect(ctx, GRect(0, 0, data->progress, bounds.size.h), 4, GCornersAll);\n  ++data->progress;\n}\n\nstatic ProgressBarLayer* progress_bar_layer_create(void) {\n  ProgressBarLayer *progress_bar_layer = layer_create_with_data(GRect(6, 120, 130, 8), sizeof(ProgressData));\n  layer_set_update_proc(progress_bar_layer, progress_bar_layer_update);\n  layer_mark_dirty(progress_bar_layer);\n\n  return progress_bar_layer;\n}\n\nstatic void progress_bar_destroy(ProgressBarLayer *progress_bar_layer) {\n  layer_destroy(progress_bar_layer);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n\n  s_instruction_text = text_layer_create(GRect(0, 0, 144, 73));\n  layer_add_child(window_layer, text_layer_get_layer(s_instruction_text));\n  text_layer_set_text(s_instruction_text, \"[UP] increase speed\\n[SEL] reset\\n[DN] decrease speed\");\n\n  s_progress_bar = progress_bar_layer_create();\n  layer_add_child(window_layer, s_progress_bar);\n\n  s_done_text = text_layer_create(GRect(50, 74, 94, 20));\n  layer_add_child(window_layer, text_layer_get_layer(s_done_text));\n\n  // Start the progress timer\n  s_progress_timer = app_timer_register(s_current_speed, progress_timer_callback, NULL);\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_done_text);\n  progress_bar_destroy(s_progress_bar);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_click_config_provider(s_main_window, config_provider);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_layer_data/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_menu_layer/README.md",
    "content": "# feature_menu_layer\n\n![screenshot](feature_menu_layer_screenshot.png)\n\nThis example shows how to use the [`MenuLayer`](https://developer.getpebble.com/docs/c/group___menu_layer.html).\n"
  },
  {
    "path": "watchapps/feature_menu_layer/appinfo.json",
    "content": "{\n  \"uuid\": \"1d6c7f01-d948-42a6-aa4e-b2084210ebbc\",\n  \"shortName\": \"Menu Layer Demo\",\n  \"longName\": \"Menu Layer Demo\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_MENU_ICON_BIG_WATCH\",\n        \"file\": \"images/menu_icon_big_watch.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_MENU_ICON_SECTOR_WATCH\",\n        \"file\": \"images/menu_icon_sector_watch.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_MENU_ICON_BINARY_WATCH\",\n        \"file\": \"images/menu_icon_binary_watch.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_BACKGROUND_BRAINS\",\n        \"file\": \"images/brains_watch_background.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_menu_layer/src/feature_menu_layer.c",
    "content": "#include \"pebble.h\"\n\n#define NUM_MENU_SECTIONS 2\n#define NUM_MENU_ICONS 3\n#define NUM_FIRST_MENU_ITEMS 3\n#define NUM_SECOND_MENU_ITEMS 1\n\nstatic Window *s_main_window;\nstatic MenuLayer *s_menu_layer;\nstatic GBitmap *s_menu_icons[NUM_MENU_ICONS];\nstatic GBitmap *s_background_bitmap;\n\nstatic int s_current_icon = 0;\n\nstatic uint16_t menu_get_num_sections_callback(MenuLayer *menu_layer, void *data) {\n  return NUM_MENU_SECTIONS;\n}\n\nstatic uint16_t menu_get_num_rows_callback(MenuLayer *menu_layer, uint16_t section_index, void *data) {\n  switch (section_index) {\n    case 0:\n      return NUM_FIRST_MENU_ITEMS;\n    case 1:\n      return NUM_SECOND_MENU_ITEMS;\n    default:\n      return 0;\n  }\n}\n\nstatic int16_t menu_get_header_height_callback(MenuLayer *menu_layer, uint16_t section_index, void *data) {\n  return MENU_CELL_BASIC_HEADER_HEIGHT;\n}\n\nstatic void menu_draw_header_callback(GContext* ctx, const Layer *cell_layer, uint16_t section_index, void *data) {\n  // Determine which section we're working with\n  switch (section_index) {\n    case 0:\n      // Draw title text in the section header\n      menu_cell_basic_header_draw(ctx, cell_layer, \"Some example items\");\n      break;\n    case 1:\n      menu_cell_basic_header_draw(ctx, cell_layer, \"One more\");\n      break;\n  }\n}\n\nstatic void menu_draw_row_callback(GContext* ctx, const Layer *cell_layer, MenuIndex *cell_index, void *data) {\n  // Determine which section we're going to draw in\n  switch (cell_index->section) {\n    case 0:\n      // Use the row to specify which item we'll draw\n      switch (cell_index->row) {\n        case 0:\n          // This is a basic menu item with a title and subtitle\n          menu_cell_basic_draw(ctx, cell_layer, \"Basic Item\", \"With a subtitle\", NULL);\n          break;\n        case 1:\n          // This is a basic menu icon with a cycling icon\n          menu_cell_basic_draw(ctx, cell_layer, \"Icon Item\", \"Select to cycle\", s_menu_icons[s_current_icon]);\n          break;\n        case 2: \n          {\n            // Here we use the graphics context to draw something different\n            // In this case, we show a strip of a watchface's background\n            GSize size = layer_get_frame(cell_layer).size;\n            graphics_draw_bitmap_in_rect(ctx, s_background_bitmap, GRect(0, 0, size.w, size.h));\n          }\n          break;\n      }\n      break;\n    case 1:\n      switch (cell_index->row) {\n        case 0:\n          // There is title draw for something more simple than a basic menu item\n          menu_cell_title_draw(ctx, cell_layer, \"Final Item\");\n          break;\n      }\n  }\n}\n\nstatic void menu_select_callback(MenuLayer *menu_layer, MenuIndex *cell_index, void *data) {\n  // Use the row to specify which item will receive the select action\n  switch (cell_index->row) {\n    // This is the menu item with the cycling icon\n    case 1:\n      // Cycle the icon\n      s_current_icon = (s_current_icon + 1) % NUM_MENU_ICONS;\n      // After changing the icon, mark the layer to have it updated\n      layer_mark_dirty(menu_layer_get_layer(menu_layer));\n      break;\n  }\n\n}\n\nstatic void main_window_load(Window *window) {\n  // Here we load the bitmap assets\n  s_menu_icons[0] = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_MENU_ICON_BIG_WATCH);\n  s_menu_icons[1] = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_MENU_ICON_SECTOR_WATCH);\n  s_menu_icons[2] = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_MENU_ICON_BINARY_WATCH);\n\n  // And also load the background\n  s_background_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BACKGROUND_BRAINS);\n\n  // Now we prepare to initialize the menu layer\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  // Create the menu layer\n  s_menu_layer = menu_layer_create(bounds);\n  menu_layer_set_callbacks(s_menu_layer, NULL, (MenuLayerCallbacks){\n    .get_num_sections = menu_get_num_sections_callback,\n    .get_num_rows = menu_get_num_rows_callback,\n    .get_header_height = menu_get_header_height_callback,\n    .draw_header = menu_draw_header_callback,\n    .draw_row = menu_draw_row_callback,\n    .select_click = menu_select_callback,\n  });\n\n  // Bind the menu layer's click config provider to the window for interactivity\n  menu_layer_set_click_config_onto_window(s_menu_layer, window);\n\n  layer_add_child(window_layer, menu_layer_get_layer(s_menu_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  // Destroy the menu layer\n  menu_layer_destroy(s_menu_layer);\n\n  // Cleanup the menu icons\n  for (int i = 0; i < NUM_MENU_ICONS; i++) {\n    gbitmap_destroy(s_menu_icons[i]);\n  }\n\n  gbitmap_destroy(s_background_bitmap);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_menu_layer/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_persist_counter/README.md",
    "content": "# feature_persist_counter\n\n![screenshot](feature_persist_counter_screenshot.png)\n\nThis example shows how to use the [`Persistent Storage`](https://developer.getpebble.com/docs/c/group___storage.html) API.\n"
  },
  {
    "path": "watchapps/feature_persist_counter/appinfo.json",
    "content": "{\n  \"uuid\": \"703b16db-2e94-4b39-83ea-3f206a254235\",\n  \"shortName\": \"Drink Counter\",\n  \"longName\": \"Drink Counter\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"type\": \"pbi\",\n        \"name\": \"IMAGE_ACTION_ICON_PLUS\",\n        \"file\": \"images/action_icon_plus.png\"\n      },\n      {\n        \"type\": \"pbi\",\n        \"name\": \"IMAGE_ACTION_ICON_MINUS\",\n        \"file\": \"images/action_icon_minus.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_persist_counter/src/feature_persist_counter.c",
    "content": "#include \"pebble.h\"\n\n#define REPEAT_INTERVAL_MS 50\n\n// This is a custom defined key for saving our count field\n#define NUM_DRINKS_PKEY 1\n\n// You can define defaults for values in persistent storage\n#define NUM_DRINKS_DEFAULT 0\n\nstatic Window *s_main_window;\n\nstatic ActionBarLayer *s_action_bar;\nstatic TextLayer *s_header_layer, *s_body_layer, *s_label_layer;\nstatic GBitmap *s_icon_plus, *s_icon_minus;\n\nstatic int s_num_drinks = NUM_DRINKS_DEFAULT;\n\nstatic void update_text() {\n  static char s_body_text[18];\n  snprintf(s_body_text, sizeof(s_body_text), \"%u Bottles\", s_num_drinks);\n  text_layer_set_text(s_body_layer, s_body_text);\n}\n\nstatic void increment_click_handler(ClickRecognizerRef recognizer, void *context) {\n  s_num_drinks++;\n  update_text();\n}\n\nstatic void decrement_click_handler(ClickRecognizerRef recognizer, void *context) {\n  if (s_num_drinks <= 0) {\n    // Keep the counter at zero\n    return;\n  }\n\n  s_num_drinks--;\n  update_text();\n}\n\nstatic void click_config_provider(void *context) {\n  window_single_repeating_click_subscribe(BUTTON_ID_UP, REPEAT_INTERVAL_MS, increment_click_handler);\n  window_single_repeating_click_subscribe(BUTTON_ID_DOWN, REPEAT_INTERVAL_MS, decrement_click_handler);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n\n  s_action_bar = action_bar_layer_create();\n  action_bar_layer_add_to_window(s_action_bar, window);\n  action_bar_layer_set_click_config_provider(s_action_bar, click_config_provider);\n\n  action_bar_layer_set_icon(s_action_bar, BUTTON_ID_UP, s_icon_plus);\n  action_bar_layer_set_icon(s_action_bar, BUTTON_ID_DOWN, s_icon_minus);\n\n  int width = layer_get_frame(window_layer).size.w - ACTION_BAR_WIDTH - 3;\n\n  s_header_layer = text_layer_create(GRect(4, 0, width, 60));\n  text_layer_set_font(s_header_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24));\n  text_layer_set_background_color(s_header_layer, GColorClear);\n  text_layer_set_text(s_header_layer, \"Drink Counter\");\n  layer_add_child(window_layer, text_layer_get_layer(s_header_layer));\n\n  s_body_layer = text_layer_create(GRect(4, 44, width, 60));\n  text_layer_set_font(s_body_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));\n  text_layer_set_background_color(s_body_layer, GColorClear);\n  layer_add_child(window_layer, text_layer_get_layer(s_body_layer));\n\n  s_label_layer = text_layer_create(GRect(4, 44 + 28, width, 60));\n  text_layer_set_font(s_label_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18));\n  text_layer_set_background_color(s_label_layer, GColorClear);\n  text_layer_set_text(s_label_layer, \"of drinks on the wall\");\n  layer_add_child(window_layer, text_layer_get_layer(s_label_layer));\n\n  update_text();\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_header_layer);\n  text_layer_destroy(s_body_layer);\n  text_layer_destroy(s_label_layer);\n\n  action_bar_layer_destroy(s_action_bar);\n}\n\nstatic void init() {\n  s_icon_plus = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_ACTION_ICON_PLUS);\n  s_icon_minus = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_ACTION_ICON_MINUS);\n\n  // Get the count from persistent storage for use if it exists, otherwise use the default\n  s_num_drinks = persist_exists(NUM_DRINKS_PKEY) ? persist_read_int(NUM_DRINKS_PKEY) : NUM_DRINKS_DEFAULT;\n\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  // Save the count into persistent storage on app exit\n  persist_write_int(NUM_DRINKS_PKEY, s_num_drinks);\n\n  window_destroy(s_main_window);\n\n  gbitmap_destroy(s_icon_plus);\n  gbitmap_destroy(s_icon_minus);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_persist_counter/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_property_animation/README.md",
    "content": "# feature_property_animation\n\n![screenshot](feature_property_animation_screenshot.png)\n\nThis example shows how to use the [`PropertyAnimation`](https://developer.getpebble.com/docs/c/group___property_animation.html) API.\n"
  },
  {
    "path": "watchapps/feature_property_animation/appinfo.json",
    "content": "{\n  \"uuid\": \"4401751d-9e98-4e66-b9f8-77a55a573f67\",\n  \"shortName\": \"Static Demo\",\n  \"longName\": \"Static Demo\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_property_animation/src/feature_property_animation.c",
    "content": "#include <pebble.h>\n\nstatic Window *s_main_window;\nstatic TextLayer *s_text_layer;\nstatic PropertyAnimation *s_prop_animation;\n\nstatic int s_toggle;\n\nstatic void animation_started(Animation *animation, void *data) {\n  text_layer_set_text(s_text_layer, \"Started.\");\n}\n\nstatic void animation_stopped(Animation *animation, bool finished, void *data) {\n  text_layer_set_text(s_text_layer, finished ? \"Hi, I'm a TextLayer!\" : \"Just Stopped.\");\n}\n\nstatic void destroy_property_animation(PropertyAnimation **prop_animation) {\n  if (*prop_animation == NULL) {\n    return;\n  }\n\n  if (animation_is_scheduled((Animation*) *prop_animation)) {\n    animation_unschedule((Animation*) *prop_animation);\n  }\n\n  property_animation_destroy(*prop_animation);\n  *prop_animation = NULL;\n}\n\nstatic void click_handler(ClickRecognizerRef recognizer, void *context) {\n  Layer *layer = text_layer_get_layer(s_text_layer);\n\n  GRect to_rect = (s_toggle) ? GRect(4, 4, 120, 60) : GRect(84, 92, 60, 60);\n\n  s_toggle = !s_toggle;\n\n  destroy_property_animation(&s_prop_animation);\n\n  s_prop_animation = property_animation_create_layer_frame(layer, NULL, &to_rect);\n  animation_set_duration((Animation*) s_prop_animation, 400);\n  switch (click_recognizer_get_button_id(recognizer)) {\n    case BUTTON_ID_UP:\n      animation_set_curve((Animation*) s_prop_animation, AnimationCurveEaseOut);\n      break;\n\n    case BUTTON_ID_DOWN:\n      animation_set_curve((Animation*) s_prop_animation, AnimationCurveEaseIn);\n      break;\n\n    default:\n    case BUTTON_ID_SELECT:\n      animation_set_curve((Animation*) s_prop_animation, AnimationCurveEaseInOut);\n      break;\n  }\n\n  /*\n   // Example animation parameters:\n\n   // Duration defaults to 250 ms\n   animation_set_duration(&s_prop_animation->animation, 1000);\n\n   // Curve defaults to ease-in-out\n   animation_set_curve(&s_prop_animation->animation, AnimationCurveEaseOut);\n\n   // Delay defaults to 0 ms\n   animation_set_delay(&s_prop_animation->animation, 1000);\n   */\n\n  animation_set_handlers((Animation*) s_prop_animation, (AnimationHandlers) {\n    .started = (AnimationStartedHandler) animation_started,\n    .stopped = (AnimationStoppedHandler) animation_stopped,\n  }, NULL /* callback data */);\n  animation_schedule((Animation*) s_prop_animation);\n}\n\nstatic void click_config_provider(void *context) {\n  window_single_click_subscribe(BUTTON_ID_UP, click_handler);\n  window_single_click_subscribe(BUTTON_ID_SELECT, click_handler);\n  window_single_click_subscribe(BUTTON_ID_DOWN, click_handler);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(s_main_window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_text_layer = text_layer_create(GRect(0, 0, 60, 60));\n  text_layer_set_text(s_text_layer, \"Started!\");\n  layer_add_child(window_layer, text_layer_get_layer(s_text_layer));\n\n  GRect to_rect = GRect(84, 92, 60, 60);\n\n  s_prop_animation = property_animation_create_layer_frame(text_layer_get_layer(s_text_layer), NULL, &to_rect);\n\n  animation_schedule((Animation*) s_prop_animation);\n}\n\nstatic void main_window_unload(Window *window) {\n  destroy_property_animation(&s_prop_animation);\n  text_layer_destroy(s_text_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_click_config_provider(s_main_window, click_config_provider);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit(void) {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_property_animation/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_scroll_layer/README.md",
    "content": "# feature_scroll_layer\n\n![screenshot](feature_scroll_layer_screenshot.png)\n\nThis example shows how to use the [`ScrollLayer`](https://developer.getpebble.com/docs/c/group___scroll_layer.html).\n"
  },
  {
    "path": "watchapps/feature_scroll_layer/appinfo.json",
    "content": "{\n  \"uuid\": \"1542cda0-eb9c-4ea4-ae82-5db0b2b720df\",\n  \"shortName\": \"Scroll Demo\",\n  \"longName\": \"Scroll Demo\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_scroll_layer/src/feature_scroll_layer.c",
    "content": "#include \"pebble.h\"\n\nstatic Window *s_main_window;\n\n// This is a scroll layer\nstatic ScrollLayer *s_scroll_layer;\n\n// We also use a text layer to scroll in the scroll layer\nstatic TextLayer *s_text_layer;\n\n// The scroll layer can other things in it such as an invert layer\nstatic InverterLayer *s_inverter_layer;\n\n// Lorum ipsum to have something to scroll\nstatic char s_scroll_text[] = \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam quam tellus, fermentu  m quis vulputate quis, vestibulum interdum sapien. Vestibulum lobortis pellentesque pretium. Quisque ultricies purus e  u orci convallis lacinia. Cras a urna mi. Donec convallis ante id dui dapibus nec ullamcorper erat egestas. Aenean a m  auris a sapien commodo lacinia. Sed posuere mi vel risus congue ornare. Curabitur leo nisi, euismod ut pellentesque se  d, suscipit sit amet lorem. Aliquam eget sem vitae sem aliquam ornare. In sem sapien, imperdiet eget pharetra a, lacin  ia ac justo. Suspendisse at ante nec felis facilisis eleifend.\";\n\n// Setup the scroll layer on window load\n// We do this here in order to be able to get the max used text size\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_frame(window_layer);\n  GRect max_text_bounds = GRect(0, 0, bounds.size.w, 2000);\n\n  // Initialize the scroll layer\n  s_scroll_layer = scroll_layer_create(bounds);\n\n  // This binds the scroll layer to the window so that up and down map to scrolling\n  // You may use scroll_layer_set_callbacks to add or override interactivity\n  scroll_layer_set_click_config_onto_window(s_scroll_layer, window);\n\n  // Initialize the text layer\n  s_text_layer = text_layer_create(max_text_bounds);\n  text_layer_set_text(s_text_layer, s_scroll_text);\n\n  // Change the font to a nice readable one\n  // This is system font; you can inspect pebble_fonts.h for all system fonts\n  // or you can take a look at feature_custom_font to add your own font\n  text_layer_set_font(s_text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));\n\n  // Trim text layer and scroll content to fit text box\n  GSize max_size = text_layer_get_content_size(s_text_layer);\n  text_layer_set_size(s_text_layer, max_size);\n  scroll_layer_set_content_size(s_scroll_layer, GSize(bounds.size.w, max_size.h + 4));\n\n  // Add the layers for display\n  scroll_layer_add_child(s_scroll_layer, text_layer_get_layer(s_text_layer));\n\n  // The inverter layer will highlight some text\n  s_inverter_layer = inverter_layer_create(GRect(0, 28, bounds.size.w, 28));\n  scroll_layer_add_child(s_scroll_layer, inverter_layer_get_layer(s_inverter_layer));\n\n  layer_add_child(window_layer, scroll_layer_get_layer(s_scroll_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  inverter_layer_destroy(s_inverter_layer);\n  text_layer_destroy(s_text_layer);\n  scroll_layer_destroy(s_scroll_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_scroll_layer/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_simple_menu_layer/README.md",
    "content": "# feature_simple_menu_layer\n\n![screenshot](feature_simple_menu_layer_screenshot.png)\n\nThis example shows how to use the [`SimpleMenuLayer`](https://developer.getpebble.com/docs/c/group___simple_menu_layer.html).\n"
  },
  {
    "path": "watchapps/feature_simple_menu_layer/appinfo.json",
    "content": "{\n  \"uuid\": \"69a53987-379e-4ae7-a3c2-d08e5ffe8511\",\n  \"shortName\": \"Simple Menu\",\n  \"longName\": \"Simple Menu\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_MENU_ICON_1\",\n        \"file\": \"images/menu_icon_simplicity.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_simple_menu_layer/src/feature_simple_menu_layer.c",
    "content": "#include \"pebble.h\"\n\n#define NUM_MENU_SECTIONS 2\n#define NUM_FIRST_MENU_ITEMS 3\n#define NUM_SECOND_MENU_ITEMS 1\n\nstatic Window *s_main_window;\nstatic SimpleMenuLayer *s_simple_menu_layer;\nstatic SimpleMenuSection s_menu_sections[NUM_MENU_SECTIONS];\nstatic SimpleMenuItem s_first_menu_items[NUM_FIRST_MENU_ITEMS];\nstatic SimpleMenuItem s_second_menu_items[NUM_SECOND_MENU_ITEMS];\nstatic GBitmap *s_menu_icon_image;\n\nstatic bool s_special_flag = false;\nstatic int s_hit_count = 0;\n\nstatic void menu_select_callback(int index, void *ctx) {\n  s_first_menu_items[index].subtitle = \"You've hit select here!\";\n  layer_mark_dirty(simple_menu_layer_get_layer(s_simple_menu_layer));\n}\n\nstatic void special_select_callback(int index, void *ctx) {\n  // Of course, you can do more complicated things in a menu item select callback\n  // Here, we have a simple toggle\n  s_special_flag = !s_special_flag;\n\n  SimpleMenuItem *menu_item = &s_second_menu_items[index];\n\n  if (s_special_flag) {\n    menu_item->subtitle = \"Okay, it's not so special.\";\n  } else {\n    menu_item->subtitle = \"Well, maybe a little.\";\n  }\n\n  if (++s_hit_count > 5) {\n    menu_item->title = \"Very Special Item\";\n  }\n\n  layer_mark_dirty(simple_menu_layer_get_layer(s_simple_menu_layer));\n}\n\nstatic void main_window_load(Window *window) {\n  s_menu_icon_image = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_MENU_ICON_1);\n\n  // Although we already defined NUM_FIRST_MENU_ITEMS, you can define\n  // an int as such to easily change the order of menu items later\n  int num_a_items = 0;\n\n  s_first_menu_items[num_a_items++] = (SimpleMenuItem) {\n    .title = \"First Item\",\n    .callback = menu_select_callback,\n  };\n  s_first_menu_items[num_a_items++] = (SimpleMenuItem) {\n    .title = \"Second Item\",\n    .subtitle = \"Here's a subtitle\",\n    .callback = menu_select_callback,\n  };\n  s_first_menu_items[num_a_items++] = (SimpleMenuItem) {\n    .title = \"Third Item\",\n    .subtitle = \"This has an icon\",\n    .callback = menu_select_callback,\n    .icon = s_menu_icon_image,\n  };\n\n  s_second_menu_items[0] = (SimpleMenuItem) {\n    .title = \"Special Item\",\n    .callback = special_select_callback,\n  };\n\n  s_menu_sections[0] = (SimpleMenuSection) {\n    .num_items = NUM_FIRST_MENU_ITEMS,\n    .items = s_first_menu_items,\n  };\n  s_menu_sections[1] = (SimpleMenuSection) {\n    .title = \"Yet Another Section\",\n    .num_items = NUM_SECOND_MENU_ITEMS,\n    .items = s_second_menu_items,\n  };\n\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_simple_menu_layer = simple_menu_layer_create(bounds, window, s_menu_sections, NUM_MENU_SECTIONS, NULL);\n\n  layer_add_child(window_layer, simple_menu_layer_get_layer(s_simple_menu_layer));\n}\n\nvoid main_window_unload(Window *window) {\n  simple_menu_layer_destroy(s_simple_menu_layer);\n  gbitmap_destroy(s_menu_icon_image);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_simple_menu_layer/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_stdlib/README.md",
    "content": "# feature_stdlib\n\n![screenshot](feature_stdlib_screenshot.png)\n\nThis example shows uses for some of the [`Standard C`](https://developer.getpebble.com/docs/c/group___standard_c.html) functions.\n"
  },
  {
    "path": "watchapps/feature_stdlib/appinfo.json",
    "content": "{\n  \"uuid\": \"165dce7b-2f46-4339-bdc2-b06422f4df23\",\n  \"shortName\": \"Stdlib Demo\",\n  \"longName\": \"Stdlib Demo\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_stdlib/src/feature_stdlib.c",
    "content": "#include <pebble.h>\n\nstatic Window *s_main_window;\nstatic Layer *s_layer;\nstatic AppTimer *s_timer;\n\nstatic char s_info_text[64] = \"info\";\nstatic char s_str_example[32] = \"Goodbye!\";\nstatic char s_str_copy[] = \"Hello, World!\";\n\nstatic void update_layer_callback(Layer *layer, GContext *ctx) {\n  // Get the amount of seconds and the milliseconds part since the Epoch\n  // time_ms also returns the milliseconds, so you can optionally pass in null\n  // for any output parameters you don't need\n  time_t t = 0;\n  uint16_t t_ms = 0;\n  time_ms(&t, &t_ms);\n\n  // Get the next pseudo-random number\n  int r = rand();\n\n  // Print formatted text into a buffer\n  snprintf(s_info_text, sizeof(s_info_text), \"str: %s\\ntime: %lu\\nmilliseconds: %u\\nrand: %d\", s_str_example, t, t_ms, r);\n\n  GRect bounds = layer_get_frame(layer);\n\n  // Draw the formatted text\n  graphics_context_set_text_color(ctx, GColorBlack);\n  graphics_draw_text(ctx, s_info_text, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD), GRect(10, 5, bounds.size.w, bounds.size.h), GTextOverflowModeWordWrap, GTextAlignmentLeft, NULL);\n}\n\nstatic void timer_callback(void *data) {\n  layer_mark_dirty(s_layer);\n  s_timer = app_timer_register(50, timer_callback, NULL);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(s_main_window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_layer = layer_create(bounds);\n  layer_set_update_proc(s_layer, update_layer_callback);\n  layer_add_child(window_layer, s_layer);\n\n  // Copy the string into the example\n  strcpy(s_str_example, s_str_copy);\n\n  s_timer = app_timer_register(50, timer_callback, NULL);\n}\n\nstatic void main_window_unload(Window *window) {\n  layer_destroy(s_layer);\n}\n\nstatic void init() {\n  // Seed the pseudo-random number generator with the time\n  srand(time(NULL));\n\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_stdlib/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_text_alignment/README.md",
    "content": "# feature_text_alignment\n\n![screenshot](feature_text_alignment_screenshot.png)\n\nThis example shows how to align text.\n"
  },
  {
    "path": "watchapps/feature_text_alignment/appinfo.json",
    "content": "{\n  \"uuid\": \"0d22d0c7-a810-434b-824c-5f363f53be28\",\n  \"shortName\": \"Text Alignment\",\n  \"longName\": \"Text Alignment\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_text_alignment/src/feature_text_alignment.c",
    "content": "#include <pebble.h>\n\nstatic Window *s_main_window;\nstatic TextLayer *s_left_layer;\nstatic TextLayer *s_center_layer;\nstatic TextLayer *s_right_layer;\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_left_layer = text_layer_create(GRect(0, 20, bounds.size.w, 28));\n  text_layer_set_text(s_left_layer, \"Left\");\n  text_layer_set_font(s_left_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));\n  text_layer_set_text_alignment(s_left_layer, GTextAlignmentLeft);\n  layer_add_child(window_layer, text_layer_get_layer(s_left_layer));\n\n  s_center_layer = text_layer_create(GRect(0, 60, bounds.size.w, 28));\n  text_layer_set_text(s_center_layer, \"Center\");\n  text_layer_set_font(s_center_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));\n  text_layer_set_text_alignment(s_center_layer, GTextAlignmentCenter);\n  layer_add_child(window_layer, text_layer_get_layer(s_center_layer));\n\n  s_right_layer = text_layer_create(GRect(0, 100, bounds.size.w, 28));\n  text_layer_set_text(s_right_layer, \"Right\");\n  text_layer_set_font(s_right_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));\n  text_layer_set_text_alignment(s_right_layer, GTextAlignmentRight);\n  layer_add_child(window_layer, text_layer_get_layer(s_right_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_left_layer);\n  text_layer_destroy(s_center_layer);\n  text_layer_destroy(s_right_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_text_alignment/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_text_draw/README.md",
    "content": "# feature_text_draw\n\n![screenshot](feature_text_draw_screenshot.png)\n\nThis example shows how to draw text on a layer.\n"
  },
  {
    "path": "watchapps/feature_text_draw/appinfo.json",
    "content": "{\n  \"uuid\": \"434f3d92-cee5-488d-85f4-ad2d33aaf1ff\",\n  \"shortName\": \"Text Draw Demo\",\n  \"longName\": \"Text Draw Demo\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_text_draw/src/feature_text_draw.c",
    "content": "#include <pebble.h>\n\nstatic Window *s_main_window;\nstatic Layer *s_layer;\n\nstatic void update_layer_callback(Layer *layer, GContext *ctx) {\n  GRect bounds = layer_get_frame(layer);\n\n  graphics_context_set_text_color(ctx, GColorBlack);\n  graphics_draw_text(ctx, \"Text here.\", fonts_get_system_font(FONT_KEY_FONT_FALLBACK), GRect(5, 5, bounds.size.w - 10, 100), GTextOverflowModeWordWrap, GTextAlignmentLeft, NULL);\n  graphics_draw_text(ctx, \"And text here as well.\", fonts_get_system_font(FONT_KEY_FONT_FALLBACK), GRect(90, 100, bounds.size.w - 95, 60), GTextOverflowModeWordWrap, GTextAlignmentRight, NULL);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_layer = layer_create(bounds);\n  layer_set_update_proc(s_layer, update_layer_callback);\n  layer_add_child(window_layer, s_layer);\n}\n\nstatic void main_window_unload(Window *window) {\n  layer_destroy(s_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit(void) {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_text_draw/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_timer/README.md",
    "content": "# feature_timer\n\n![screenshot](feature_timer_screenshot.png)\n\nThis example shows how to use the [`Timer`](https://developer.getpebble.com/docs/c/group___timer.html).\n"
  },
  {
    "path": "watchapps/feature_timer/appinfo.json",
    "content": "{\n  \"uuid\": \"656bca9a-5400-42d2-afcf-e9bae1528df1\",\n  \"shortName\": \"Timer App\",\n  \"longName\": \"Timer App\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_timer/src/feature_timer.c",
    "content": "#include <pebble.h>\n\nstatic Window *s_main_window;\nstatic TextLayer *s_text_layer;\nstatic AppTimer *s_timer;\n\nstatic void timer_callback(void *data) {\n  text_layer_set_text(s_text_layer, \"Timer happened!\");\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_text_layer = text_layer_create(bounds);\n  text_layer_set_text(s_text_layer, \"Waiting for timer...\");\n  text_layer_set_font(s_text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));\n  text_layer_set_text_alignment(s_text_layer, GTextAlignmentCenter);\n  layer_add_child(window_layer, text_layer_get_layer(s_text_layer));\n\n  s_timer = app_timer_register(1500, timer_callback, NULL);\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_text_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit(void) {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_timer/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_timer_animation/README.md",
    "content": "# feature_timer_animation\n\n![screenshot](feature_timer_animation_screenshot.png)\n\nThis example shows how to use [`Timer`](https://developer.getpebble.com/docs/c/group___timer.html) for animation.\n"
  },
  {
    "path": "watchapps/feature_timer_animation/appinfo.json",
    "content": "{\n  \"uuid\": \"0133a0dd-37bf-4b42-a84d-5b6b12a4ed09\",\n  \"shortName\": \"Timer Animation\",\n  \"longName\": \"Timer Animation\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_timer_animation/src/feature_timer_animation.c",
    "content": "#include \"pebble.h\"\n\n#define TIMER_INTERVAL_MS 50\n\nstatic const GPathInfo SQUARE_POINTS = {\n  4,\n  (GPoint []) {\n    {-25, -25},\n    {-25,  25},\n    { 25,  25},\n    { 25, -25}\n  }\n};\n\nstatic Window *s_main_window;\nstatic Layer *s_square_layer;\nstatic GPath *s_square_path;\n\nstatic int s_angle;\n\nstatic void update_square_layer(Layer *layer, GContext* ctx) {\n  gpath_rotate_to(s_square_path, (TRIG_MAX_ANGLE / 360) * s_angle);\n  s_angle = (s_angle + 5) % 360;\n#ifdef PBL_COLOR\n  graphics_context_set_stroke_color(ctx, GColorDukeBlue);\n#else\n  graphics_context_set_stroke_color(ctx, GColorBlack);\n#endif\n  gpath_draw_outline(ctx, s_square_path);\n}\n\nstatic void timer_callback(void *context) {\n  layer_mark_dirty(s_square_layer);\n  app_timer_register(TIMER_INTERVAL_MS, timer_callback, NULL);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_bounds(window_layer);\n\n  s_square_layer = layer_create(bounds);\n  layer_set_update_proc(s_square_layer, update_square_layer);\n  layer_add_child(window_layer, s_square_layer);\n\n  s_square_path = gpath_create(&SQUARE_POINTS);\n  gpath_move_to(s_square_path, grect_center_point(&bounds));\n}\n\nstatic void main_window_unload(Window *window) {\n  gpath_destroy(s_square_path);\n  layer_destroy(s_square_layer);\n}\n\nstatic void init(void) {\n  s_main_window = window_create();\n#ifdef PBL_COLOR\n  window_set_background_color(s_main_window, GColorJaegerGreen);\n#endif\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n\n  app_timer_register(TIMER_INTERVAL_MS, timer_callback, NULL);\n}\n\nstatic void deinit(void) {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_timer_animation/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_vibe/README.md",
    "content": "# feature_vibe\n\n![screenshot](feature_vibe_screenshot.png)\n\nThis example shows how to use the built-in [vibration](https://developer.getpebble.com/docs/c/group___vibes.html) functions.\n"
  },
  {
    "path": "watchapps/feature_vibe/appinfo.json",
    "content": "{\n  \"uuid\": \"4f969153-f36e-470a-ac75-60f0c090ddbb\",\n  \"shortName\": \"Vibe Demo\",\n  \"longName\": \"Vibe Demo\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_vibe/src/feature_vibe.c",
    "content": "#include \"pebble.h\"\n\n#define REPEAT_INTERVAL_MS 1000\n\nstatic Window *s_main_window;\nstatic TextLayer *s_text_layer;\n\nstatic void up_single_click_handler(ClickRecognizerRef recognizer, void *context) {\n  vibes_short_pulse();\n}\n\nstatic void down_single_click_handler(ClickRecognizerRef recognizer, void *context) {\n  vibes_long_pulse();\n}\n\nstatic void select_single_click_handler(ClickRecognizerRef recognizer, void *context) {\n  vibes_double_pulse();\n}\n\nstatic void click_config_provider(void *context) {\n  window_single_repeating_click_subscribe(BUTTON_ID_SELECT, REPEAT_INTERVAL_MS, select_single_click_handler);\n  window_single_repeating_click_subscribe(BUTTON_ID_UP, REPEAT_INTERVAL_MS, up_single_click_handler);\n  window_single_repeating_click_subscribe(BUTTON_ID_DOWN, REPEAT_INTERVAL_MS, down_single_click_handler);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_frame(window_layer);\n  \n  s_text_layer = text_layer_create(bounds);\n  text_layer_set_text(s_text_layer, \"Press buttons for different vibes. Hold for repeating.\");\n  text_layer_set_font(s_text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));\n  text_layer_set_text_alignment(s_text_layer, GTextAlignmentCenter);\n  layer_add_child(window_layer, text_layer_get_layer(s_text_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_text_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_click_config_provider(s_main_window, click_config_provider);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();  \n}\n"
  },
  {
    "path": "watchapps/feature_vibe/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/feature_vibe_custom/README.md",
    "content": "# feature_vibe_custom\n\n![screenshot](feature_vibe_custom_screenshot.png)\n\nThis example shows how to make custom [vibration](https://developer.getpebble.com/docs/c/group___vibes.html) patterns.\n"
  },
  {
    "path": "watchapps/feature_vibe_custom/appinfo.json",
    "content": "{\n  \"uuid\": \"68d008b2-3a5a-45ed-811e-0955cde93b03\",\n  \"shortName\": \"Vibe Custom\",\n  \"longName\": \"Vibe Custom\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/feature_vibe_custom/src/feature_vibe_custom.c",
    "content": "#include \"pebble.h\"\n\n// Each duration corresponds to alternating on/off periods, starting on.\nstatic const VibePattern CUSTOM_PATTERN = {\n  .durations = (uint32_t[]) {100, 300, 300, 300, 100, 300},\n  .num_segments = 6\n};\n\nstatic Window *s_main_window;\nstatic TextLayer *s_text_layer;\n\nstatic void select_single_click_handler(ClickRecognizerRef recognizer, void *context) {\n  vibes_enqueue_custom_pattern(CUSTOM_PATTERN);\n}\n\nstatic void click_config_provider(void *context) {\n  window_single_click_subscribe(BUTTON_ID_DOWN, select_single_click_handler);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_frame(window_layer);\n  \n  s_text_layer = text_layer_create(bounds);\n  text_layer_set_text(s_text_layer, \"Press the down button for a custom vibration.\");\n  text_layer_set_font(s_text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));\n  text_layer_set_text_alignment(s_text_layer, GTextAlignmentCenter);\n  layer_add_child(window_layer, text_layer_get_layer(s_text_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_text_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_click_config_provider(s_main_window, click_config_provider);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/feature_vibe_custom/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchapps/pebble_arcade/README.md",
    "content": "# pebble_arcade\n\n![screenshot](pebble_arcade_screenshot.png)\n\nThis is a simple example for making a game.\n"
  },
  {
    "path": "watchapps/pebble_arcade/appinfo.json",
    "content": "{\n  \"uuid\": \"5189f423-7b0f-4b3b-bdb9-bdfe4564c959\",\n  \"shortName\": \"Pebble Arcade\",\n  \"longName\": \"Pebble Arcade\",\n  \"companyName\": \"AAA\",\n  \"versionCode\": 1,\n  \"versionLabel\": \"1.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {\n    \"dummy\": 0\n  },\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchapps/pebble_arcade/src/entry.c",
    "content": "#include <pebble.h>\n#include \"entry.h\"\n\n#define NUM_ENTRY_CHARS 3\n\n#define REPEAT_INTERVAL_MS 100\n\nstatic Window *s_entry_window;\n\nstatic char* s_highscore_name;\n\ntypedef struct {\n  TextLayer *title_text;\n  TextLayer *chars_text[NUM_ENTRY_CHARS];\n  InverterLayer *invert;\n\n  char entry_chars[NUM_ENTRY_CHARS][2];\n  uint8_t index;\n} EntryUi;\n\nstatic void up_click_handler(ClickRecognizerRef recognizer, void* context) {\n  Window* window = (Window*)context;\n  EntryUi* ui_data = (EntryUi*)window_get_user_data(window);\n  if (ui_data->index < NUM_ENTRY_CHARS) {\n    if (ui_data->entry_chars[ui_data->index][0] == 'Z') {\n      ui_data->entry_chars[ui_data->index][0] = 'A';\n    } else {\n      ++ui_data->entry_chars[ui_data->index][0];\n    }\n    layer_mark_dirty(text_layer_get_layer(ui_data->chars_text[ui_data->index]));\n  }\n}\n\nstatic void down_click_handler(ClickRecognizerRef recognizer, void* context) {\n  Window* window = (Window*)context;\n  EntryUi* ui_data = (EntryUi*)window_get_user_data(window);\n  if (ui_data->index < NUM_ENTRY_CHARS) {\n    if (ui_data->entry_chars[ui_data->index][0] == 'A') {\n      ui_data->entry_chars[ui_data->index][0] = 'Z';\n    } else {\n      --ui_data->entry_chars[ui_data->index][0];\n    }\n    layer_mark_dirty(text_layer_get_layer(ui_data->chars_text[ui_data->index]));\n  }\n}\n\nstatic void select_click_handler(ClickRecognizerRef recognizer, void* context) {\n  Window* window = (Window*)context;\n  EntryUi* ui_data = (EntryUi*)window_get_user_data(window);\n  if (ui_data->index == 2) {\n    ui_data->index = 0;\n  } else {\n    ++ui_data->index;\n  }\n\n  inverter_layer_destroy(ui_data->invert);\n  ui_data->invert = inverter_layer_create(GRect(41 + 20 * ui_data->index, 66, 15, 31));\n  layer_add_child(window_get_root_layer(window), inverter_layer_get_layer(ui_data->invert));\n}\n\nstatic void click_config_provider(void* context) {\n  window_set_click_context(BUTTON_ID_UP, context);\n  window_single_repeating_click_subscribe(BUTTON_ID_UP, REPEAT_INTERVAL_MS, up_click_handler);\n\n  window_set_click_context(BUTTON_ID_SELECT, context);\n  window_single_click_subscribe(BUTTON_ID_SELECT, select_click_handler);\n\n  window_set_click_context(BUTTON_ID_DOWN, context);\n  window_single_repeating_click_subscribe(BUTTON_ID_DOWN, REPEAT_INTERVAL_MS, down_click_handler);\n}\n\nstatic void window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_bounds(window_layer);\n\n  EntryUi* ui_data = (EntryUi*)window_get_user_data(window);\n  ui_data->title_text = text_layer_create(GRect(0, 0, bounds.size.w, 64));\n  text_layer_set_text(ui_data->title_text, \"NEW HIGH SCORE!\");\n  text_layer_set_text_alignment(ui_data->title_text, GTextAlignmentCenter);\n  text_layer_set_font(ui_data->title_text, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));\n  layer_add_child(window_layer, text_layer_get_layer(ui_data->title_text));\n\n  ui_data->index = 0;\n\n  for (int i = 0; i < NUM_ENTRY_CHARS; ++i) {\n    strncpy(ui_data->entry_chars[i], \"A\", 2);\n\n    ui_data->chars_text[i] = text_layer_create(GRect(42 + 20 * i, 64, 15, 50));\n    text_layer_set_font(ui_data->chars_text[i], fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));\n    text_layer_set_text_alignment(ui_data->chars_text[i], GTextAlignmentCenter);\n    text_layer_set_text(ui_data->chars_text[i], ui_data->entry_chars[i]);\n    layer_add_child(window_layer, text_layer_get_layer(ui_data->chars_text[i]));\n  }\n\n  ui_data->invert = inverter_layer_create(GRect(41, 66, 16, 31));\n  layer_add_child(window_layer, inverter_layer_get_layer(ui_data->invert));\n}\n\nstatic void window_unload(Window *window) {\n  EntryUi* ui_data = (EntryUi*)window_get_user_data(window);\n\n  text_layer_destroy(ui_data->title_text);\n  for (int i = 0; i < NUM_ENTRY_CHARS; ++i) {\n    s_highscore_name[i] = ui_data->entry_chars[i][0];\n    text_layer_destroy(ui_data->chars_text[i]);\n  }\n  s_highscore_name[3] = '\\0';\n  inverter_layer_destroy(ui_data->invert);\n}\n\nvoid entry_init() {\n  s_entry_window = window_create();\n\n  // Store ui data as window user_data\n  EntryUi* ui_data = malloc(sizeof(EntryUi));\n  window_set_user_data(s_entry_window, ui_data);\n\n  window_set_click_config_provider_with_context(s_entry_window, click_config_provider, (void*)s_entry_window);\n  window_set_window_handlers(s_entry_window, (WindowHandlers) {\n    .load = window_load,\n    .unload = window_unload,\n  });\n}\n\nvoid entry_deinit() {\n  // Delete stored window user_data\n  EntryUi* ui_data = (EntryUi*)window_get_user_data(s_entry_window);\n  free(ui_data);\n  window_destroy(s_entry_window);\n}\n\nvoid entry_get_name(char *name) {\n  s_highscore_name = name;\n  window_stack_push(s_entry_window, true);\n}\n"
  },
  {
    "path": "watchapps/pebble_arcade/src/entry.h",
    "content": "#pragma once\n\nvoid entry_init();\n\nvoid entry_deinit();\n\nvoid entry_get_name(char *name);\n"
  },
  {
    "path": "watchapps/pebble_arcade/src/game.c",
    "content": "#include <pebble.h>\n#include \"game.h\"\n#include \"score.h\"\n\n// Time always in ms\n#define MAX_TIME      5000\n#define TIME_INTERVAL 10\n\nstatic Window *s_main_window;\nstatic TextLayer *s_score_text, *s_time_text;\nstatic AppTimer *s_timer;\n\nstatic unsigned s_score, s_time;\nstatic uint16_t s_prev_ms;\n\nstatic void finish() {\n  high_score_show();\n  high_score_add_score(s_score);\n}\n\nstatic void update_time_text(unsigned seconds, unsigned fraction) {\n  static char s_buf[16];\n  snprintf(s_buf, sizeof(s_buf), \"%u.%02u\", seconds, fraction);\n  text_layer_set_text(s_time_text, s_buf);\n}\n\nstatic void timer_callback(void *data) {\n  uint16_t c_ms = time_ms(NULL, NULL);\n  uint16_t elapsed;\n  if (c_ms < s_prev_ms) {\n    elapsed = (c_ms + 1000) - s_prev_ms;\n  } else {\n    elapsed = c_ms - s_prev_ms;\n  }\n  s_prev_ms = c_ms;\n\n  s_time += elapsed;\n  unsigned seconds_remaining = (MAX_TIME - s_time) / 1000;\n  unsigned fraction_remaining = ((MAX_TIME - s_time) % 1000) / 10;\n\n  update_time_text(seconds_remaining, fraction_remaining);\n  if (s_time < MAX_TIME) {\n    s_timer = app_timer_register(TIME_INTERVAL - (elapsed % TIME_INTERVAL), timer_callback, NULL);\n  } else {\n    finish();\n  }\n}\n\nstatic void select_click_handler(ClickRecognizerRef recognizer, void *context) {\n  if (!s_timer) {\n    s_prev_ms = time_ms(NULL, NULL);\n    s_timer = app_timer_register(TIME_INTERVAL, timer_callback, NULL);\n  }\n\n  static char s_buf[32];\n  ++s_score;\n  snprintf(s_buf, sizeof(s_buf), \"Score: %u\", s_score);\n  text_layer_set_text(s_score_text, s_buf);\n}\n\nstatic void click_config_provider(void *context) {\n  window_single_click_subscribe(BUTTON_ID_SELECT, select_click_handler);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_bounds(window_layer);\n\n  s_score_text = text_layer_create(GRect(0, 72, bounds.size.w, 20));\n  text_layer_set_text_alignment(s_score_text, GTextAlignmentCenter);\n  layer_add_child(window_layer, text_layer_get_layer(s_score_text));\n\n  s_time_text = text_layer_create(GRect(0, 0, bounds.size.w, 64));\n  text_layer_set_text_alignment(s_time_text, GTextAlignmentCenter);\n  text_layer_set_font(s_time_text, fonts_get_system_font(FONT_KEY_BITHAM_42_BOLD));\n  layer_add_child(window_layer, text_layer_get_layer(s_time_text));\n}\n\nstatic void main_window_appear(Window *window) {\n  // When the game window appears, reset the game\n  s_score = 0;\n  s_time = 0;\n  s_timer = NULL;\n\n  update_time_text(MAX_TIME / 1000, (MAX_TIME % 1000) / 10);\n  text_layer_set_text(s_score_text, \"Press Select to Start\");\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_time_text);\n  text_layer_destroy(s_score_text);\n}\n\nvoid game_init() {\n  s_main_window = window_create();\n  window_set_click_config_provider(s_main_window, click_config_provider);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n    .appear = main_window_appear\n  });\n  window_stack_push(s_main_window, true);\n}\n\nvoid game_deinit() {\n  window_destroy(s_main_window);\n}\n"
  },
  {
    "path": "watchapps/pebble_arcade/src/game.h",
    "content": "#pragma once\n\nvoid game_init();\n\nvoid game_deinit();\n"
  },
  {
    "path": "watchapps/pebble_arcade/src/pebble_arcade.c",
    "content": "#include <pebble.h>\n#include \"game.h\"\n#include \"score.h\"\n#include \"entry.h\"\n\nstatic void init() {\n  game_init();\n  high_score_init();\n  entry_init();\n}\n\nstatic void deinit() {\n  game_deinit();\n  high_score_deinit();\n  entry_deinit();\n}\n\nint main() {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchapps/pebble_arcade/src/score.c",
    "content": "#include <pebble.h>\n#include \"score.h\"\n#include \"entry.h\"\n\n#define NUM_HIGH_SCORES  8\n\ntypedef struct Score {\n  char name[4];   // A null-terminated 3 initials, eg. \"AAA\\0\".\n  unsigned score;\n} Score;\n\nstatic Window *s_main_window;\nstatic TextLayer *s_name_text[NUM_HIGH_SCORES];\nstatic TextLayer *s_score_text[NUM_HIGH_SCORES];\nstatic TextLayer *s_title_text;\n\nstatic Score s_score_array[NUM_HIGH_SCORES];\nstatic char s_score_buf[NUM_HIGH_SCORES][16];\nstatic short s_new_place; // if > 0, this is the added place\n\n// Returns the placing this player got in the high score list.\n// -1 if they did not place.\nstatic short get_place(unsigned score) {\n  for (int i = 0; i < NUM_HIGH_SCORES; i++)\n    if (score >= s_score_array[i].score)  {\n      return i;\n    }\n\n  return -1;\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_bounds(window_layer);\n\n  s_title_text = text_layer_create(GRect(0, 0, bounds.size.w, 64));\n  text_layer_set_text(s_title_text, \"HIGH SCORES\");\n  text_layer_set_text_alignment(s_title_text, GTextAlignmentCenter);\n  text_layer_set_font(s_title_text, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));\n  layer_add_child(window_layer, text_layer_get_layer(s_title_text));\n\n  unsigned width = bounds.size.w / 2 - 10;\n  \n  // Buffers for stringification of s_score_array\n  for (int i = 0; i < NUM_HIGH_SCORES; ++i) {\n    s_name_text[i] = text_layer_create(GRect(10, i * 15 + 25, width, 15));\n    text_layer_set_text(s_name_text[i], s_score_array[i].name);\n    text_layer_set_text_alignment(s_name_text[i], GTextAlignmentLeft);\n    layer_add_child(window_layer, text_layer_get_layer(s_name_text[i]));\n\n    s_score_text[i] = text_layer_create(GRect(bounds.size.w - width - 10, i * 15 + 25, width, 15));\n    snprintf(s_score_buf[i], sizeof(s_score_buf[i]), \"%d\", s_score_array[i].score);\n    text_layer_set_text(s_score_text[i], s_score_buf[i]);\n    text_layer_set_text_alignment(s_score_text[i], GTextAlignmentRight);\n    layer_add_child(window_layer, text_layer_get_layer(s_score_text[i]));\n  }\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_title_text);\n\n  if (s_new_place > -1) {\n    // Write all data to persistent storage\n    for (int i = NUM_HIGH_SCORES; i >= s_new_place; i--) {\n      persist_write_string(i * 2, s_score_array[i].name);\n      persist_write_int(i * 2 + 1, s_score_array[i].score);\n    }\n  }\n\n  for (int i = 0; i < NUM_HIGH_SCORES; ++i) {\n    text_layer_destroy(s_name_text[i]);\n    text_layer_destroy(s_score_text[i]);\n  }\n}\n\n// If this score is a high score, pop up the entry window and enter the score.\nbool high_score_add_score(unsigned score) {\n  short place = get_place(score);\n  s_new_place = place;\n  if (place < 0) {\n    return false;\n  }\n\n  // Shift everything below this high score down.\n  for (int i = NUM_HIGH_SCORES-1; i > place; i--) {\n    s_score_array[i].score = s_score_array[i-1].score;\n    memcpy(s_score_array[i].name, s_score_array[i-1].name, 3);\n    snprintf(s_score_buf[i], sizeof(s_score_buf[i]), \"%d\", s_score_array[i].score);\n  }\n\n  s_score_array[place].score = score;\n\n  entry_get_name(s_score_array[place].name);\n\n  snprintf(s_score_buf[place], sizeof(s_score_buf[place]), \"%d\", s_score_array[place].score);\n  layer_mark_dirty(text_layer_get_layer(s_name_text[place]));\n  layer_mark_dirty(text_layer_get_layer(s_score_text[place]));\n\n  return true;\n}\n\nvoid high_score_show() {\n  window_stack_push(s_main_window, true);\n}\n\nvoid high_score_init() {\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n\n  // Read in stored high score, or put in default values if non-existent.\n  for (int i = 0; i < NUM_HIGH_SCORES; ++i) {\n    if (persist_exists(2 * i)) {\n      persist_read_string(2 * i, s_score_array[i].name, 4);\n    } else {\n      memcpy(s_score_array[i].name, \"AAA\\0\", 4);\n    }\n\n    if (persist_exists(2 * i + 1)) {\n      s_score_array[i].score = persist_read_int(2 * i + 1);\n    } else {\n      s_score_array[i].score = 2 * (NUM_HIGH_SCORES - i);\n    }\n  }\n}\n\nvoid high_score_deinit() {\n  window_destroy(s_main_window);\n}\n"
  },
  {
    "path": "watchapps/pebble_arcade/src/score.h",
    "content": "#pragma once\n\nvoid high_score_init();\n\nvoid high_score_deinit();\n\n// Add the given score if it is a high score.\n// This will launch up an entry window to request the player's intiials.\n// Returns true if this is a high score, false otherwise.\nbool high_score_add_score(unsigned score);\n\nvoid high_score_show();\n"
  },
  {
    "path": "watchapps/pebble_arcade/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchfaces/big_time/appinfo.json",
    "content": "{\n  \"uuid\": \"afcc6876-8f84-44e0-bb8b-023ffb2d7c2c\",\n  \"shortName\": \"Big Time\",\n  \"longName\": \"Big Time\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 6,\n  \"versionLabel\": \"6.0\",\n  \"watchapp\": {\n    \"watchface\": true\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"menuIcon\": true,\n        \"type\": \"png\",\n        \"name\": \"IMAGE_MENU_ICON\",\n        \"file\": \"images/menu_icon_big_watch.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_0\",\n        \"file\": \"images/num_0.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_1\",\n        \"file\": \"images/num_1.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_2\",\n        \"file\": \"images/num_2.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_3\",\n        \"file\": \"images/num_3.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_4\",\n        \"file\": \"images/num_4.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_5\",\n        \"file\": \"images/num_5.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_6\",\n        \"file\": \"images/num_6.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_7\",\n        \"file\": \"images/num_7.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_8\",\n        \"file\": \"images/num_8.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_9\",\n        \"file\": \"images/num_9.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchfaces/big_time/fonttools/font2png.py",
    "content": "#\n# Used to create image tiles suitable for use by the \"Big Watch\" watch\n# face.\n#\n# The meta data for the images produced is output to the terminal for\n# copy pasta into `resource_map.json`.\n#\n#\n# This script should be run from the root of the watch project\n# directory, like this:\n#\n#    python fonttools/font2png.py\n#\n# On Mac OS X you can use it like this to have the meta data copied\n# directly to the clipboard, ready for pasting:\n#\n#     python fonttools/font2png.py | pbcopy\n#\n#\n# These image tiles are needed because Pebble can't handle the 100\n# point font size required by the watch. Each image tile is a quarter\n# of the display.\n#\n# The generation of tiles is more complicated than it needs to be due to:\n#\n#   a) For Nevis (at least) the digits seem to return a fixed height\n#      of 115 pixels even though the digits don't take up that much\n#      vertical space. This means we can't use `getsize()` for\n#      dimensions.\n#\n#   b) The bottom of the digits seem to get clipped (by PIL) unless\n#      the canvas has a bunch of extra space. (This may be related to\n#      <http://stackoverflow.com/questions/1933766/fonts-clipping-with-pil>\n#      or\n#      <http://stackoverflow.com/questions/13821882/pil-cut-off-letters/13831117#13831117>.)\n#\n# Because of these complications, we have to center the digit\n# manually.\n#\n# We first plot the digit on a large canvas, then crop to just the\n# bounds of the character and then paste the result centered on a\n# canvas of the correct size.\n#\n\nimport ImageFont, ImageDraw, Image\n\nFONT_SIZE = 100\nFONT_FILE_PATH = \"resources/src/fonts/nevis.ttf\"\n\nOUTPUT_IMAGE_FILEPATH_TEMPLATE = \"resources/src/images/num_%d.png\"\n\n\nTILE_WIDTH_PIXELS = 144/2\nTILE_HEIGHT_PIXELS = 168/2\n\nLARGE_SCRATCH_CANVAS_DIMENSIONS = (100, 100)\nFINAL_TILE_CANVAS_DIMENSIONS = (TILE_WIDTH_PIXELS, TILE_HEIGHT_PIXELS)\n\nMETA_DATA_TEMPLATE = \\\n\"\"\"\n        {\n        \"type\": \"png\",\n        \"defName\": \"IMAGE_NUM_%d\",\n        \"file\": \"images/num_%d.png\"\n        }\"\"\"\n\n\nmeta_data_entries = []\n\nfont = ImageFont.truetype(FONT_FILE_PATH, FONT_SIZE)\n\n\nif __name__ == \"__main__\":\n    # Generate the image tile file for each digit.\n    for digit in range(0, 10):\n        # Draw the digit on a large canvas so PIL doesn't crop it.\n        scratch_canvas_image = Image.new(\"RGB\", LARGE_SCRATCH_CANVAS_DIMENSIONS)\n        draw = ImageDraw.Draw(scratch_canvas_image)\n\n        draw.text((0,0), str(digit), font=font)\n\n        # Discard all the padding\n        cropped_digit_image = scratch_canvas_image.crop(scratch_canvas_image.getbbox())\n\n        # Center the digit within the final image tile and save it\n        digit_width, digit_height = cropped_digit_image.size\n\n        tile_image = Image.new(\"RGB\", FINAL_TILE_CANVAS_DIMENSIONS)\n\n        tile_image.paste(cropped_digit_image, ((TILE_WIDTH_PIXELS-digit_width)/2, (TILE_HEIGHT_PIXELS-digit_height)/2))\n\n        tile_image.save(OUTPUT_IMAGE_FILEPATH_TEMPLATE % digit)\n\n        meta_data_entries.append(META_DATA_TEMPLATE % (digit, digit))\n\n\n    # Display the meta data which needs to be included in `resource_map.json`.\n    print \",\\n\".join(meta_data_entries)\n\n\n\n\n"
  },
  {
    "path": "watchfaces/big_time/resources/fonts/README",
    "content": "The Nevis font is a free download from:\n\n    <http://www.tenbytwenty.com/nevis.php>\n"
  },
  {
    "path": "watchfaces/big_time/src/big_time.c",
    "content": "#include <pebble.h>\n\nstatic Window *s_main_window;\n\n// There's only enough memory to load about 6 of 10 required images\n// so we have to swap them in & out...\n//\n// We have one \"slot\" per digit location on screen.\n//\n// Because layers can only have one parent we load a digit for each\n// slot--even if the digit image is already in another slot.\n//\n// Slot on-screen layout:\n//     0 1\n//     2 3\n#define TOTAL_IMAGE_SLOTS 4\n#define NUMBER_OF_IMAGES 10\n\n// These images are 72 x 84 pixels (i.e. a quarter of the display),\n// black and white with the digit character centered in the image.\n// (As generated by the `fonttools/font2png.py` script.)\nconst int IMAGE_RESOURCE_IDS[NUMBER_OF_IMAGES] = {\n  RESOURCE_ID_IMAGE_NUM_0, RESOURCE_ID_IMAGE_NUM_1, RESOURCE_ID_IMAGE_NUM_2,\n  RESOURCE_ID_IMAGE_NUM_3, RESOURCE_ID_IMAGE_NUM_4, RESOURCE_ID_IMAGE_NUM_5,\n  RESOURCE_ID_IMAGE_NUM_6, RESOURCE_ID_IMAGE_NUM_7, RESOURCE_ID_IMAGE_NUM_8,\n  RESOURCE_ID_IMAGE_NUM_9\n};\n\nstatic GBitmap *s_images[TOTAL_IMAGE_SLOTS];\nstatic BitmapLayer *s_image_layers[TOTAL_IMAGE_SLOTS];\n\n#define EMPTY_SLOT -1\n\n// The state is either \"empty\" or the digit of the image currently in\n// the slot--which was going to be used to assist with de-duplication\n// but we're not doing that due to the one parent-per-layer\n// restriction mentioned above.\nstatic int s_image_slot_state[TOTAL_IMAGE_SLOTS] = {EMPTY_SLOT, EMPTY_SLOT, EMPTY_SLOT, EMPTY_SLOT};\n\nstatic void load_digit_image_into_slot(int slot_number, int digit_value) {\n  /*\n   * Loads the digit image from the application's resources and\n   * displays it on-screen in the correct location.\n   *\n   * Each slot is a quarter of the screen.\n   */\n\n  if ((slot_number < 0) || (slot_number >= TOTAL_IMAGE_SLOTS)) {\n    return;\n  }\n\n  if ((digit_value < 0) || (digit_value > 9)) {\n    return;\n  }\n\n  if (s_image_slot_state[slot_number] != EMPTY_SLOT) {\n    return;\n  }\n\n  s_image_slot_state[slot_number] = digit_value;\n  s_images[slot_number] = gbitmap_create_with_resource(IMAGE_RESOURCE_IDS[digit_value]);\n#ifdef PBL_PLATFORM_BASALT\n  GRect bounds = gbitmap_get_bounds(s_images[slot_number]);\n#else\n  GRect bounds = s_images[slot_number]->bounds;\n#endif\n  BitmapLayer *bitmap_layer = bitmap_layer_create(GRect((slot_number % 2) * 72, (slot_number / 2) * 84, bounds.size.w, bounds.size.h));\n  s_image_layers[slot_number] = bitmap_layer;\n  bitmap_layer_set_bitmap(bitmap_layer, s_images[slot_number]);\n  Layer *window_layer = window_get_root_layer(s_main_window);\n  layer_add_child(window_layer, bitmap_layer_get_layer(bitmap_layer));\n}\n\nstatic void unload_digit_image_from_slot(int slot_number) {\n  if (s_image_slot_state[slot_number] != EMPTY_SLOT) {\n    layer_remove_from_parent(bitmap_layer_get_layer(s_image_layers[slot_number]));\n    bitmap_layer_destroy(s_image_layers[slot_number]);\n    gbitmap_destroy(s_images[slot_number]);\n    s_image_slot_state[slot_number] = EMPTY_SLOT;\n  }\n}\n\nstatic void display_value(unsigned short value, unsigned short row_number, bool show_first_leading_zero) {\n  value = value % 100; // Maximum of two digits per row.\n\n  // Column order is: | Column 0 | Column 1 |\n  // (We process the columns in reverse order because that makes\n  // extracting the digits from the value easier.)\n  for (int column_number = 1; column_number >= 0; column_number--) {\n    int slot_number = (row_number * 2) + column_number;\n    unload_digit_image_from_slot(slot_number);\n    if (!((value == 0) && (column_number == 0) && !show_first_leading_zero)) {\n      load_digit_image_into_slot(slot_number, value % 10);\n    }\n    value = value / 10;\n  }\n}\n\nstatic unsigned short get_display_hour(unsigned short hour) {\n  if (clock_is_24h_style()) {\n    return hour;\n  }\n\n  unsigned short display_hour = hour % 12;\n\n  // Converts \"0\" to \"12\"\n  return display_hour ? display_hour : 12;\n\n}\n\nstatic void display_time(struct tm *tick_time) {\n  display_value(get_display_hour(tick_time->tm_hour), 0, false);\n  display_value(tick_time->tm_min, 1, true);\n}\n\nstatic void handle_minute_tick(struct tm *tick_time, TimeUnits units_changed) {\n  display_time(tick_time);\n}\n\nstatic void main_window_load(Window *window) {\n  time_t now = time(NULL);\n  struct tm *tick_time = localtime(&now);\n  display_time(tick_time);\n\n  tick_timer_service_subscribe(MINUTE_UNIT, handle_minute_tick);\n}\n\nstatic void main_window_unload(Window *window) {\n  for (int i = 0; i < TOTAL_IMAGE_SLOTS; i++) {\n    unload_digit_image_from_slot(i);\n  }\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_background_color(s_main_window, GColorBlack);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchfaces/big_time/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchfaces/classio/appinfo.json",
    "content": "{\n  \"uuid\": \"54d3008f-0e46-462c-995c-0d0b4e01148c\",\n  \"shortName\": \"Classio Digital\",\n  \"longName\": \"Classio Digital\",\n  \"companyName\": \"Classio Corp.\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": true\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchfaces/classio/src/classio.c",
    "content": "#include <pebble.h>\n\nstatic Window *s_main_window;\nstatic TextLayer *s_time_layer;\n\nstatic void handle_second_tick(struct tm* tick_time, TimeUnits units_changed) {\n  // Needs to be static because it's used by the system later.\n  static char s_time_text[] = \"00:00:00\";\n\n  strftime(s_time_text, sizeof(s_time_text), \"%T\", tick_time);\n  text_layer_set_text(s_time_layer, s_time_text);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n\n  s_time_layer = text_layer_create(GRect(29, 54, 104, 114));\n  text_layer_set_text_color(s_time_layer, GColorWhite);\n  text_layer_set_background_color(s_time_layer, GColorClear);\n  text_layer_set_font(s_time_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));\n\n  // Ensures time is displayed immediately (will break if NULL tick event accessed).\n  // (This is why it's a good idea to have a separate routine to do the update itself.)\n  time_t now = time(NULL);\n  struct tm *current_time = localtime(&now);\n  handle_second_tick(current_time, SECOND_UNIT);\n  tick_timer_service_subscribe(SECOND_UNIT, &handle_second_tick);\n\n  layer_add_child(window_layer, text_layer_get_layer(s_time_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_time_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_background_color(s_main_window, GColorBlack);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchfaces/classio/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchfaces/classio-battery-connection/appinfo.json",
    "content": "{\n  \"uuid\": \"54d3118f-3346-462c-995c-0d0b4e01148c\",\n  \"shortName\": \"Classio B&B\",\n  \"longName\": \"Classio B&B\",\n  \"companyName\": \"Camembert, Inc.\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": true\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchfaces/classio-battery-connection/src/classio.c",
    "content": "#include <pebble.h>\n\nstatic Window *s_main_window;\nstatic TextLayer *s_time_layer;\nstatic TextLayer *s_battery_layer;\nstatic TextLayer *s_connection_layer;\n\nstatic void handle_battery(BatteryChargeState charge_state) {\n  static char battery_text[] = \"100% charged\";\n\n  if (charge_state.is_charging) {\n    snprintf(battery_text, sizeof(battery_text), \"charging\");\n  } else {\n    snprintf(battery_text, sizeof(battery_text), \"%d%% charged\", charge_state.charge_percent);\n  }\n  text_layer_set_text(s_battery_layer, battery_text);\n}\n\nstatic void handle_second_tick(struct tm* tick_time, TimeUnits units_changed) {\n  // Needs to be static because it's used by the system later.\n  static char s_time_text[] = \"00:00:00\";\n\n  strftime(s_time_text, sizeof(s_time_text), \"%T\", tick_time);\n  text_layer_set_text(s_time_layer, s_time_text);\n\n  handle_battery(battery_state_service_peek());\n}\n\nstatic void handle_bluetooth(bool connected) {\n  text_layer_set_text(s_connection_layer, connected ? \"connected\" : \"disconnected\");\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_time_layer = text_layer_create(GRect(0, 40, bounds.size.w, 34));\n  text_layer_set_text_color(s_time_layer, GColorWhite);\n  text_layer_set_background_color(s_time_layer, GColorClear);\n  text_layer_set_font(s_time_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));\n  text_layer_set_text_alignment(s_time_layer, GTextAlignmentCenter);\n\n  s_connection_layer = text_layer_create(GRect(0, 90, bounds.size.w, 34));\n  text_layer_set_text_color(s_connection_layer, GColorWhite);\n  text_layer_set_background_color(s_connection_layer, GColorClear);\n  text_layer_set_font(s_connection_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18));\n  text_layer_set_text_alignment(s_connection_layer, GTextAlignmentCenter);\n  handle_bluetooth(bluetooth_connection_service_peek());\n\n  s_battery_layer = text_layer_create(GRect(0, 120, bounds.size.w, 34));\n  text_layer_set_text_color(s_battery_layer, GColorWhite);\n  text_layer_set_background_color(s_battery_layer, GColorClear);\n  text_layer_set_font(s_battery_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18));\n  text_layer_set_text_alignment(s_battery_layer, GTextAlignmentCenter);\n  text_layer_set_text(s_battery_layer, \"100% charged\");\n\n  // Ensures time is displayed immediately (will break if NULL tick event accessed).\n  // (This is why it's a good idea to have a separate routine to do the update itself.)\n  time_t now = time(NULL);\n  struct tm *current_time = localtime(&now);\n  handle_second_tick(current_time, SECOND_UNIT);\n\n  tick_timer_service_subscribe(SECOND_UNIT, handle_second_tick);\n  battery_state_service_subscribe(handle_battery);\n  bluetooth_connection_service_subscribe(handle_bluetooth);\n\n  layer_add_child(window_layer, text_layer_get_layer(s_time_layer));\n  layer_add_child(window_layer, text_layer_get_layer(s_connection_layer));\n  layer_add_child(window_layer, text_layer_get_layer(s_battery_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  tick_timer_service_unsubscribe();\n  battery_state_service_unsubscribe();\n  bluetooth_connection_service_unsubscribe();\n  text_layer_destroy(s_time_layer);\n  text_layer_destroy(s_connection_layer);\n  text_layer_destroy(s_battery_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_background_color(s_main_window, GColorBlack);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchfaces/classio-battery-connection/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchfaces/drop_zone/appinfo.json",
    "content": "{\n  \"uuid\": \"74d6e2b8-e44f-44c4-a861-cdcfb6077c8a\",\n  \"shortName\": \"Drop Zone\",\n  \"longName\": \"Drop Zone\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": true\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"menuIcon\": true,\n        \"type\": \"png\",\n        \"name\": \"IMAGE_MENU_ICON\",\n        \"file\": \"images/menu_icon_drop_zone.png\"\n      },\n      {\n        \"characterRegex\": \"[:0-9]\",\n        \"type\": \"font\",\n        \"name\": \"FONT_ROBOTO_BOLD_CONDENSED_SUBSET_40\",\n        \"file\": \"fonts/Roboto-BoldCondensed.ttf\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchfaces/drop_zone/resources/fonts/Google Android License.txt",
    "content": "Copyright (C) 2008 The Android Open Source Project\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n  \n     http://www.apache.org/licenses/LICENSE-2.0\n  \nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n##########\n\nThis directory contains the fonts for the platform. They are licensed\nunder the Apache 2 license.\n"
  },
  {
    "path": "watchfaces/drop_zone/src/drop_zone.c",
    "content": "#include <pebble.h>\n\nstatic Window *s_main_window;\nstatic TextLayer *s_time_layer;\n\nstatic PropertyAnimation *s_up_animation, *s_down_animation;\n\n#define UPPER_TO_RECT GRect(0, 5, 144, 163)\n#define LOWER_TO_RECT GRect(0, 112, 144, 56)\n\n#define ANIMATION_DURATION_IN_MS 1500\n\nstatic void init_animations() {\n  Layer *layer = text_layer_get_layer(s_time_layer);\n\n  s_up_animation = property_animation_create_layer_frame(layer, &LOWER_TO_RECT, &UPPER_TO_RECT);\n  animation_set_duration((Animation*) s_up_animation, ANIMATION_DURATION_IN_MS);\n  animation_set_curve((Animation*) s_up_animation, AnimationCurveEaseOut);\n\n  s_down_animation = property_animation_create_layer_frame(layer, &UPPER_TO_RECT, &LOWER_TO_RECT);\n  animation_set_duration((Animation*) s_down_animation, ANIMATION_DURATION_IN_MS);\n  animation_set_curve((Animation*) s_down_animation, AnimationCurveEaseOut);\n}\n\nstatic void schedule_animation(struct tm *tick_time) {\n  static bool s_use_upper_to_rect = false;\n\n  int32_t animation_delay_required_in_ms = 60000 - (tick_time->tm_sec * 1000) - (ANIMATION_DURATION_IN_MS - 100);\n\n  if (animation_delay_required_in_ms < 0) {\n    // In the hopefully rare case that we don't have time to schedule the animation\n    // before the value is due to change we just let it change in place.\n    return;\n  }\n\n  if (s_use_upper_to_rect) {\n    animation_set_delay((Animation*) s_up_animation, animation_delay_required_in_ms);\n    animation_schedule((Animation*) s_up_animation);\n  } else {\n    animation_set_delay((Animation*) s_down_animation, animation_delay_required_in_ms);\n    animation_schedule((Animation*) s_down_animation);\n  }\n\n  s_use_upper_to_rect = !s_use_upper_to_rect;\n}\n\nstatic void handle_minute_tick(struct tm *tick_time, TimeUnits units_changed) {\n  // Need to be static because it's used by the system later.\n  static char s_time_text[] = \"00:00\";\n\n  strftime(s_time_text, sizeof(s_time_text), \"%R\", tick_time);\n  text_layer_set_text(s_time_layer, s_time_text);\n\n  schedule_animation(tick_time);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n\n  s_time_layer = text_layer_create(UPPER_TO_RECT);\n  text_layer_set_text_color(s_time_layer, GColorWhite);\n  text_layer_set_background_color(s_time_layer, GColorClear);\n  text_layer_set_text_alignment(s_time_layer, GTextAlignmentCenter);\n  text_layer_set_font(s_time_layer, fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_ROBOTO_BOLD_CONDENSED_SUBSET_40)));\n  layer_add_child(window_get_root_layer(window), text_layer_get_layer(s_time_layer));\n\n  init_animations();\n  tick_timer_service_subscribe(MINUTE_UNIT, &handle_minute_tick);\n}\n\nstatic void main_window_unload(Window *window) {\n  property_animation_destroy(s_up_animation);\n  property_animation_destroy(s_down_animation);\n  text_layer_destroy(s_time_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_background_color(s_main_window, GColorBlack);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchfaces/drop_zone/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchfaces/feature_compass/appinfo.json",
    "content": "{\n  \"uuid\": \"2ff7fa04-6011-4a98-8a3b-a826a4b899f8\",\n  \"shortName\": \"Compass Demo\",\n  \"longName\": \"Compass Demo\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 1,\n  \"versionLabel\": \"1.0\",\n  \"watchapp\": {\n    \"watchface\": true\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"type\": \"png\",\n        \"name\": \"COMPASS_BACKGROUND\",\n        \"file\": \"images/compass_background.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchfaces/feature_compass/src/compass.c",
    "content": "/*\n * This application shows how to use the Compass API to build a simple watchface\n * that shows where magnetic north is.\n *\n * The compass background image source is:\n *    <http://opengameart.org/content/north-and-southalpha-chanel>\n */\n\n#include \"pebble.h\"\n\n// Vector paths for the compass needles\nstatic const GPathInfo NEEDLE_NORTH_POINTS = { \n  3,\n  (GPoint[]) { { -8, 0 }, { 8, 0 }, { 0, -36 } }\n};\nstatic const GPathInfo NEEDLE_SOUTH_POINTS = { \n  3,\n  (GPoint[]) { { 8, 0 }, { 0, 36 }, { -8, 0 } }\n};\n\nstatic Window *s_main_window;\nstatic BitmapLayer *s_bitmap_layer;\nstatic GBitmap *s_background_bitmap;\nstatic Layer *s_path_layer;\nstatic TextLayer *s_heading_layer, *s_text_layer_calib_state;\n\nstatic GPath *s_needle_north, *s_needle_south;\n\nstatic void compass_heading_handler(CompassHeadingData heading_data) {\n  // rotate needle accordingly\n  gpath_rotate_to(s_needle_north, heading_data.magnetic_heading);\n  gpath_rotate_to(s_needle_south, heading_data.magnetic_heading);\n\n  // display heading in degrees and radians\n  static char s_heading_buf[64];\n  snprintf(s_heading_buf, sizeof(s_heading_buf),\n    \" %ld°\\n%ld.%02ldpi\",\n    TRIGANGLE_TO_DEG(heading_data.magnetic_heading),\n    // display radians, units digit\n    (TRIGANGLE_TO_DEG(heading_data.magnetic_heading) * 2) / 360,\n    // radians, digits after decimal\n    ((TRIGANGLE_TO_DEG(heading_data.magnetic_heading) * 200) / 360) % 100\n  );\n  text_layer_set_text(s_heading_layer, s_heading_buf);\n\n  // Modify alert layout depending on calibration state\n  GRect bounds = layer_get_frame(window_get_root_layer(s_main_window)); \n  GRect alert_bounds; \n  if(heading_data.compass_status == CompassStatusDataInvalid) {\n    // Tell user to move their arm\n    alert_bounds = GRect(0, 0, bounds.size.w, bounds.size.h);\n    text_layer_set_background_color(s_text_layer_calib_state, GColorBlack);\n    text_layer_set_text_color(s_text_layer_calib_state, GColorWhite);\n    text_layer_set_font(s_text_layer_calib_state, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));\n    text_layer_set_text_alignment(s_text_layer_calib_state, GTextAlignmentCenter);\n  } else {\n    // Show status at the top\n    alert_bounds = GRect(0, -3, bounds.size.w, bounds.size.h / 7);\n    text_layer_set_background_color(s_text_layer_calib_state, GColorClear);\n    text_layer_set_text_color(s_text_layer_calib_state, GColorBlack);\n    text_layer_set_font(s_text_layer_calib_state, fonts_get_system_font(FONT_KEY_GOTHIC_18));\n    text_layer_set_text_alignment(s_text_layer_calib_state, GTextAlignmentLeft);\n  }\n  layer_set_frame(text_layer_get_layer(s_text_layer_calib_state), alert_bounds);\n\n  // Display state of the compass\n  static char s_valid_buf[64];\n  switch (heading_data.compass_status) {\n    case CompassStatusDataInvalid:\n      snprintf(s_valid_buf, sizeof(s_valid_buf), \"%s\", \"Compass is calibrating!\\n\\nMove your arm to aid calibration.\");\n      break;\n    case CompassStatusCalibrating:\n      snprintf(s_valid_buf, sizeof(s_valid_buf), \"%s\", \"Fine tuning...\");\n      break;\n    case CompassStatusCalibrated:\n      snprintf(s_valid_buf, sizeof(s_valid_buf), \"%s\", \"Calibrated\");\n      break;\n  }\n  text_layer_set_text(s_text_layer_calib_state, s_valid_buf);\n\n  // trigger layer for refresh\n  layer_mark_dirty(s_path_layer);\n}\n\nstatic void path_layer_update_callback(Layer *path, GContext *ctx) {\n#ifdef PBL_COLOR\n  graphics_context_set_fill_color(ctx, GColorRed);\n#endif\n  gpath_draw_filled(ctx, s_needle_north);       \n#ifndef PBL_COLOR\n  graphics_context_set_fill_color(ctx, GColorBlack);\n#endif  \n  gpath_draw_outline(ctx, s_needle_south);                     \n\n  // creating centerpoint                 \n  GRect bounds = layer_get_frame(path);          \n  GPoint path_center = GPoint(bounds.size.w / 2, bounds.size.h / 2);  \n  graphics_fill_circle(ctx, path_center, 3);       \n\n  // then put a white circle on top               \n  graphics_context_set_fill_color(ctx, GColorWhite);\n  graphics_fill_circle(ctx, path_center, 2);                      \n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  // Create the bitmap for the background and put it on the screen\n  s_bitmap_layer = bitmap_layer_create(bounds);\n  s_background_bitmap = gbitmap_create_with_resource(RESOURCE_ID_COMPASS_BACKGROUND);\n  bitmap_layer_set_bitmap(s_bitmap_layer, s_background_bitmap);\n  \n  // Make needle background 'transparent' with GCompOpAnd\n  bitmap_layer_set_compositing_mode(s_bitmap_layer, GCompOpAnd);\n  layer_add_child(window_layer, bitmap_layer_get_layer(s_bitmap_layer));\n\n  // Create the layer in which we will draw the compass needles\n  s_path_layer = layer_create(bounds);\n  \n  //  Define the draw callback to use for this layer\n  layer_set_update_proc(s_path_layer, path_layer_update_callback);\n  layer_add_child(window_layer, s_path_layer);\n\n  // Initialize and define the two paths used to draw the needle to north and to south\n  s_needle_north = gpath_create(&NEEDLE_NORTH_POINTS);\n  s_needle_south = gpath_create(&NEEDLE_SOUTH_POINTS);\n\n  // Move the needles to the center of the screen.\n  GPoint center = GPoint(bounds.size.w / 2, bounds.size.h / 2);\n  gpath_move_to(s_needle_north, center);\n  gpath_move_to(s_needle_south, center);\n\n  // Place text layers onto screen: one for the heading and one for calibration status\n  s_heading_layer = text_layer_create(GRect(12, bounds.size.h * 3 / 4, bounds.size.w / 4, bounds.size.h / 5));\n  text_layer_set_text(s_heading_layer, \"No Data\");\n  layer_add_child(window_layer, text_layer_get_layer(s_heading_layer));\n\n  s_text_layer_calib_state = text_layer_create(GRect(0, 0, bounds.size.w, bounds.size.h / 7));\n  text_layer_set_text_alignment(s_text_layer_calib_state, GTextAlignmentLeft);\n  text_layer_set_background_color(s_text_layer_calib_state, GColorClear);\n\n  layer_add_child(window_layer, text_layer_get_layer(s_text_layer_calib_state));\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_heading_layer);\n  text_layer_destroy(s_text_layer_calib_state);\n  gpath_destroy(s_needle_north);\n  gpath_destroy(s_needle_south);\n  layer_destroy(s_path_layer);\n  gbitmap_destroy(s_background_bitmap);\n  bitmap_layer_destroy(s_bitmap_layer);\n}\n\nstatic void init() {\n  // initialize compass and set a filter to 2 degrees\n  compass_service_set_heading_filter(2 * (TRIG_MAX_ANGLE / 360));\n  compass_service_subscribe(&compass_heading_handler);\n\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  compass_service_unsubscribe();\n  window_destroy(s_main_window);\n}\n\nint main() {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchfaces/feature_compass/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchfaces/fuzzy_time/appinfo.json",
    "content": "{\n  \"uuid\": \"19c5d625-de32-42d1-ab4a-7d08edd471dc\",\n  \"shortName\": \"Fuzzy Time\",\n  \"longName\": \"Fuzzy Time\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 1,\n  \"versionLabel\": \"1.0\",\n  \"watchapp\": {\n    \"watchface\": true\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"menuIcon\": true,\n        \"type\": \"png\",\n        \"name\": \"IMAGE_MENU_ICON\",\n        \"file\": \"images/menu_icon_fuzzy_watch.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchfaces/fuzzy_time/src/fuzzy_time.c",
    "content": "#include <pebble.h>\n#include \"num2words.h\"\n\n#define BUFFER_SIZE 86\n\nstatic Window *s_main_window;\nstatic TextLayer *s_text_layer;\nstatic char s_buffer[BUFFER_SIZE];\n\nstatic void update_time(struct tm *t) {\n  fuzzy_time_to_words(t->tm_hour, t->tm_min, s_buffer, BUFFER_SIZE);\n  text_layer_set_text(s_text_layer, s_buffer);\n}\n\nstatic void handle_minute_tick(struct tm *tick_time, TimeUnits units_changed) {\n  update_time(tick_time);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_text_layer = text_layer_create(GRect(0, 20, bounds.size.w, bounds.size.h - 20));\n  text_layer_set_background_color(s_text_layer, GColorBlack);\n  text_layer_set_text_color(s_text_layer, GColorWhite);\n  text_layer_set_font(s_text_layer, fonts_get_system_font(FONT_KEY_DROID_SERIF_28_BOLD));\n  layer_add_child(window_layer, text_layer_get_layer(s_text_layer));\n\n  time_t now = time(NULL);\n  struct tm *t = localtime(&now);\n  update_time(t);\n\n  tick_timer_service_subscribe(MINUTE_UNIT, &handle_minute_tick);\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_text_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_background_color(s_main_window, GColorBlack);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchfaces/fuzzy_time/src/num2words.c",
    "content": "#include \"num2words.h\"\n#include \"string.h\"\n\nstatic const char* const ONES[] = {\n  \"zero\",\n  \"one\",\n  \"two\",\n  \"three\",\n  \"four\",\n  \"five\",\n  \"six\",\n  \"seven\",\n  \"eight\",\n  \"nine\"\n};\n\nstatic const char* const TEENS[] ={\n  \"\",\n  \"eleven\",\n  \"twelve\",\n  \"thirteen\",\n  \"fourteen\",\n  \"fifteen\",\n  \"sixteen\",\n  \"seventeen\",\n  \"eighteen\",\n  \"nineteen\"\n};\n\nstatic const char* const TENS[] = {\n  \"\",\n  \"ten\",\n  \"twenty\",\n  \"thirty\",\n  \"forty\",\n  \"fifty\",\n  \"sixty\",\n  \"seventy\",\n  \"eighty\",\n  \"ninety\"\n};\n\nstatic const char* STR_OH_CLOCK = \"o'clock\";\nstatic const char* STR_NOON = \"noon\";\nstatic const char* STR_MIDNIGHT = \"midnight\";\nstatic const char* STR_QUARTER = \"quarter\";\nstatic const char* STR_TO = \"to\";\nstatic const char* STR_PAST = \"past\";\nstatic const char* STR_HALF = \"half\";\nstatic const char* STR_AFTER = \"after\";\n\nstatic size_t append_number(char* words, int num) {\n  int tens_val = num / 10 % 10;\n  int ones_val = num % 10;\n\n  size_t len = 0;\n\n  if (tens_val > 0) {\n    if (tens_val == 1 && num != 10) {\n      strcat(words, TEENS[ones_val]);\n      return strlen(TEENS[ones_val]);\n    }\n    strcat(words, TENS[tens_val]);\n    len += strlen(TENS[tens_val]);\n    if (ones_val > 0) {\n      strcat(words, \" \");\n      len += 1;\n    }\n  }\n\n  if (ones_val > 0 || num == 0) {\n    strcat(words, ONES[ones_val]);\n    len += strlen(ONES[ones_val]);\n  }\n  return len;\n}\n\nstatic size_t append_string(char* buffer, const size_t length, const char* str) {\n  strncat(buffer, str, length);\n\n  size_t written = strlen(str);\n  return (length > written) ? written : length;\n}\n\nvoid fuzzy_time_to_words(int hours, int minutes, char* words, size_t length) {\n  int fuzzy_hours = hours;\n  int fuzzy_minutes = ((minutes + 2) / 5) * 5;\n\n  // Handle hour & minute roll-over.\n  if (fuzzy_minutes > 55) {\n    fuzzy_minutes = 0;\n    fuzzy_hours += 1;\n    if (fuzzy_hours > 23) {\n      fuzzy_hours = 0;\n    }\n  }\n\n  size_t remaining = length;\n  memset(words, 0, length);\n\n  if (fuzzy_minutes != 0 && (fuzzy_minutes >= 10 || fuzzy_minutes == 5 || fuzzy_hours == 0 || fuzzy_hours == 12)) {\n    if (fuzzy_minutes == 15) {\n      remaining -= append_string(words, remaining, STR_QUARTER);\n      remaining -= append_string(words, remaining, \" \");\n      remaining -= append_string(words, remaining, STR_AFTER);\n      remaining -= append_string(words, remaining, \" \");\n    } else if (fuzzy_minutes == 45) {\n      remaining -= append_string(words, remaining, STR_QUARTER);\n      remaining -= append_string(words, remaining, \" \");\n      remaining -= append_string(words, remaining, STR_TO);\n      remaining -= append_string(words, remaining, \" \");\n\n      fuzzy_hours = (fuzzy_hours + 1) % 24;\n    } else if (fuzzy_minutes == 30) {\n      remaining -= append_string(words, remaining, STR_HALF);\n      remaining -= append_string(words, remaining, \" \");\n      remaining -= append_string(words, remaining, STR_PAST);\n      remaining -= append_string(words, remaining, \" \");\n    } else if (fuzzy_minutes < 30) {\n      remaining -= append_number(words, fuzzy_minutes);\n      remaining -= append_string(words, remaining, \" \");\n      remaining -= append_string(words, remaining, STR_AFTER);\n      remaining -= append_string(words, remaining, \" \");\n    } else {\n      remaining -= append_number(words, 60 - fuzzy_minutes);\n      remaining -= append_string(words, remaining, \" \");\n      remaining -= append_string(words, remaining, STR_TO);\n      remaining -= append_string(words, remaining, \" \");\n\n      fuzzy_hours = (fuzzy_hours + 1) % 24;\n    }\n  }\n\n  if (fuzzy_hours == 0) {\n    remaining -= append_string(words, remaining, STR_MIDNIGHT);\n  } else if (fuzzy_hours == 12) {\n    remaining -= append_string(words, remaining, STR_NOON);\n  } else {\n    remaining -= append_number(words, fuzzy_hours % 12);\n  }\n\n  if (fuzzy_minutes == 0 && !(fuzzy_hours == 0 || fuzzy_hours == 12)) {\n    remaining -= append_string(words, remaining, \" \");\n    remaining -= append_string(words, remaining, STR_OH_CLOCK);\n  }\n}\n"
  },
  {
    "path": "watchfaces/fuzzy_time/src/num2words.h",
    "content": "#pragma once\n\n#include \"string.h\"\n\nvoid fuzzy_time_to_words(int hours, int minutes, char* words, size_t length);\n"
  },
  {
    "path": "watchfaces/fuzzy_time/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchfaces/just_a_bit/appinfo.json",
    "content": "{\n  \"uuid\": \"6a80c758-22ad-49cf-a921-32b5c689c1d2\",\n  \"shortName\": \"Just A Bit\",\n  \"longName\": \"Just A Bit\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 4,\n  \"versionLabel\": \"4.0\",\n  \"watchapp\": {\n    \"watchface\": true\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"menuIcon\": true,\n        \"type\": \"png\",\n        \"name\": \"IMAGE_MENU_ICON\",\n        \"file\": \"images/menu_icon_binary_watch.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchfaces/just_a_bit/src/just_a_bit.c",
    "content": "#include <pebble.h>\n\n#define CIRCLE_RADIUS 12\n#define CIRCLE_LINE_THICKNESS 2\n#define CIRCLE_PADDING 14 - CIRCLE_RADIUS\n#define CELL_SIZE (2 * (CIRCLE_RADIUS + CIRCLE_PADDING))\n#define SIDE_PADDING (144 - (4 * CELL_SIZE)) / 2\n\n#define CELLS_PER_ROW 4\n#define CELLS_PER_COLUMN 6\n\n#define HOURS_FIRST_DIGIT_ROW 0\n#define HOURS_SECOND_DIGIT_ROW 1\n#define MINUTES_FIRST_DIGIT_ROW 2\n#define MINUTES_SECOND_DIGIT_ROW 3\n#define SECONDS_FIRST_DIGIT_ROW 4\n#define SECONDS_SECOND_DIGIT_ROW 5\n\n#define DEFAULT_MAX_COLS 4\n#define HOURS_FIRST_DIGIT_MAX_COLS 2\n#define MINUTES_FIRST_DIGIT_MAX_COLS 3\n#define SECONDS_FIRST_DIGIT_MAX_COLS 3\n\nstatic Window *s_main_window;\nstatic Layer *s_display_layer;\n\nstatic void draw_cell(GContext *ctx, GPoint center, bool filled) {\n  graphics_context_set_fill_color(ctx, GColorWhite);\n  graphics_fill_circle(ctx, center, CIRCLE_RADIUS);\n\n  if (!filled) {\n    graphics_context_set_fill_color(ctx, GColorBlack);\n    graphics_fill_circle(ctx, center, CIRCLE_RADIUS - CIRCLE_LINE_THICKNESS);\n  }\n}\n\nstatic GPoint get_center_point_from_cell_location(unsigned short x, unsigned short y) {\n  return GPoint(SIDE_PADDING + (CELL_SIZE / 2) + (CELL_SIZE * x), (CELL_SIZE / 2) + (CELL_SIZE * y));\n}\n\nstatic void draw_cell_row_for_digit(GContext *ctx, unsigned short digit, unsigned short max_columns_to_display, unsigned short cell_row) {\n  // Converts the supplied decimal digit into Binary Coded Decimal form and\n  // then draws a row of cells on screen--'1' binary values are filled, '0' binary values are not filled.\n  // `max_columns_to_display` restricts how many binary digits are shown in the row.\n  for (int i = 0; i < max_columns_to_display; i++) {\n    draw_cell(ctx, get_center_point_from_cell_location(i, cell_row), (digit >> i) & 0x1);\n  }\n}\n\nstatic unsigned short get_display_hour(unsigned short hour) {\n  if (clock_is_24h_style()) {\n    return hour;\n  }\n\n  unsigned short display_hour = hour % 12;\n\n  return display_hour ? display_hour : 12;\n}\n\nstatic void display_layer_update_callback(Layer *layer, GContext *ctx) {\n  time_t now = time(NULL);\n  struct tm *t = localtime(&now);\n\n  unsigned short display_hour = get_display_hour(t->tm_hour);\n\n  draw_cell_row_for_digit(ctx, display_hour / 10, HOURS_FIRST_DIGIT_MAX_COLS, HOURS_FIRST_DIGIT_ROW);\n  draw_cell_row_for_digit(ctx, display_hour % 10, DEFAULT_MAX_COLS, HOURS_SECOND_DIGIT_ROW);\n\n  draw_cell_row_for_digit(ctx, t->tm_min / 10, MINUTES_FIRST_DIGIT_MAX_COLS, MINUTES_FIRST_DIGIT_ROW);\n  draw_cell_row_for_digit(ctx, t->tm_min % 10, DEFAULT_MAX_COLS, MINUTES_SECOND_DIGIT_ROW);\n\n  draw_cell_row_for_digit(ctx, t->tm_sec / 10, SECONDS_FIRST_DIGIT_MAX_COLS, SECONDS_FIRST_DIGIT_ROW);\n  draw_cell_row_for_digit(ctx, t->tm_sec % 10, DEFAULT_MAX_COLS, SECONDS_SECOND_DIGIT_ROW);\n}\n\nstatic void handle_second_tick(struct tm *tick_time, TimeUnits units_changed) {\n  layer_mark_dirty(s_display_layer);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_frame(window_layer);\n\n  s_display_layer = layer_create(bounds);\n  layer_set_update_proc(s_display_layer, display_layer_update_callback);\n  layer_add_child(window_layer, s_display_layer);\n\n  tick_timer_service_subscribe(SECOND_UNIT, handle_second_tick);\n}\n\nstatic void main_window_unload(Window *window) {\n  layer_destroy(s_display_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_background_color(s_main_window, GColorBlack);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchfaces/just_a_bit/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchfaces/ninety_one_dub/appinfo.json",
    "content": "{\n  \"uuid\": \"7112d624-6555-4279-89ae-c086e9369427\",\n  \"shortName\": \"91 Dub\",\n  \"longName\": \"91 Dub\",\n  \"companyName\": \"Pebble Technology & orviwan\",\n  \"versionCode\": 3,\n  \"versionLabel\": \"3.0\",\n  \"watchapp\": {\n    \"watchface\": true\n  },\n  \"resources\": {\n    \"media\": [\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_MENU_ICON\",\n        \"file\": \"images/menu_icon_91w.png\",\n        \"menu_icon\": true\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_BACKGROUND\",\n        \"file\": \"images/background.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_METER_BAR\",\n        \"file\": \"images/icon_meter.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_24_HOUR_MODE\",\n        \"file\": \"images/time_format_24H.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_PM_MODE\",\n        \"file\": \"images/time_format_PM.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DAY_NAME_SUN\",\n        \"file\": \"images/day_sun.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DAY_NAME_MON\",\n        \"file\": \"images/day_mon.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DAY_NAME_TUE\",\n        \"file\": \"images/day_tue.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DAY_NAME_WED\",\n        \"file\": \"images/day_wed.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DAY_NAME_THU\",\n        \"file\": \"images/day_thu.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DAY_NAME_FRI\",\n        \"file\": \"images/day_fri.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DAY_NAME_SAT\",\n        \"file\": \"images/day_sat.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DATENUM_0\",\n        \"file\": \"images/datenum_0.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DATENUM_1\",\n        \"file\": \"images/datenum_1.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DATENUM_2\",\n        \"file\": \"images/datenum_2.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DATENUM_3\",\n        \"file\": \"images/datenum_3.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DATENUM_4\",\n        \"file\": \"images/datenum_4.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DATENUM_5\",\n        \"file\": \"images/datenum_5.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DATENUM_6\",\n        \"file\": \"images/datenum_6.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DATENUM_7\",\n        \"file\": \"images/datenum_7.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DATENUM_8\",\n        \"file\": \"images/datenum_8.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_DATENUM_9\",\n        \"file\": \"images/datenum_9.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_0\",\n        \"file\": \"images/num_0.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_1\",\n        \"file\": \"images/num_1.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_2\",\n        \"file\": \"images/num_2.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_3\",\n        \"file\": \"images/num_3.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_4\",\n        \"file\": \"images/num_4.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_5\",\n        \"file\": \"images/num_5.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_6\",\n        \"file\": \"images/num_6.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_7\",\n        \"file\": \"images/num_7.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_8\",\n        \"file\": \"images/num_8.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_NUM_9\",\n        \"file\": \"images/num_9.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchfaces/ninety_one_dub/src/ninety_one_dub.c",
    "content": "#include \"pebble.h\"\n\n#define TOTAL_DATE_DIGITS 2\n#define TOTAL_TIME_DIGITS 4\n\nstatic const int DAY_NAME_IMAGE_RESOURCE_IDS[] = {\n  RESOURCE_ID_IMAGE_DAY_NAME_SUN,\n  RESOURCE_ID_IMAGE_DAY_NAME_MON,\n  RESOURCE_ID_IMAGE_DAY_NAME_TUE,\n  RESOURCE_ID_IMAGE_DAY_NAME_WED,\n  RESOURCE_ID_IMAGE_DAY_NAME_THU,\n  RESOURCE_ID_IMAGE_DAY_NAME_FRI,\n  RESOURCE_ID_IMAGE_DAY_NAME_SAT\n};\n\nstatic const int DATENUM_IMAGE_RESOURCE_IDS[] = {\n  RESOURCE_ID_IMAGE_DATENUM_0,\n  RESOURCE_ID_IMAGE_DATENUM_1,\n  RESOURCE_ID_IMAGE_DATENUM_2,\n  RESOURCE_ID_IMAGE_DATENUM_3,\n  RESOURCE_ID_IMAGE_DATENUM_4,\n  RESOURCE_ID_IMAGE_DATENUM_5,\n  RESOURCE_ID_IMAGE_DATENUM_6,\n  RESOURCE_ID_IMAGE_DATENUM_7,\n  RESOURCE_ID_IMAGE_DATENUM_8,\n  RESOURCE_ID_IMAGE_DATENUM_9\n};\n\nstatic const int BIG_DIGIT_IMAGE_RESOURCE_IDS[] = {\n  RESOURCE_ID_IMAGE_NUM_0,\n  RESOURCE_ID_IMAGE_NUM_1,\n  RESOURCE_ID_IMAGE_NUM_2,\n  RESOURCE_ID_IMAGE_NUM_3,\n  RESOURCE_ID_IMAGE_NUM_4,\n  RESOURCE_ID_IMAGE_NUM_5,\n  RESOURCE_ID_IMAGE_NUM_6,\n  RESOURCE_ID_IMAGE_NUM_7,\n  RESOURCE_ID_IMAGE_NUM_8,\n  RESOURCE_ID_IMAGE_NUM_9\n};\n\nstatic Window *s_main_window;\nstatic GBitmap *s_meter_bar_bitmap, *s_time_format_bitmap, *s_background_bitmap, *s_day_name_bitmap;\nstatic BitmapLayer *s_background_layer, *s_meter_bar_layer, *s_time_format_layer, *s_day_name_layer;\n\nstatic GBitmap *s_date_digits[TOTAL_DATE_DIGITS];\nstatic GBitmap *s_time_digits[TOTAL_TIME_DIGITS];\nstatic BitmapLayer *s_date_digits_layers[TOTAL_DATE_DIGITS];\nstatic BitmapLayer *s_time_digits_layers[TOTAL_TIME_DIGITS];\n\nstatic void set_container_image(GBitmap **bmp_image, BitmapLayer *bmp_layer, const int resource_id, GPoint origin) {\n  GBitmap *old_image = *bmp_image;\n\n  *bmp_image = gbitmap_create_with_resource(resource_id);\n#ifdef PBL_PLATFORM_BASALT\n  GRect bitmap_bounds = gbitmap_get_bounds((*bmp_image));\n#else\n  GRect bitmap_bounds = (*bmp_image)->bounds;\n#endif\n  GRect frame = GRect(origin.x, origin.y, bitmap_bounds.size.w, bitmap_bounds.size.h);\n  bitmap_layer_set_bitmap(bmp_layer, *bmp_image);\n  layer_set_frame(bitmap_layer_get_layer(bmp_layer), frame);\n\n  if (old_image != NULL) {\n  \tgbitmap_destroy(old_image);\n  }\n}\n\n\nstatic unsigned short get_display_hour(unsigned short hour) {\n  if (clock_is_24h_style()) {\n    return hour;\n  }\n\n  unsigned short display_hour = hour % 12;\n  return display_hour ? display_hour : 12;\n}\n\n\nstatic void update_display(struct tm *current_time) {\n  set_container_image(&s_day_name_bitmap, s_day_name_layer, DAY_NAME_IMAGE_RESOURCE_IDS[current_time->tm_wday], GPoint(69, 61));\n  set_container_image(&s_date_digits[0], s_date_digits_layers[0], DATENUM_IMAGE_RESOURCE_IDS[current_time->tm_mday / 10], GPoint(108, 61));\n  set_container_image(&s_date_digits[1], s_date_digits_layers[1], DATENUM_IMAGE_RESOURCE_IDS[current_time->tm_mday % 10], GPoint(121, 61));\n\n  unsigned short display_hour = get_display_hour(current_time->tm_hour);\n  set_container_image(&s_time_digits[0], s_time_digits_layers[0], BIG_DIGIT_IMAGE_RESOURCE_IDS[display_hour / 10], GPoint(10, 84));\n  set_container_image(&s_time_digits[1], s_time_digits_layers[1], BIG_DIGIT_IMAGE_RESOURCE_IDS[display_hour % 10], GPoint(40, 84));\n\n  set_container_image(&s_time_digits[2], s_time_digits_layers[2], BIG_DIGIT_IMAGE_RESOURCE_IDS[current_time->tm_min / 10], GPoint(77, 84));\n  set_container_image(&s_time_digits[3], s_time_digits_layers[3], BIG_DIGIT_IMAGE_RESOURCE_IDS[current_time->tm_min % 10], GPoint(105, 84));\n\n  if (!clock_is_24h_style()) {\n    if (current_time->tm_hour >= 12) {\n    \tlayer_set_hidden(bitmap_layer_get_layer(s_time_format_layer), false);\n      set_container_image(&s_time_format_bitmap, s_time_format_layer, RESOURCE_ID_IMAGE_PM_MODE, GPoint(17, 68));\n    } else {\n    \tlayer_set_hidden(bitmap_layer_get_layer(s_time_format_layer), true);\n    }\n\n    if (display_hour / 10 == 0) {\n    \tlayer_set_hidden(bitmap_layer_get_layer(s_time_digits_layers[0]), true);\n    } else {\n    \tlayer_set_hidden(bitmap_layer_get_layer(s_time_digits_layers[0]), false);\n    }\n  }\n}\n\nstatic void handle_minute_tick(struct tm *tick_time, TimeUnits units_changed) {\n  update_display(tick_time);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n\n  s_background_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BACKGROUND);\n  s_background_layer = bitmap_layer_create(layer_get_frame(window_layer));\n  bitmap_layer_set_bitmap(s_background_layer, s_background_bitmap);\n  layer_add_child(window_layer, bitmap_layer_get_layer(s_background_layer));\n\n  s_meter_bar_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_METER_BAR);\n#ifdef PBL_PLATFORM_BASALT\n  GRect bitmap_bounds = gbitmap_get_bounds(s_meter_bar_bitmap);\n#else\n  GRect bitmap_bounds = s_meter_bar_bitmap->bounds;\n#endif\n  GRect frame = GRect(17, 43, bitmap_bounds.size.w, bitmap_bounds.size.h);\n  s_meter_bar_layer = bitmap_layer_create(frame);\n  bitmap_layer_set_bitmap(s_meter_bar_layer, s_meter_bar_bitmap);\n  layer_add_child(window_layer, bitmap_layer_get_layer(s_meter_bar_layer));\n\n  if (!clock_is_24h_style()) {\n    s_time_format_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_24_HOUR_MODE);\n#ifdef PBL_PLATFORM_BASALT\n    bitmap_bounds = gbitmap_get_bounds(s_time_format_bitmap);\n#else\n    bitmap_bounds = s_time_format_bitmap->bounds;\n#endif\n    GRect frame = GRect(17, 68, bitmap_bounds.size.w, bitmap_bounds.size.h);\n    s_time_format_layer = bitmap_layer_create(frame);\n    bitmap_layer_set_bitmap(s_time_format_layer, s_time_format_bitmap);\n    layer_add_child(window_layer, bitmap_layer_get_layer(s_time_format_layer));\n  }\n\n  // Create time and date layers\n  GRect dummy_frame = GRect(0, 0, 0, 0);\n  s_day_name_layer = bitmap_layer_create(dummy_frame);\n  layer_add_child(window_layer, bitmap_layer_get_layer(s_day_name_layer));\n  for (int i = 0; i < TOTAL_TIME_DIGITS; ++i) {\n    s_time_digits_layers[i] = bitmap_layer_create(dummy_frame);\n    layer_add_child(window_layer, bitmap_layer_get_layer(s_time_digits_layers[i]));\n  }\n  for (int i = 0; i < TOTAL_DATE_DIGITS; ++i) {\n    s_date_digits_layers[i] = bitmap_layer_create(dummy_frame);\n    layer_add_child(window_layer, bitmap_layer_get_layer(s_date_digits_layers[i]));\n  }\n}\n\nstatic void main_window_unload(Window *window) {\n  layer_remove_from_parent(bitmap_layer_get_layer(s_background_layer));\n  bitmap_layer_destroy(s_background_layer);\n  gbitmap_destroy(s_background_bitmap);\n\n  layer_remove_from_parent(bitmap_layer_get_layer(s_meter_bar_layer));\n  bitmap_layer_destroy(s_meter_bar_layer);\n  gbitmap_destroy(s_meter_bar_bitmap);\n\n  layer_remove_from_parent(bitmap_layer_get_layer(s_time_format_layer));\n  bitmap_layer_destroy(s_time_format_layer);\n  gbitmap_destroy(s_time_format_bitmap);\n\n  layer_remove_from_parent(bitmap_layer_get_layer(s_day_name_layer));\n  bitmap_layer_destroy(s_day_name_layer);\n  gbitmap_destroy(s_day_name_bitmap);\n\n  for (int i = 0; i < TOTAL_DATE_DIGITS; i++) {\n    layer_remove_from_parent(bitmap_layer_get_layer(s_date_digits_layers[i]));\n    gbitmap_destroy(s_date_digits[i]);\n    bitmap_layer_destroy(s_date_digits_layers[i]);\n  }\n\n  for (int i = 0; i < TOTAL_TIME_DIGITS; i++) {\n    layer_remove_from_parent(bitmap_layer_get_layer(s_time_digits_layers[i]));\n    gbitmap_destroy(s_time_digits[i]);\n    bitmap_layer_destroy(s_time_digits_layers[i]);\n  }\n}\n\nstatic void init() {\n  memset(&s_time_digits_layers, 0, sizeof(s_time_digits_layers));\n  memset(&s_time_digits, 0, sizeof(s_time_digits));\n  memset(&s_date_digits_layers, 0, sizeof(s_date_digits_layers));\n  memset(&s_date_digits, 0, sizeof(s_date_digits));\n\n  s_main_window = window_create();\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n\n  // Avoids a blank screen on watch start.\n  time_t now = time(NULL);\n  struct tm *tick_time = localtime(&now);\n  update_display(tick_time);\n\n  tick_timer_service_subscribe(MINUTE_UNIT, handle_minute_tick);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main() {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchfaces/ninety_one_dub/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchfaces/onthebutton/appinfo.json",
    "content": "{\n  \"uuid\" : \"4295ec2e-e89a-499a-8d48-ab36ddba4034\",\n  \"shortName\" : \"On The Button\",\n  \"longName\" : \"On The Button\",\n  \"companyName\" : \"A Company\",\n  \"versionCode\" : 3,\n  \"versionLabel\" : \"3.0\",\n  \"watchapp\" : {\n    \"watchface\" : true\n  },\n  \"resources\" : {\n    \"media\" : []\n  }\n}\n"
  },
  {
    "path": "watchfaces/onthebutton/src/onthebutton.c",
    "content": "/*\n\n   Customisable Watch Pebble App\n\n   Shows how to use button functionality--as a standard app.\n\n   Also shows adding a second window.\n\n   Also shows how to have a full screen window.\n\n   (Note: Doesn't currently preserve location.)\n\n */\n\n// Standard includes\n#include \"pebble.h\"\n\n\n// App-specific data\nstatic Window *window; // All apps must have at least one window\n\nstatic TextLayer *timeLayer; // The clock\n\nstatic GRect clockFrame = {.origin = {.x = 29, .y = 54}, .size = {.w = 144-40, .h = 168-54}};\n\n\n#define EDIT_MODE_OFF 0\n#define EDIT_MODE_X   1\n#define EDIT_MODE_Y   2\n#define EDIT_MODE_MAX 3\n\nstatic TextLayer *editModeDisplayLayer;\nstatic short editMode = EDIT_MODE_OFF;\n\n\n// Called once per second\nstatic void handle_second_tick(struct tm *currentTime, TimeUnits units_changed) {\n  static char timeText[] = \"00:00:00\"; // Needs to be static because it's used by the system later.\n  strftime(timeText, sizeof(timeText), \"%T\", currentTime);\n  text_layer_set_text(timeLayer, timeText);\n}\n\n\nstatic void updateEditModeDisplay(void) {\n  // TODO: Add time out to revert to EDIT_MODE_OFF?\n\n  switch (editMode) {\n    case EDIT_MODE_OFF:\n      layer_set_hidden(text_layer_get_layer(editModeDisplayLayer), true);\n      break;\n\n    case EDIT_MODE_X:\n      layer_set_hidden(text_layer_get_layer(editModeDisplayLayer), false);\n      text_layer_set_text(editModeDisplayLayer, \"Edit X-axis\");\n      break;\n\n    case EDIT_MODE_Y:\n      layer_set_hidden(text_layer_get_layer(editModeDisplayLayer), false);\n      text_layer_set_text(editModeDisplayLayer, \"Edit Y-axis\");\n      break;\n\n    default:\n      break;\n  }\n\n}\n\n\nstatic void helpWindow_update_callback(Layer *me, GContext* ctx ) {\n  graphics_context_set_stroke_color(ctx, GColorBlack); // TODO: Needed?\n  graphics_context_set_fill_color(ctx, GColorBlack);\n\n  // TODO: Modify this when we have more sensible bounds values.\n  // TODO: Make this not inset so far.\n  GRect me_bounds = layer_get_bounds(me);\n  graphics_fill_rect(ctx, GRect(0, 0, me_bounds.size.w-10, me_bounds.size.h-10), 4, GCornersAll);\n\n  graphics_context_set_fill_color(ctx, GColorWhite);\n  graphics_fill_rect(ctx, GRect(2, 2, me_bounds.size.w-10-(2*2), me_bounds.size.h-10-(2*2)), 4, GCornersAll);\n\n  graphics_context_set_fill_color(ctx, GColorBlack);\n  graphics_fill_rect(ctx, GRect(2+2, 2+2, me_bounds.size.w-10-((2+2)*2), me_bounds.size.h-10-((2+2)*2)), 4, GCornersAll);\n\n}\n\nstatic Window *helpWindow;\nstatic Layer *helpChromeLayer;\nstatic TextLayer *helpTextLayer;\n\nstatic void displayHelp(void) {\n  window_stack_push(helpWindow, false /* Not animated */);\n}\n\nstatic void select_single_click_handler(ClickRecognizerRef recognizer, Window *window) {\n  displayHelp();\n}\n\n\nstatic void select_long_click_handler(ClickRecognizerRef recognizer, Window *window) {\n  editMode = (editMode + 1) % EDIT_MODE_MAX;\n\n  updateEditModeDisplay();\n}\n\n\nstatic void updateLocation(bool upButtonPressed) {\n  bool stateChanged = false;\n\n  // TODO: Swap out different click configurators instead?\n  switch(editMode) {\n\n    case EDIT_MODE_X:\n      clockFrame.origin.x = clockFrame.origin.x + (upButtonPressed ? 1 : -1);\n      stateChanged = true;\n      break;\n\n    case EDIT_MODE_Y:\n      // Sign matches button orientation\n      clockFrame.origin.y = clockFrame.origin.y + (upButtonPressed ? -1 : 1);\n      stateChanged = true;\n      break;\n\n    default:\n      break;\n  }\n\n  if (stateChanged) {\n      Layer *timeLayer_layer = text_layer_get_layer(timeLayer);\n      layer_set_frame(timeLayer_layer, clockFrame);\n      layer_mark_dirty(timeLayer_layer);\n\n      updateEditModeDisplay();\n  }\n\n}\n\n\nstatic void up_single_click_handler(ClickRecognizerRef recognizer, Window *window) {\n  updateLocation(true);\n}\n\n\nstatic void down_single_click_handler(ClickRecognizerRef recognizer, Window *window) {\n  updateLocation(false);\n}\n\n\nstatic void config_provider(Window *window) {\n  const uint16_t repeat_interval_ms = 100;\n\n  window_single_click_subscribe(BUTTON_ID_SELECT, (ClickHandler) select_single_click_handler);\n  window_long_click_subscribe(BUTTON_ID_SELECT, 0, (ClickHandler) select_long_click_handler, NULL);\n  window_single_repeating_click_subscribe(BUTTON_ID_UP, repeat_interval_ms, (ClickHandler) up_single_click_handler);\n  window_single_repeating_click_subscribe(BUTTON_ID_DOWN, repeat_interval_ms, (ClickHandler) down_single_click_handler);\n}\n\n\n// Initialize the app\nstatic void app_init(void) {\n  // Create our app's base window\n  window = window_create();\n  Layer *window_layer = window_get_root_layer(window);\n  window_stack_push(window, true /* Animated */);\n  window_set_fullscreen(window, true);\n  window_set_background_color(window, GColorBlack);\n\n  // Init the text layer used to show the time\n  // TODO: Wrap this boilerplate in a function?\n  timeLayer = text_layer_create(clockFrame);\n  text_layer_set_text_color(timeLayer, GColorWhite);\n  text_layer_set_background_color(timeLayer, GColorClear);\n  text_layer_set_font(timeLayer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));\n\n  // Ensures time is displayed immediately (will break if NULL tick event accessed).\n  // (This is why it's a good idea to have a separate routine to do the update itself.)\n  time_t now = time(NULL);\n  struct tm *tick_time = localtime(&now);\n  handle_second_tick(tick_time, SECOND_UNIT);\n\n  layer_add_child(window_layer, text_layer_get_layer(timeLayer));\n\n  // Layer to show the current edit mode\n  editModeDisplayLayer = text_layer_create(GRect(4, 4, 144-4, 20));\n  text_layer_set_text_color(editModeDisplayLayer, GColorWhite);\n  text_layer_set_background_color(editModeDisplayLayer, GColorClear);\n  text_layer_set_font(editModeDisplayLayer, fonts_get_system_font(FONT_KEY_GOTHIC_18));\n\n  updateEditModeDisplay();\n\n  layer_add_child(window_layer, text_layer_get_layer(editModeDisplayLayer));\n\n  // Attach our desired button functionality\n  window_set_click_config_provider(window, (ClickConfigProvider) config_provider);\n\n  // Init the help window\n  helpWindow = window_create();\n  window_set_fullscreen(helpWindow, true);\n  Layer *helpWindow_layer = window_get_root_layer(helpWindow);\n\n  GRect helpWindow_frame = layer_get_frame(helpWindow_layer);\n  helpWindow_frame.origin.x = 5;\n  helpWindow_frame.origin.y = 5;\n  layer_set_frame(helpWindow_layer, helpWindow_frame);\n\n  GRect helpWindow_bounds = layer_get_bounds(window_layer);\n  helpWindow_bounds.size.w -= 10;\n  helpWindow_bounds.size.h -= 10;\n  layer_set_bounds(helpWindow_layer, helpWindow_bounds);\n\n  window_set_background_color(helpWindow, GColorClear);\n\n  // Layer for the help screen\n  // TODO: Set proper/better frame/bounds values here?\n  helpChromeLayer = layer_create(helpWindow_frame);\n  layer_set_update_proc(helpChromeLayer, &helpWindow_update_callback);\n  layer_add_child(helpWindow_layer, helpChromeLayer);\n\n  helpTextLayer = text_layer_create(GRect(16, 16, 144-24-8 /* width */, 168-24-8 /* height */));\n  text_layer_set_text_color(helpTextLayer, GColorWhite);\n  text_layer_set_background_color(helpTextLayer, GColorBlack);\n  text_layer_set_font(helpTextLayer, fonts_get_system_font(FONT_KEY_GOTHIC_14));\n  text_layer_set_text(helpTextLayer, \">Select (long press)<\\nChange edit mode.\\n\\n>Up/Down<\\nIncrease/decrease axis value\\n\\n(Press back to close)\");\n\n  layer_add_child(helpWindow_layer, text_layer_get_layer(helpTextLayer));\n\n  tick_timer_service_subscribe(SECOND_UNIT, handle_second_tick);\n}\n\nstatic void app_deinit(void) {\n  text_layer_destroy(editModeDisplayLayer);\n  text_layer_destroy(timeLayer);\n  layer_destroy(helpChromeLayer);\n  text_layer_destroy(helpTextLayer);\n  window_destroy(helpWindow);\n  window_destroy(window);\n}\n\nint main(void) {\n    app_init();\n    app_event_loop();\n    app_deinit();\n}\n"
  },
  {
    "path": "watchfaces/onthebutton/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n                    target='pebble-app.elf')\n\n    ctx.pbl_bundle(elf='pebble-app.elf',\n                   js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchfaces/rumbletime/appinfo.json",
    "content": "{\n  \"uuid\": \"321476b1-2ec6-4d03-9ef8-0f8cdb2fa9e7\",\n  \"shortName\": \"RumbleTime\",\n  \"longName\": \"RumbleTime\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": true\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchfaces/rumbletime/src/rumbletime.c",
    "content": "/*\n * Rumbletime Watch Pebble App\n * Vibrates on the hour and every N minutes.\n * (Where N is set by VIBE_INTERVAL_IN_MINUTES.)\n */\n\n#include \"pebble.h\"\n\n#define VIBE_INTERVAL_IN_MINUTES 15\n\nstatic const VibePattern HOUR_VIBE_PATTERN = {\n  .durations = (uint32_t[]) {50, 200, 50, 200, 50, 200, 50, 200},\n  .num_segments = 8\n};\n\nstatic const VibePattern PART_HOUR_INTERVAL_VIBE_PATTERN = {\n  .durations = (uint32_t[]) {50, 200, 50, 200},\n  .num_segments = 4\n};\n\nstatic Window *s_main_window; \nstatic TextLayer *s_time_layer; \n\nstatic void handle_minute_tick(struct tm *tick_time, TimeUnits units_changed) {\n  // Needs to be static because it's used by the system later.\n  static char s_time_text[] = \"00:00\"; \n  strftime(s_time_text, sizeof(s_time_text), \"%R\", tick_time);\n  text_layer_set_text(s_time_layer, s_time_text);\n  \n  if (tick_time->tm_min == 0) {\n    vibes_enqueue_custom_pattern(HOUR_VIBE_PATTERN);\n  } else if ((tick_time->tm_min % VIBE_INTERVAL_IN_MINUTES) == 0) {\n    vibes_enqueue_custom_pattern(PART_HOUR_INTERVAL_VIBE_PATTERN);\n  }\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n\n  s_time_layer = text_layer_create(GRect(40, 54, 104, 114));\n  text_layer_set_text_color(s_time_layer, GColorWhite);\n  text_layer_set_background_color(s_time_layer, GColorClear);\n  text_layer_set_font(s_time_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));\n  layer_add_child(window_layer, text_layer_get_layer(s_time_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_time_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_background_color(s_main_window, GColorBlack);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n\n  // Ensures time is displayed immediately\n  time_t now = time(NULL);\n  struct tm * time_now = localtime(&now);\n  handle_minute_tick(time_now, MINUTE_UNIT);\n\n  tick_timer_service_subscribe(MINUTE_UNIT, handle_minute_tick);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main() {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchfaces/rumbletime/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchfaces/segment_six/appinfo.json",
    "content": "{\n  \"uuid\": \"1e8d28ef-e169-4924-a8b8-76c32faa7a66\",\n  \"shortName\": \"Segment Six\",\n  \"longName\": \"Segment Six\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": true\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"menuIcon\": true,\n        \"type\": \"png\",\n        \"name\": \"IMAGE_MENU_ICON\",\n        \"file\": \"images/menu_icon_sector_watch.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchfaces/segment_six/src/segment_six.c",
    "content": "#include \"pebble.h\"\n\nstatic const GPathInfo MINUTE_SEGMENT_PATH_POINTS = {\n  3,\n  (GPoint[]) {\n    {0, 0},\n    {-8, -80}, // 80 = radius + fudge; 8 = 80*tan(6 degrees); 6 degrees per minute;\n    {8,  -80},\n  }\n};\n\nstatic const GPathInfo HOUR_SEGMENT_PATH_POINTS = {\n  3,\n  (GPoint[]) {\n    {0, 0},\n    {-13, -50}, // 50 = radius + fudge; _ = 50*tan(15 degrees); 30 degrees per hour;\n    {13,  -50},\n  }\n};\n\nstatic Window *s_main_window;\nstatic Layer *s_minute_display_layer, *s_hour_display_layer;\n\nstatic GPath *s_minute_segment_path, *s_hour_segment_path;\n\nstatic void minute_display_update_proc(Layer *layer, GContext* ctx) {\n  time_t now = time(NULL);\n  struct tm *t = localtime(&now);\n\n  unsigned int angle = t->tm_min * 6;\n  gpath_rotate_to(s_minute_segment_path, (TRIG_MAX_ANGLE / 360) * angle);\n\n  GRect bounds = layer_get_bounds(layer);\n  GPoint center = grect_center_point(&bounds);\n  graphics_context_set_fill_color(ctx, GColorWhite);\n  graphics_fill_circle(ctx, center, 77);\n  graphics_context_set_fill_color(ctx, GColorBlack);\n  gpath_draw_filled(ctx, s_minute_segment_path);\n  graphics_fill_circle(ctx, center, 52);\n}\n\nstatic void hour_display_update_proc(Layer *layer, GContext* ctx) {\n  time_t now = time(NULL);\n  struct tm *t = localtime(&now);\n\n  unsigned int angle = (t->tm_hour % 12) * 30;\n  GRect bounds = layer_get_bounds(layer);\n  GPoint center = grect_center_point(&bounds);\n\n  graphics_context_set_fill_color(ctx, GColorWhite);\n  graphics_fill_circle(ctx, center, 48);\n\n  for (unsigned int i = 0; i < 360; i += 15) {\n    if ((i != angle) && (i != (angle + 15)) && (i != ((angle - 15 + 360) % 360)) ) {\n      gpath_rotate_to(s_hour_segment_path, (TRIG_MAX_ANGLE / 360) * i);\n      graphics_context_set_fill_color(ctx, GColorBlack);\n      gpath_draw_filled(ctx, s_hour_segment_path);\n    }\n  }\n\n  // Stray pixels\n  graphics_context_set_fill_color(ctx, GColorBlack);\n  graphics_fill_circle(ctx, center, 5);\n  graphics_context_set_stroke_color(ctx, GColorBlack);\n  if ((angle != 0) && (angle != 330)) {\n    graphics_draw_pixel(ctx, GPoint(71, 77));\n    graphics_draw_pixel(ctx, GPoint(71, 78));\n  }\n}\n\nstatic void handle_minute_tick(struct tm *tick_time, TimeUnits units_changed) {\n  layer_mark_dirty(s_minute_display_layer);\n  layer_mark_dirty(s_hour_display_layer);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_bounds(window_layer);\n\n  s_minute_display_layer = layer_create(bounds);\n  layer_set_update_proc(s_minute_display_layer, minute_display_update_proc);\n  layer_add_child(window_layer, s_minute_display_layer);\n\n  s_minute_segment_path = gpath_create(&MINUTE_SEGMENT_PATH_POINTS);\n  gpath_move_to(s_minute_segment_path, grect_center_point(&bounds));\n\n  s_hour_display_layer = layer_create(bounds);\n  layer_set_update_proc(s_hour_display_layer, hour_display_update_proc);\n  layer_add_child(window_layer, s_hour_display_layer);\n\n  s_hour_segment_path = gpath_create(&HOUR_SEGMENT_PATH_POINTS);\n  gpath_move_to(s_hour_segment_path, grect_center_point(&bounds));\n}\n\nstatic void main_window_unload(Window *window) {\n  gpath_destroy(s_minute_segment_path);\n  gpath_destroy(s_hour_segment_path);\n\n  layer_destroy(s_minute_display_layer);\n  layer_destroy(s_hour_display_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_background_color(s_main_window, GColorBlack);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n\n  tick_timer_service_subscribe(MINUTE_UNIT, handle_minute_tick);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n\n  tick_timer_service_unsubscribe();\n}\n\nint main() {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchfaces/segment_six/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchfaces/simple_analog/appinfo.json",
    "content": "{\n  \"uuid\": \"ecc8f112-318f-4ee2-be11-53c63b8a1139\",\n  \"shortName\": \"My Simple Analog\",\n  \"longName\": \"My Simple Analog\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 1,\n  \"versionLabel\": \"1.0\",\n  \"watchapp\": {\n    \"watchface\": true\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": []\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchfaces/simple_analog/src/simple_analog.c",
    "content": "#include \"simple_analog.h\"\n\n#include \"pebble.h\"\n\nstatic Window *window;\nstatic Layer *s_simple_bg_layer, *s_date_layer, *s_hands_layer;\nstatic TextLayer *s_day_label, *s_num_label;\n\nstatic GPath *s_tick_paths[NUM_CLOCK_TICKS];\nstatic GPath *s_minute_arrow, *s_hour_arrow;\nstatic char s_num_buffer[4], s_day_buffer[6];\n\nstatic void bg_update_proc(Layer *layer, GContext *ctx) {\n  graphics_context_set_fill_color(ctx, GColorBlack);\n  graphics_fill_rect(ctx, layer_get_bounds(layer), 0, GCornerNone);\n  graphics_context_set_fill_color(ctx, GColorWhite);\n  for (int i = 0; i < NUM_CLOCK_TICKS; ++i) {\n    gpath_draw_filled(ctx, s_tick_paths[i]);\n  }\n}\n\nstatic void hands_update_proc(Layer *layer, GContext *ctx) {\n  GRect bounds = layer_get_bounds(layer);\n  GPoint center = grect_center_point(&bounds);\n  int16_t second_hand_length = bounds.size.w / 2;\n\n  time_t now = time(NULL);\n  struct tm *t = localtime(&now);\n  int32_t second_angle = TRIG_MAX_ANGLE * t->tm_sec / 60;\n  GPoint second_hand = {\n    .x = (int16_t)(sin_lookup(second_angle) * (int32_t)second_hand_length / TRIG_MAX_RATIO) + center.x,\n    .y = (int16_t)(-cos_lookup(second_angle) * (int32_t)second_hand_length / TRIG_MAX_RATIO) + center.y,\n  };\n\n  // second hand\n  graphics_context_set_stroke_color(ctx, GColorWhite);\n  graphics_draw_line(ctx, second_hand, center);\n\n  // minute/hour hand\n  graphics_context_set_fill_color(ctx, GColorWhite);\n  graphics_context_set_stroke_color(ctx, GColorBlack);\n\n  gpath_rotate_to(s_minute_arrow, TRIG_MAX_ANGLE * t->tm_min / 60);\n  gpath_draw_filled(ctx, s_minute_arrow);\n  gpath_draw_outline(ctx, s_minute_arrow);\n\n  gpath_rotate_to(s_hour_arrow, (TRIG_MAX_ANGLE * (((t->tm_hour % 12) * 6) + (t->tm_min / 10))) / (12 * 6));\n  gpath_draw_filled(ctx, s_hour_arrow);\n  gpath_draw_outline(ctx, s_hour_arrow);\n\n  // dot in the middle\n  graphics_context_set_fill_color(ctx, GColorBlack);\n  graphics_fill_rect(ctx, GRect(bounds.size.w / 2 - 1, bounds.size.h / 2 - 1, 3, 3), 0, GCornerNone);\n}\n\nstatic void date_update_proc(Layer *layer, GContext *ctx) {\n  time_t now = time(NULL);\n  struct tm *t = localtime(&now);\n\n  strftime(s_day_buffer, sizeof(s_day_buffer), \"%a\", t);\n  text_layer_set_text(s_day_label, s_day_buffer);\n\n  strftime(s_num_buffer, sizeof(s_num_buffer), \"%d\", t);\n  text_layer_set_text(s_num_label, s_num_buffer);\n}\n\nstatic void handle_second_tick(struct tm *tick_time, TimeUnits units_changed) {\n  layer_mark_dirty(window_get_root_layer(window));\n}\n\nstatic void window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_bounds(window_layer);\n\n  s_simple_bg_layer = layer_create(bounds);\n  layer_set_update_proc(s_simple_bg_layer, bg_update_proc);\n  layer_add_child(window_layer, s_simple_bg_layer);\n\n  s_date_layer = layer_create(bounds);\n  layer_set_update_proc(s_date_layer, date_update_proc);\n  layer_add_child(window_layer, s_date_layer);\n\n  s_day_label = text_layer_create(GRect(46, 114, 27, 20));\n  text_layer_set_text(s_day_label, s_day_buffer);\n  text_layer_set_background_color(s_day_label, GColorBlack);\n  text_layer_set_text_color(s_day_label, GColorWhite);\n  text_layer_set_font(s_day_label, fonts_get_system_font(FONT_KEY_GOTHIC_18));\n\n  layer_add_child(s_date_layer, text_layer_get_layer(s_day_label));\n\n  s_num_label = text_layer_create(GRect(73, 114, 18, 20));\n  text_layer_set_text(s_num_label, s_num_buffer);\n  text_layer_set_background_color(s_num_label, GColorBlack);\n  text_layer_set_text_color(s_num_label, GColorWhite);\n  text_layer_set_font(s_num_label, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD));\n\n  layer_add_child(s_date_layer, text_layer_get_layer(s_num_label));\n\n  s_hands_layer = layer_create(bounds);\n  layer_set_update_proc(s_hands_layer, hands_update_proc);\n  layer_add_child(window_layer, s_hands_layer);\n}\n\nstatic void window_unload(Window *window) {\n  layer_destroy(s_simple_bg_layer);\n  layer_destroy(s_date_layer);\n\n  text_layer_destroy(s_day_label);\n  text_layer_destroy(s_num_label);\n\n  layer_destroy(s_hands_layer);\n}\n\nstatic void init() {\n  window = window_create();\n  window_set_window_handlers(window, (WindowHandlers) {\n    .load = window_load,\n    .unload = window_unload,\n  });\n  window_stack_push(window, true);\n\n  s_day_buffer[0] = '\\0';\n  s_num_buffer[0] = '\\0';\n\n  // init hand paths\n  s_minute_arrow = gpath_create(&MINUTE_HAND_POINTS);\n  s_hour_arrow = gpath_create(&HOUR_HAND_POINTS);\n\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_bounds(window_layer);\n  GPoint center = grect_center_point(&bounds);\n  gpath_move_to(s_minute_arrow, center);\n  gpath_move_to(s_hour_arrow, center);\n\n  for (int i = 0; i < NUM_CLOCK_TICKS; ++i) {\n    s_tick_paths[i] = gpath_create(&ANALOG_BG_POINTS[i]);\n  }\n\n  tick_timer_service_subscribe(SECOND_UNIT, handle_second_tick);\n}\n\nstatic void deinit() {\n  gpath_destroy(s_minute_arrow);\n  gpath_destroy(s_hour_arrow);\n\n  for (int i = 0; i < NUM_CLOCK_TICKS; ++i) {\n    gpath_destroy(s_tick_paths[i]);\n  }\n\n  tick_timer_service_unsubscribe();\n  window_destroy(window);\n}\n\nint main() {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchfaces/simple_analog/src/simple_analog.h",
    "content": "#pragma once\n\n#include \"pebble.h\"\n\n#define NUM_CLOCK_TICKS 11\n\nstatic const struct GPathInfo ANALOG_BG_POINTS[] = {\n  { 4,\n    (GPoint []) {\n      {68, 0},\n      {71, 1},\n      {71, 12},\n      {68, 12}\n    }\n  },\n  { 4, (GPoint []){\n      {72, 0},\n      {75, 0},\n      {75, 12},\n      {72, 12}\n    }\n  },\n  { 4, (GPoint []){\n      {112, 10},\n      {114, 12},\n      {108, 23},\n      {106, 21}\n    }\n  },\n  { 4, (GPoint []){\n      {132, 47},\n      {144, 40},\n      {144, 44},\n      {135, 49}\n    }\n  },\n  { 4, (GPoint []){\n      {135, 118},\n      {144, 123},\n      {144, 126},\n      {132, 120}\n    }\n  },\n  { 4, (GPoint []){\n      {108, 144},\n      {114, 154},\n      {112, 157},\n      {106, 147}\n    }\n  },\n  { 4, (GPoint []){\n      {70, 155},\n      {73, 155},\n      {73, 167},\n      {70, 167}\n    }\n  },\n  { 4, (GPoint []){\n      {32, 10},\n      {30, 12},\n      {36, 23},\n      {38, 21}\n    }\n  },\n  { 4, (GPoint []){\n      {12, 47},\n      {-1, 40},\n      {-1, 44},\n      {9, 49}\n    }\n  },\n  { 4, (GPoint []){\n      {9, 118},\n      {-1, 123},\n      {-1, 126},\n      {12, 120}\n    }\n  },\n  { 4, (GPoint []){\n      {36, 144},\n      {30, 154},\n      {32, 157},\n      {38, 147}\n    }\n  },\n\n};\n\nstatic const GPathInfo MINUTE_HAND_POINTS = {\n  3,\n  (GPoint []) {\n    { -8, 20 },\n    { 8, 20 },\n    { 0, -80 }\n  }\n};\n\nstatic const GPathInfo HOUR_HAND_POINTS = {\n  3, (GPoint []){\n    {-6, 20},\n    {6, 20},\n    {0, -60}\n  }\n};\n"
  },
  {
    "path": "watchfaces/simple_analog/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchfaces/simplicity/appinfo.json",
    "content": "{\n  \"uuid\": \"030ee5fc-518b-49e5-b9b2-0700ee92af89\",\n  \"shortName\": \"Simplicity\",\n  \"longName\": \"Simplicity\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 3,\n  \"versionLabel\": \"3.0\",\n  \"watchapp\": {\n    \"watchface\": true\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"menuIcon\": true,\n        \"type\": \"png\",\n        \"name\": \"IMAGE_MENU_ICON\",\n        \"file\": \"images/menu_icon_simplicity.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchfaces/simplicity/resources/fonts/Google Android License.txt",
    "content": "Copyright (C) 2008 The Android Open Source Project\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n  \n     http://www.apache.org/licenses/LICENSE-2.0\n  \nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n##########\n\nThis directory contains the fonts for the platform. They are licensed\nunder the Apache 2 license.\n"
  },
  {
    "path": "watchfaces/simplicity/src/simplicity.c",
    "content": "#include \"pebble.h\"\n\nstatic Window *s_main_window;\nstatic TextLayer *s_date_layer, *s_time_layer;\nstatic Layer *s_line_layer;\n\nstatic void line_layer_update_callback(Layer *layer, GContext* ctx) {\n  graphics_context_set_fill_color(ctx, GColorWhite);\n  graphics_fill_rect(ctx, layer_get_bounds(layer), 0, GCornerNone);\n}\n\nstatic void handle_minute_tick(struct tm *tick_time, TimeUnits units_changed) {\n  // Need to be static because they're used by the system later.\n  static char s_time_text[] = \"00:00\";\n  static char s_date_text[] = \"Xxxxxxxxx 00\";\n\n  strftime(s_date_text, sizeof(s_date_text), \"%B %e\", tick_time);\n  text_layer_set_text(s_date_layer, s_date_text);\n\n  char *time_format;\n  if (clock_is_24h_style()) {\n    time_format = \"%R\";\n  } else {\n    time_format = \"%I:%M\";\n  }\n  strftime(s_time_text, sizeof(s_time_text), time_format, tick_time);\n\n  // Handle lack of non-padded hour format string for twelve hour clock.\n  if (!clock_is_24h_style() && (s_time_text[0] == '0')) {\n    memmove(s_time_text, &s_time_text[1], sizeof(s_time_text) - 1);\n  }\n  text_layer_set_text(s_time_layer, s_time_text);\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n\n  s_date_layer = text_layer_create(GRect(8, 68, 136, 100));\n  text_layer_set_text_color(s_date_layer, GColorWhite);\n  text_layer_set_background_color(s_date_layer, GColorClear);\n  text_layer_set_font(s_date_layer, fonts_get_system_font(FONT_KEY_ROBOTO_CONDENSED_21));\n  layer_add_child(window_layer, text_layer_get_layer(s_date_layer));\n\n  s_time_layer = text_layer_create(GRect(7, 92, 137, 76));\n  text_layer_set_text_color(s_time_layer, GColorWhite);\n  text_layer_set_background_color(s_time_layer, GColorClear);\n  text_layer_set_font(s_time_layer, fonts_get_system_font(FONT_KEY_ROBOTO_BOLD_SUBSET_49));\n  layer_add_child(window_layer, text_layer_get_layer(s_time_layer));\n\n  GRect line_frame = GRect(8, 97, 139, 2);\n  s_line_layer = layer_create(line_frame);\n  layer_set_update_proc(s_line_layer, line_layer_update_callback);\n  layer_add_child(window_layer, s_line_layer);\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_date_layer);\n  text_layer_destroy(s_time_layer);\n\n  layer_destroy(s_line_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_background_color(s_main_window, GColorBlack);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n\n  tick_timer_service_subscribe(MINUTE_UNIT, handle_minute_tick);\n  \n  // Prevent starting blank\n  time_t now = time(NULL);\n  struct tm *t = localtime(&now);\n  handle_minute_tick(t, MINUTE_UNIT);\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n\n  tick_timer_service_unsubscribe();\n}\n\nint main() {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchfaces/simplicity/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "watchfaces/tic_tock_toe/appinfo.json",
    "content": "{\n  \"uuid\": \"51b0c5ef-f01c-43e8-b694-66d26d30c77d\",\n  \"shortName\": \"Tic Tock Toe\",\n  \"longName\": \"Tic Tock Toe\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 4,\n  \"versionLabel\": \"4.0\",\n  \"watchapp\": {\n    \"watchface\": true\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"menuIcon\": true,\n        \"type\": \"png\",\n        \"name\": \"IMAGE_MENU_ICON\",\n        \"file\": \"images/menu_icon_tic_tock_toe.png\"\n      }\n    ]\n  },\n  \"targetPlatforms\": [\n    \"aplite\",\n    \"basalt\"\n  ],\n  \"sdkVersion\": \"3\"\n}"
  },
  {
    "path": "watchfaces/tic_tock_toe/src/tic_tock_toe.c",
    "content": "#include \"pebble.h\"\n\n#define INVERT_COLORS\n\n#ifndef INVERT_COLORS\n#define COLOR_FOREGROUND GColorBlack\n#define COLOR_BACKGROUND GColorWhite\n#else\n#define COLOR_FOREGROUND GColorWhite\n#define COLOR_BACKGROUND GColorBlack\n#endif\n\n#define DRAW_WIN_LINE 10\n#define DRAW_BLANK 11\n\n//\n// Board location offsets for the move sequence arrays:\n//\n//  0 | 1 | 2\n//  3 | 4 | 5\n//  6 | 7 | 8\n//\n// Sequences of moves needed to get the specified game result\n// Each array position holds the location offset of the active player's move.\n// Currently \"Player 1\" is \"O\" and \"Player 2\" is \"X\"\nconst unsigned short SEQUENCE_FIRST_PLAYER_WINS[] = {DRAW_BLANK, 0, 8, 2, 1, 6, 3, 4, DRAW_WIN_LINE, DRAW_BLANK};\nconst unsigned short SEQUENCE_SECOND_PLAYER_WINS[] = {2, 8, 5, 6, 7, 0, 4, 3, DRAW_WIN_LINE, DRAW_BLANK};\nconst unsigned short SEQUENCE_NEITHER_PLAYER_WINS[] = {4, 2, 7, 1, 0, 8, 5, 3, 6, DRAW_BLANK};\n\ntypedef struct {\n  const unsigned short *SEQUENCE;\n  unsigned short sequence_offset;\n} GameState;\n\nstatic Window *s_main_window; \nstatic TextLayer *s_time_layer;\nstatic Layer *s_board_layer, *s_players_layer; \n\nvoid board_layer_update_callback(Layer *layer, GContext* ctx) {\n  graphics_context_set_stroke_color(ctx, COLOR_FOREGROUND);\n\n  // Vertical lines\n  graphics_draw_line(ctx, GPoint(54, 19), GPoint(54, 123));\n  graphics_draw_line(ctx, GPoint(89, 19), GPoint(89, 123));\n\n  // Horizontal lines\n  graphics_draw_line(ctx, GPoint(19, 54), GPoint(123, 54));\n  graphics_draw_line(ctx, GPoint(19, 89), GPoint(123, 89));\n}\n\nvoid graphics_draw_line_wide(GContext *ctx, GPoint p0, GPoint p1) {\n  for (int x_offset = -1; x_offset < 2; x_offset++) {\n    graphics_draw_line(ctx, GPoint(p0.x + x_offset, p0.y), GPoint(p1.x + x_offset, p1.y));\n  }\n}\n\nvoid draw_circle_player(GContext* ctx, GPoint center) {\n  graphics_context_set_fill_color(ctx, COLOR_FOREGROUND);\n  graphics_fill_circle(ctx, center, 15);\n  graphics_context_set_fill_color(ctx, COLOR_BACKGROUND);\n  graphics_fill_circle(ctx, center, 13);\n}\n\nvoid draw_cross_player(GContext* ctx, GPoint center) {\n  graphics_context_set_stroke_color(ctx, COLOR_FOREGROUND);\n  graphics_draw_line_wide(ctx, GPoint(center.x - 12, center.y - 12), GPoint(center.x+12, center.y + 12));\n  graphics_draw_line_wide(ctx, GPoint(center.x - 12, center.y + 12), GPoint(center.x+12, center.y - 12));\n}\n\nGPoint get_cell_center(unsigned int cell_offset) {\n  // Returns the centre coordinates of a cell location on the playing board.\n  const unsigned short NUM_COLUMNS = 3;\n  const unsigned short OFFSET_X = 37;\n  const unsigned short OFFSET_Y = 37;\n  const unsigned short CELL_SIZE = 35;\n\n  return GPoint( ((cell_offset % NUM_COLUMNS) * CELL_SIZE) + OFFSET_X,\n\t\t ((cell_offset / NUM_COLUMNS) * CELL_SIZE) + OFFSET_Y);\n}\n\nvoid retrieve_current_game_state(GameState *game_state) {\n  time_t now = time(NULL);\n  struct tm *current_time = localtime(&now);\n\n  // The current location in the move sequence is synced to the current time\n  // so that games end when the clock digits change.\n  game_state->sequence_offset = (current_time->tm_sec + 8) % 10;\n\n  // The game sequence we are displaying depends on which digit (i.e. hours or minutes)\n  // will change next.\n  if ((current_time->tm_sec >= 52) || (current_time->tm_sec <= 1)) {\n    // Because sequences run over the start of minutes we need to check both\n    // the current minute and the current second to know which is the correct\n    // sequence to display.\n    if (((current_time->tm_min == 59) && (current_time->tm_sec >= 52))\n\t   || ((current_time->tm_min == 0) && (current_time->tm_sec <= 1)) ) {\n      // Because it will be a new hour at the end of this time period.\n      game_state->SEQUENCE = SEQUENCE_FIRST_PLAYER_WINS;\n    } else {\n      // Because it will be a new minute at the end of this time period.\n      game_state->SEQUENCE = SEQUENCE_SECOND_PLAYER_WINS;\n    }\n  } else {\n    // Neither the minute nor hour digit will change at the end of this time period.\n    game_state->SEQUENCE = SEQUENCE_NEITHER_PLAYER_WINS;\n  }\n}\n\nvoid draw_win_line(GContext* ctx, GPoint left_most_point, GPoint right_most_point) {\n  // Make the ends of the line extend past the edges of the board.\n  if (left_most_point.x != right_most_point.x) {\n    // It's not a vertical line so adjust the X axis.\n    left_most_point.x -= 18;\n    right_most_point.x += 18;\n  }\n\n  if (left_most_point.y != right_most_point.y) {\n    // It's not a horizontal line so adjust the Y axis.\n    if (left_most_point.y < right_most_point.y) {\n      left_most_point.y -= 18;\n      right_most_point.y += 18;\n    } else {\n      left_most_point.y += 18;\n      right_most_point.y -= 18;\n    }\n  }\n\n  graphics_draw_line_wide(ctx, left_most_point, right_most_point);\n}\n\nvoid draw_game_state(GContext* ctx, const GameState game_state) {\n  // Note: Because the layer is blanked before we're called, we also need to\n  //       redraw all the player moves preceeding the current move each time\n  //       we're called.\n\n  // If we've reached the final part of the sequence don't draw anything.\n  if (game_state.SEQUENCE[game_state.sequence_offset] == DRAW_BLANK) {\n    return;\n  }\n\n  unsigned short s_active_player = 0;\n\n  for (unsigned short current_offset = 0; current_offset <= game_state.sequence_offset; current_offset++) {\n    switch (game_state.SEQUENCE[current_offset]) {\n      case DRAW_BLANK:\n        // Do nothing as a DRAW_BLANK value in a non terminal position is just\n        // padding so the sequence has the correct length.\n      \tbreak;\n      case DRAW_WIN_LINE:\n      \tif (game_state.SEQUENCE == SEQUENCE_SECOND_PLAYER_WINS) {\n      \t  draw_win_line(ctx, get_cell_center(0), get_cell_center(6));\n      \t} else { \n          // Assumes first player wins\n      \t  draw_win_line(ctx, get_cell_center(6), get_cell_center(2));\n      \t}\n      \tbreak;\n      default: {\n      \t// The value is a cell location offset.\n      \t// Draw the marker for the current player who is active in this turn.\n        (s_active_player ? draw_cross_player : draw_circle_player)(ctx, get_cell_center(game_state.SEQUENCE[current_offset]));\n        s_active_player = (s_active_player + 1) % 2;\n      \tbreak;\n      }\n    }\n  }\n}\n\nvoid players_layer_update_callback(Layer *layer, GContext* ctx) {\n#ifdef INVERT_COLORS\n  graphics_context_set_compositing_mode(ctx, GCompOpAssignInverted);\n#endif\n\n  GameState game_state;\n  retrieve_current_game_state(&game_state);\n  draw_game_state(ctx, game_state);\n}\n\nvoid update_time_text() {\n  time_t now = time(NULL);\n  const struct tm *current_time = localtime(&now);\n  \n  char *time_format;\n  if (clock_is_24h_style()) {\n    time_format = \"%R\";\n  } else {\n    time_format = \"%I:%M\";\n  }\n\n  static char s_time_text[] = \"00:00\";\n  strftime(s_time_text, sizeof(s_time_text), time_format, current_time);\n\n  // Handle lack of non-padded hour format string for twelve hour clock.\n  if (!clock_is_24h_style() && (s_time_text[0] == '0')) {\n    memmove(s_time_text, &s_time_text[1], sizeof(s_time_text) - 1);\n  }\n  text_layer_set_text(s_time_layer, s_time_text);\n\n  layer_mark_dirty(s_players_layer);\n}\n\nstatic void handle_second_tick(struct tm *tick_time, TimeUnits units_changed) {\n  update_time_text();\n}\n\nstatic void main_window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n  GRect bounds = layer_get_bounds(window_layer);\n  \n  // Init the layer that shows the board\n  s_board_layer = layer_create(bounds); \n  layer_set_update_proc(s_board_layer, board_layer_update_callback); \n  layer_add_child(window_layer, s_board_layer);\n\n  // Init the layer that shows the player marks\n  s_players_layer = layer_create(bounds);\n  layer_set_update_proc(s_players_layer, players_layer_update_callback);\n  layer_add_child(window_layer, s_players_layer);\n\n  // Init the text layer used to show the time\n  s_time_layer = text_layer_create(GRect(0, 126, 144, 42));\n  text_layer_set_text_alignment(s_time_layer, GTextAlignmentCenter);\n  text_layer_set_text_color(s_time_layer, COLOR_FOREGROUND);\n  text_layer_set_background_color(s_time_layer, GColorClear);\n  text_layer_set_font(s_time_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));\n  layer_add_child(window_layer, text_layer_get_layer(s_time_layer));\n}\n\nstatic void main_window_unload(Window *window) {\n  text_layer_destroy(s_time_layer);\n\n  layer_destroy(s_board_layer);\n  layer_destroy(s_players_layer);\n}\n\nstatic void init() {\n  s_main_window = window_create();\n  window_set_background_color(s_main_window, COLOR_BACKGROUND);\n  window_set_window_handlers(s_main_window, (WindowHandlers) {\n    .load = main_window_load,\n    .unload = main_window_unload,\n  });\n  window_stack_push(s_main_window, true);\n\n  tick_timer_service_subscribe(SECOND_UNIT, handle_second_tick);\n\n  update_time_text();\n}\n\nstatic void deinit() {\n  window_destroy(s_main_window);\n}\n\nint main() {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "watchfaces/tic_tock_toe/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\nimport os.path\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    build_worker = os.path.exists('worker_src')\n    binaries = []\n\n    for p in ctx.env.TARGET_PLATFORMS:\n        ctx.set_env(ctx.all_envs[p])\n        app_elf='{}/pebble-app.elf'.format(ctx.env.BUILD_DIR)\n        ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n        target=app_elf)\n\n        if build_worker:\n            worker_elf='{}/pebble-worker.elf'.format(ctx.env.BUILD_DIR)\n            binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf})\n            ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'),\n            target=worker_elf)\n        else:\n            binaries.append({'platform': p, 'app_elf': app_elf})\n\n    ctx.pbl_bundle(binaries=binaries, js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/.classpath",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<classpath>\n\t<classpathentry kind=\"src\" path=\"src\"/>\n\t<classpathentry kind=\"src\" path=\"gen\"/>\n\t<classpathentry kind=\"con\" path=\"com.android.ide.eclipse.adt.ANDROID_FRAMEWORK\"/>\n\t<classpathentry kind=\"con\" path=\"com.android.ide.eclipse.adt.LIBRARIES\"/>\n\t<classpathentry kind=\"output\" path=\"bin/classes\"/>\n</classpath>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/.gradle/1.12/taskArtifacts/cache.properties",
    "content": "#Sun Sep 07 01:51:21 PDT 2014\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/.idea/.name",
    "content": "WeatherDemo-Android"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/.idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <option name=\"DEFAULT_COMPILER\" value=\"Javac\" />\n    <resourceExtensions />\n    <wildcardResourcePatterns>\n      <entry name=\"!?*.java\" />\n      <entry name=\"!?*.form\" />\n      <entry name=\"!?*.class\" />\n      <entry name=\"!?*.groovy\" />\n      <entry name=\"!?*.scala\" />\n      <entry name=\"!?*.flex\" />\n      <entry name=\"!?*.kt\" />\n      <entry name=\"!?*.clj\" />\n    </wildcardResourcePatterns>\n    <annotationProcessing>\n      <profile default=\"true\" name=\"Default\" enabled=\"false\">\n        <processorPath useClasspath=\"true\" />\n      </profile>\n    </annotationProcessing>\n  </component>\n</project>\n\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/.idea/copyright/profiles_settings.xml",
    "content": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/.idea/encodings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\" useUTFGuessing=\"true\" native2AsciiForPropertiesFiles=\"false\" />\n</project>\n\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/.idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"gradleHome\" value=\"/usr/local/bin/gradle\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n          </set>\n        </option>\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>\n\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/.idea/libraries/guava_14_0_1.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"guava-14.0.1\">\n    <CLASSES>\n      <root url=\"jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/14.0.1/69e12f4c6aeac392555f1ea86fab82b5e5e31ad4/guava-14.0.1.jar!/\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES>\n      <root url=\"jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/14.0.1/169f11e28e3ed9a64e9fa895eaafb579e6a5aa6c/guava-14.0.1-sources.jar!/\" />\n    </SOURCES>\n  </library>\n</component>"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/.idea/libraries/pebblekit_2_5_0.xml",
    "content": "<component name=\"libraryTable\">\n  <library name=\"pebblekit-2.5.0\">\n    <CLASSES>\n      <root url=\"jar://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.getpebble/pebblekit/2.5.0/classes.jar!/\" />\n      <root url=\"file://$PROJECT_DIR$/app/build/intermediates/exploded-aar/com.getpebble/pebblekit/2.5.0/res\" />\n    </CLASSES>\n    <JAVADOC />\n    <SOURCES />\n  </library>\n</component>"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/.idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"DaemonCodeAnalyzer\">\n    <disable_hints />\n  </component>\n  <component name=\"ProjectLevelVcsManager\" settingsEditedManually=\"false\">\n    <OptionsSetting value=\"true\" id=\"Add\" />\n    <OptionsSetting value=\"true\" id=\"Remove\" />\n    <OptionsSetting value=\"true\" id=\"Checkout\" />\n    <OptionsSetting value=\"true\" id=\"Update\" />\n    <OptionsSetting value=\"true\" id=\"Status\" />\n    <OptionsSetting value=\"true\" id=\"Edit\" />\n    <ConfirmationsSetting value=\"0\" id=\"Add\" />\n    <ConfirmationsSetting value=\"0\" id=\"Remove\" />\n  </component>\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_1_6\" assert-keyword=\"true\" jdk-15=\"true\" project-jdk-name=\"JDK\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"RunManager\">\n    <configuration default=\"true\" type=\"Remote\" factoryName=\"Remote\">\n      <option name=\"USE_SOCKET_TRANSPORT\" value=\"true\" />\n      <option name=\"SERVER_MODE\" value=\"false\" />\n      <option name=\"SHMEM_ADDRESS\" value=\"javadebug\" />\n      <option name=\"HOST\" value=\"localhost\" />\n      <option name=\"PORT\" value=\"5005\" />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"Applet\" factoryName=\"Applet\">\n      <module name=\"\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"HTML_FILE_NAME\" />\n      <option name=\"HTML_USED\" value=\"false\" />\n      <option name=\"WIDTH\" value=\"400\" />\n      <option name=\"HEIGHT\" value=\"300\" />\n      <option name=\"POLICY_FILE\" value=\"$APPLICATION_HOME_DIR$/bin/appletviewer.policy\" />\n      <option name=\"VM_PARAMETERS\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"TestNG\" factoryName=\"TestNG\">\n      <module name=\"\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"SUITE_NAME\" />\n      <option name=\"PACKAGE_NAME\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"METHOD_NAME\" />\n      <option name=\"GROUP_NAME\" />\n      <option name=\"TEST_OBJECT\" value=\"CLASS\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$PROJECT_DIR$\" />\n      <option name=\"OUTPUT_DIRECTORY\" />\n      <option name=\"ANNOTATION_TYPE\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"moduleWithDependencies\" />\n      </option>\n      <option name=\"USE_DEFAULT_REPORTERS\" value=\"false\" />\n      <option name=\"PROPERTIES_FILE\" />\n      <envs />\n      <properties />\n      <listeners />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"Application\" factoryName=\"Application\">\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"VM_PARAMETERS\" />\n      <option name=\"PROGRAM_PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$PROJECT_DIR$\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"ENABLE_SWING_INSPECTOR\" value=\"false\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <module name=\"\" />\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"JUnit\" factoryName=\"JUnit\">\n      <module name=\"\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"PACKAGE_NAME\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"METHOD_NAME\" />\n      <option name=\"TEST_OBJECT\" value=\"class\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$PROJECT_DIR$\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"moduleWithDependencies\" />\n      </option>\n      <envs />\n      <patterns />\n      <method />\n    </configuration>\n    <list size=\"0\" />\n    <configuration name=\"&lt;template&gt;\" type=\"#org.jetbrains.idea.devkit.run.PluginConfigurationType\" default=\"true\" selected=\"false\">\n      <option name=\"VM_PARAMETERS\" value=\"-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea\" />\n    </configuration>\n    <configuration name=\"&lt;template&gt;\" type=\"WebApp\" default=\"true\" selected=\"false\">\n      <Host>localhost</Host>\n      <Port>5050</Port>\n    </configuration>\n  </component>\n  <component name=\"masterDetails\">\n    <states>\n      <state key=\"ProjectJDKs.UI\">\n        <settings>\n          <last-edited>Android API 14 Platform</last-edited>\n          <splitter-proportions>\n            <option name=\"proportions\">\n              <list>\n                <option value=\"0.2\" />\n              </list>\n            </option>\n          </splitter-proportions>\n        </settings>\n      </state>\n    </states>\n  </component>\n</project>\n\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/.idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/WeatherDemo-Android.iml\" filepath=\"$PROJECT_DIR$/WeatherDemo-Android.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/app/app.iml\" filepath=\"$PROJECT_DIR$/app/app.iml\" />\n    </modules>\n  </component>\n</project>\n\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/.idea/scopes/scope_settings.xml",
    "content": "<component name=\"DependencyValidationManager\">\n  <state>\n    <option name=\"SKIP_IMPORT_STATEMENTS\" value=\"false\" />\n  </state>\n</component>"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/.idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"\" vcs=\"\" />\n    <mapping directory=\"$PROJECT_DIR$/../..\" vcs=\"Git\" />\n  </component>\n</project>\n\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/.idea/workspace.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ChangeListManager\">\n    <list default=\"true\" id=\"210c3ae9-616a-4bee-ad59-44d578e78cdb\" name=\"Default\" comment=\"\">\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/app.iml\" afterPath=\"$PROJECT_DIR$/app/app.iml\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/.idea/misc.xml\" afterPath=\"$PROJECT_DIR$/.idea/misc.xml\" />\n    </list>\n    <ignored path=\"WeatherDemo-Android.iws\" />\n    <ignored path=\".idea/workspace.xml\" />\n    <option name=\"TRACKING_ENABLED\" value=\"true\" />\n    <option name=\"SHOW_DIALOG\" value=\"false\" />\n    <option name=\"HIGHLIGHT_CONFLICTS\" value=\"true\" />\n    <option name=\"HIGHLIGHT_NON_ACTIVE_CHANGELIST\" value=\"false\" />\n    <option name=\"LAST_RESOLUTION\" value=\"IGNORE\" />\n  </component>\n  <component name=\"ChangesViewManager\" flattened_view=\"true\" show_ignored=\"false\" />\n  <component name=\"CreatePatchCommitExecutor\">\n    <option name=\"PATCH_PATH\" value=\"\" />\n  </component>\n  <component name=\"DaemonCodeAnalyzer\">\n    <disable_hints />\n  </component>\n  <component name=\"ExecutionTargetManager\" SELECTED_TARGET=\"default_target\" />\n  <component name=\"FavoritesManager\">\n    <favorites_list name=\"WeatherDemo-Android\" />\n  </component>\n  <component name=\"Git.Settings\">\n    <option name=\"RECENT_GIT_ROOT_PATH\" value=\"$PROJECT_DIR$/../..\" />\n  </component>\n  <component name=\"GradleLocalSettings\">\n    <option name=\"tasksExpandState\">\n      <map>\n        <entry key=\"\" value=\"true\" />\n      </map>\n    </option>\n    <option name=\"availableProjects\">\n      <map>\n        <entry>\n          <key>\n            <ExternalProjectPojo>\n              <option name=\"name\" value=\"WeatherDemo-Android\" />\n              <option name=\"path\" value=\"$PROJECT_DIR$\" />\n            </ExternalProjectPojo>\n          </key>\n          <value>\n            <list>\n              <ExternalProjectPojo>\n                <option name=\"name\" value=\":app\" />\n                <option name=\"path\" value=\"$PROJECT_DIR$/app\" />\n              </ExternalProjectPojo>\n              <ExternalProjectPojo>\n                <option name=\"name\" value=\"WeatherDemo-Android\" />\n                <option name=\"path\" value=\"$PROJECT_DIR$\" />\n              </ExternalProjectPojo>\n            </list>\n          </value>\n        </entry>\n      </map>\n    </option>\n    <option name=\"availableTasks\">\n      <map>\n        <entry key=\"$PROJECT_DIR$/app\">\n          <value>\n            <list>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the Android dependencies of the project\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"androidDependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles all variants of all applications and secondary packages.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"assemble\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles all Debug builds\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"assembleDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles the Test build for the Debug build\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"assembleDebugTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles all Release builds\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"assembleRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles and tests this project.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"build\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles and tests this project and all projects that depend on it.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"buildDependents\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles and tests this project and all projects it depends on.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"buildNeeded\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs all checks.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"check\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"checkDebugManifest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"checkReleaseManifest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Deletes the build directory.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"clean\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugAidl\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugJava\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugNdk\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugRenderscript\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugTestAidl\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugTestJava\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugTestNdk\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugTestRenderscript\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileLint\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileReleaseAidl\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileReleaseJava\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileReleaseNdk\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileReleaseRenderscript\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Installs and runs the tests for Build 'debug' on connected devices.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"connectedAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs all device checks on currently connected devices.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"connectedCheck\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs all device checks using Device Providers and Test Servers.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"deviceCheck\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"dexDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"dexDebugTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"dexRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugBuildConfig\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugResValues\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugTestAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugTestBuildConfig\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugTestResValues\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugTestResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugTestSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateReleaseAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateReleaseBuildConfig\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateReleaseResValues\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateReleaseResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateReleaseSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Installs the Debug build\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"installDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Installs the Test build for the Debug build\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"installDebugTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs lint on all variants.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"lint\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs lint on the Debug build\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"lintDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs lint on the Release build\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"lintRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs lint on just the fatal issues in the Release build\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"lintVitalRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeDebugAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeDebugResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeDebugTestAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeDebugTestResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeReleaseAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeReleaseResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"packageDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"packageDebugTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"packageRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"preBuild\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"preDebugBuild\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"preDebugTestBuild\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"preDexDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"preDexDebugTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"preDexRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"preReleaseBuild\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Prepare com.getpebble:pebblekit:2.5.0\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prepareComGetpebblePebblekit250Library\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prepareDebugDependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prepareDebugTestDependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prepareReleaseDependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processDebugJavaRes\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processDebugManifest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processDebugResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processDebugTestJavaRes\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processDebugTestManifest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processDebugTestResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processReleaseJavaRes\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processReleaseManifest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processReleaseResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the signing info for each variant\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"signingReport\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Uninstall all applications.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"uninstallAll\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Uninstalls the Debug build\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"uninstallDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Uninstalls the Test build for the Debug build\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"uninstallDebugTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Uninstalls the Release build\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"uninstallRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"validateDebugSigning\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"zipalignDebug\" />\n              </ExternalTaskPojo>\n            </list>\n          </value>\n        </entry>\n      </map>\n    </option>\n    <option name=\"modificationStamps\">\n      <map>\n        <entry key=\"$PROJECT_DIR$\" value=\"4230227526000\" />\n      </map>\n    </option>\n    <option name=\"projectBuildClasspath\">\n      <map>\n        <entry key=\"$PROJECT_DIR$\">\n          <value>\n            <ExternalProjectBuildClasspathPojo>\n              <option name=\"modulesBuildClasspath\">\n                <map>\n                  <entry key=\"$PROJECT_DIR$\">\n                    <value>\n                      <ExternalModuleBuildClasspathPojo>\n                        <option name=\"entries\">\n                          <list>\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/gradle/0.12.2/6d4cfb0cfbda5e9d20bc424412c4b9ec9f4a19e7/gradle-0.12.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/gradle/0.12.2/786baefe9fc55777558acbba1bc1d9c6ec0925a8/gradle-0.12.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.proguard/proguard-base/4.11/d0b8cbe4419385f72f3d31b39888edfcb10210df/proguard-base-4.11-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.proguard/proguard-base/4.11/76730af417bb42da22b16e49f49e67863382b9bd/proguard-base-4.11.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.proguard/proguard-gradle/4.11/1d80d5ed2daa1a3a2b6e7a45b40fd36ffed78f2b/proguard-gradle-4.11-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.proguard/proguard-gradle/4.11/da875d4b67a8be6c770b11d894434843714ac69d/proguard-gradle-4.11.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.eclipse.jdt.core.compiler/ecj/4.2.2/fb9dc21349d06dd00b395af5c42f299df828f9da/ecj-4.2.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.eclipse.jdt.core.compiler/ecj/4.2.2/d9fd79499c664bccaf24dbe04be417de6c6af64a/ecj-4.2.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.1/1fdf61e5ba87e0e4676c22677e0b2fe3a05c2fd8/httpcore-4.1-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.1/33fc26c02f8043ab0ede19eadc8c9885386b255c/httpcore-4.1.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.1.1/f3f156cbff0e0fb0d64bfce31a352cce4a33bc19/commons-logging-1.1.1-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.1.1/5043bfebc3db072ed80fbd362e7caf00e885d8ae/commons-logging-1.1.1.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.4/5310da9f90e843883309e9e0bf5950faa79882a0/commons-codec-1.4-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.4/4216af16d38465bbab0f3dff8efa14204f7a399a/commons-codec-1.4.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.1.1/42f6189003f355107f53b937770092517de69710/httpclient-4.1.1-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.1.1/3d1d918f32709e33ba7ddb2c4e8d1c543ebe713e/httpclient-4.1.1.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/15.0/36b6a585c0f0c63bd85fb04db0dcb7b217298956/guava-15.0-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/15.0/ed727a8d9f247e2050281cb083f1c77b09dcb5cd/guava-15.0.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/common/23.0.2/1ce8cf32b730a69e4f9b16c0078442143df309ee/common-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/common/23.0.2/4d5ff345915e0af52765039b75adce89fae798af/common-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.kxml/kxml2/2.3.0/309cd2cff7260e465792fda3dcbb063b730d8050/kxml2-2.3.0-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.kxml/kxml2/2.3.0/ccbc77a5fd907ef863c29f3596c6f54ffa4e9442/kxml2-2.3.0.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.layoutlib/layoutlib-api/23.0.2/5a2bb46f7417e36db4d749d75feadc1cdb517154/layoutlib-api-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.layoutlib/layoutlib-api/23.0.2/d97fb910dafd7b29bdff95296dcd2649fadef02e/layoutlib-api-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpmime/4.1/3ac83213baeab2b21fde6c0bf47ed68ea3e6a8da/httpmime-4.1-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpmime/4.1/9ba2dcdf94ce35c8a8e9bff242db0618ca932e92/httpmime-4.1.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/dvlib/23.0.2/adbb63f74ac78ebd587129013401f64b2506e293/dvlib-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/dvlib/23.0.2/e37720cb9d7e2775a4b8b22b12bbb4bb9187c8bf/dvlib-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.8.1/3caea4421428752206c7a94c3e3097f0c47f1bb8/commons-compress-1.8.1-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.8.1/a698750c16740fd5b3871425f4cb3bbaa87f529d/commons-compress-1.8.1.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/sdklib/23.0.2/e24a72b4b0d19e23c95b716e69334df2fe576dbb/sdklib-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/sdklib/23.0.2/74dc50f859e787a548641d613a04ce2a7cf48bee/sdklib-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/sdk-common/23.0.2/1bdeba66c61698c8307461eab429e784f8836196/sdk-common-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/sdk-common/23.0.2/ec49e38e6c2ae9d7003f7836fe865b39aeba77fe/sdk-common-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder-model/0.12.2/86cd9891a57490ae5e8b7f6fbcd2f6d3c8b7ea3f/builder-model-0.12.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder-model/0.12.2/ea4eff69bb86efd0e6b2055ba0b3314779033be6/builder-model-0.12.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/4.0/4a33d6206d6d442446a8edbd2b0798ecfaebc229/asm-4.0-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/4.0/659add6efc75a4715d738e73f07505246edf4d66/asm-4.0.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.external.lombok/lombok-ast/0.2.2/47ebe619db7def288aad08bd65d26eea6d67f8ee/lombok-ast-0.2.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.external.lombok/lombok-ast/0.2.2/57e560b535ceaa14fb6f15422d74594acd6c5b64/lombok-ast-0.2.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/4.0/4a33d6206d6d442446a8edbd2b0798ecfaebc229/asm-tree-4.0-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/4.0/67bd266cd17adcee486b76952ece4cc85fe248b8/asm-tree-4.0.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint-api/23.0.2/d757652f175aa0915531af75c4948a4d546610a7/lint-api-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint-api/23.0.2/9660c0f32f9308dd2ac998f4928cebcd4095b27/lint-api-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/4.0/4a33d6206d6d442446a8edbd2b0798ecfaebc229/asm-analysis-4.0-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/4.0/1c45d52b6f6c638db13cf3ac12adeb56b254cdd7/asm-analysis-4.0.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint-checks/23.0.2/9c99007fa60eac2651c6a73263e0f0f555ef0983/lint-checks-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint-checks/23.0.2/e6fe7bac82c4845d3e69e0dd54b1801a91568ffd/lint-checks-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint/23.0.2/c36565dd9bfbb64d2492a41c83bae573da7a5274/lint-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint/23.0.2/e247d675952dd9f24f6b064bac3d7d1639d0043e/lint-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.ddms/ddmlib/23.0.2/c8fef789d4495cd50ba2fd974ee1cd3dec24b90c/ddmlib-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.ddms/ddmlib/23.0.2/3e454a33c6790eb497c725f346cd2b80cb67ff6d/ddmlib-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/manifest-merger/23.0.2/a81cbf40d2b0fa03e1a34ccd2713a2c6bfc48aea/manifest-merger-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/manifest-merger/23.0.2/93c8f86db4a5ad8e8f034c672b85594326268a9c/manifest-merger-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder-test-api/0.12.2/e768f7c2024a6673883b78e4f645e5e5e599c2d8/builder-test-api-0.12.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder-test-api/0.12.2/a7f31faaee3de23ba810c109abc1658715f4416d/builder-test-api-0.12.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup/javawriter/2.5.0/1b2a0925ff06220c0261b6fd468183cd9e9a9a47/javawriter-2.5.0-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup/javawriter/2.5.0/81241ff7078ef14f42ea2a8995fa09c096256e6b/javawriter-2.5.0.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.bouncycastle/bcprov-jdk15on/1.48/3824866f059053c43b118eb5a067ea1800d8c913/bcprov-jdk15on-1.48-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.bouncycastle/bcprov-jdk15on/1.48/960dea7c9181ba0b17e8bab0c06a43f0a5f04e65/bcprov-jdk15on-1.48.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.bouncycastle/bcpkix-jdk15on/1.48/8cff777fce5ef53cc35fa569faa8d12faaf34a78/bcpkix-jdk15on-1.48-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.bouncycastle/bcpkix-jdk15on/1.48/28b7614b908a47844bb27e3c94b45b6893656265/bcpkix-jdk15on-1.48.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder/0.12.2/cbbbe556e0103ceb734ac7a269ecb9a9e2f33d4c/builder-0.12.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder/0.12.2/3673e1c415b054caccc3231dcdff959cfcb315f6/builder-0.12.2.jar\" />\n                          </list>\n                        </option>\n                        <option name=\"path\" value=\"$PROJECT_DIR$\" />\n                      </ExternalModuleBuildClasspathPojo>\n                    </value>\n                  </entry>\n                  <entry key=\"$PROJECT_DIR$/app\">\n                    <value>\n                      <ExternalModuleBuildClasspathPojo>\n                        <option name=\"entries\">\n                          <list>\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/gradle/0.12.2/6d4cfb0cfbda5e9d20bc424412c4b9ec9f4a19e7/gradle-0.12.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/gradle/0.12.2/786baefe9fc55777558acbba1bc1d9c6ec0925a8/gradle-0.12.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.proguard/proguard-base/4.11/d0b8cbe4419385f72f3d31b39888edfcb10210df/proguard-base-4.11-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.proguard/proguard-base/4.11/76730af417bb42da22b16e49f49e67863382b9bd/proguard-base-4.11.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.proguard/proguard-gradle/4.11/1d80d5ed2daa1a3a2b6e7a45b40fd36ffed78f2b/proguard-gradle-4.11-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.proguard/proguard-gradle/4.11/da875d4b67a8be6c770b11d894434843714ac69d/proguard-gradle-4.11.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.eclipse.jdt.core.compiler/ecj/4.2.2/fb9dc21349d06dd00b395af5c42f299df828f9da/ecj-4.2.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.eclipse.jdt.core.compiler/ecj/4.2.2/d9fd79499c664bccaf24dbe04be417de6c6af64a/ecj-4.2.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.1/1fdf61e5ba87e0e4676c22677e0b2fe3a05c2fd8/httpcore-4.1-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.1/33fc26c02f8043ab0ede19eadc8c9885386b255c/httpcore-4.1.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.1.1/f3f156cbff0e0fb0d64bfce31a352cce4a33bc19/commons-logging-1.1.1-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.1.1/5043bfebc3db072ed80fbd362e7caf00e885d8ae/commons-logging-1.1.1.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.4/5310da9f90e843883309e9e0bf5950faa79882a0/commons-codec-1.4-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.4/4216af16d38465bbab0f3dff8efa14204f7a399a/commons-codec-1.4.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.1.1/42f6189003f355107f53b937770092517de69710/httpclient-4.1.1-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.1.1/3d1d918f32709e33ba7ddb2c4e8d1c543ebe713e/httpclient-4.1.1.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/15.0/36b6a585c0f0c63bd85fb04db0dcb7b217298956/guava-15.0-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/15.0/ed727a8d9f247e2050281cb083f1c77b09dcb5cd/guava-15.0.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/common/23.0.2/1ce8cf32b730a69e4f9b16c0078442143df309ee/common-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/common/23.0.2/4d5ff345915e0af52765039b75adce89fae798af/common-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.kxml/kxml2/2.3.0/309cd2cff7260e465792fda3dcbb063b730d8050/kxml2-2.3.0-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.sf.kxml/kxml2/2.3.0/ccbc77a5fd907ef863c29f3596c6f54ffa4e9442/kxml2-2.3.0.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.layoutlib/layoutlib-api/23.0.2/5a2bb46f7417e36db4d749d75feadc1cdb517154/layoutlib-api-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.layoutlib/layoutlib-api/23.0.2/d97fb910dafd7b29bdff95296dcd2649fadef02e/layoutlib-api-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpmime/4.1/3ac83213baeab2b21fde6c0bf47ed68ea3e6a8da/httpmime-4.1-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpmime/4.1/9ba2dcdf94ce35c8a8e9bff242db0618ca932e92/httpmime-4.1.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/dvlib/23.0.2/adbb63f74ac78ebd587129013401f64b2506e293/dvlib-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/dvlib/23.0.2/e37720cb9d7e2775a4b8b22b12bbb4bb9187c8bf/dvlib-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.8.1/3caea4421428752206c7a94c3e3097f0c47f1bb8/commons-compress-1.8.1-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.8.1/a698750c16740fd5b3871425f4cb3bbaa87f529d/commons-compress-1.8.1.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/sdklib/23.0.2/e24a72b4b0d19e23c95b716e69334df2fe576dbb/sdklib-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/sdklib/23.0.2/74dc50f859e787a548641d613a04ce2a7cf48bee/sdklib-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/sdk-common/23.0.2/1bdeba66c61698c8307461eab429e784f8836196/sdk-common-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools/sdk-common/23.0.2/ec49e38e6c2ae9d7003f7836fe865b39aeba77fe/sdk-common-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder-model/0.12.2/86cd9891a57490ae5e8b7f6fbcd2f6d3c8b7ea3f/builder-model-0.12.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder-model/0.12.2/ea4eff69bb86efd0e6b2055ba0b3314779033be6/builder-model-0.12.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/4.0/4a33d6206d6d442446a8edbd2b0798ecfaebc229/asm-4.0-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/4.0/659add6efc75a4715d738e73f07505246edf4d66/asm-4.0.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.external.lombok/lombok-ast/0.2.2/47ebe619db7def288aad08bd65d26eea6d67f8ee/lombok-ast-0.2.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.external.lombok/lombok-ast/0.2.2/57e560b535ceaa14fb6f15422d74594acd6c5b64/lombok-ast-0.2.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/4.0/4a33d6206d6d442446a8edbd2b0798ecfaebc229/asm-tree-4.0-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/4.0/67bd266cd17adcee486b76952ece4cc85fe248b8/asm-tree-4.0.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint-api/23.0.2/d757652f175aa0915531af75c4948a4d546610a7/lint-api-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint-api/23.0.2/9660c0f32f9308dd2ac998f4928cebcd4095b27/lint-api-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/4.0/4a33d6206d6d442446a8edbd2b0798ecfaebc229/asm-analysis-4.0-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/4.0/1c45d52b6f6c638db13cf3ac12adeb56b254cdd7/asm-analysis-4.0.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint-checks/23.0.2/9c99007fa60eac2651c6a73263e0f0f555ef0983/lint-checks-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint-checks/23.0.2/e6fe7bac82c4845d3e69e0dd54b1801a91568ffd/lint-checks-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint/23.0.2/c36565dd9bfbb64d2492a41c83bae573da7a5274/lint-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint/23.0.2/e247d675952dd9f24f6b064bac3d7d1639d0043e/lint-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.ddms/ddmlib/23.0.2/c8fef789d4495cd50ba2fd974ee1cd3dec24b90c/ddmlib-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.ddms/ddmlib/23.0.2/3e454a33c6790eb497c725f346cd2b80cb67ff6d/ddmlib-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/manifest-merger/23.0.2/a81cbf40d2b0fa03e1a34ccd2713a2c6bfc48aea/manifest-merger-23.0.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/manifest-merger/23.0.2/93c8f86db4a5ad8e8f034c672b85594326268a9c/manifest-merger-23.0.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder-test-api/0.12.2/e768f7c2024a6673883b78e4f645e5e5e599c2d8/builder-test-api-0.12.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder-test-api/0.12.2/a7f31faaee3de23ba810c109abc1658715f4416d/builder-test-api-0.12.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup/javawriter/2.5.0/1b2a0925ff06220c0261b6fd468183cd9e9a9a47/javawriter-2.5.0-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup/javawriter/2.5.0/81241ff7078ef14f42ea2a8995fa09c096256e6b/javawriter-2.5.0.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.bouncycastle/bcprov-jdk15on/1.48/3824866f059053c43b118eb5a067ea1800d8c913/bcprov-jdk15on-1.48-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.bouncycastle/bcprov-jdk15on/1.48/960dea7c9181ba0b17e8bab0c06a43f0a5f04e65/bcprov-jdk15on-1.48.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.bouncycastle/bcpkix-jdk15on/1.48/8cff777fce5ef53cc35fa569faa8d12faaf34a78/bcpkix-jdk15on-1.48-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.bouncycastle/bcpkix-jdk15on/1.48/28b7614b908a47844bb27e3c94b45b6893656265/bcpkix-jdk15on-1.48.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder/0.12.2/cbbbe556e0103ceb734ac7a269ecb9a9e2f33d4c/builder-0.12.2-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.android.tools.build/builder/0.12.2/3673e1c415b054caccc3231dcdff959cfcb315f6/builder-0.12.2.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.getpebble/pebblekit/2.5.0/5a14860fa5170babbf82f640d714b1c22bba1f24/pebblekit-2.5.0-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.getpebble/pebblekit/2.5.0/d0df1e3d1a2c5fb0d80d6eabe2bc459b373ce60f/pebblekit-2.5.0.aar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/14.0.1/169f11e28e3ed9a64e9fa895eaafb579e6a5aa6c/guava-14.0.1-sources.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/14.0.1/69e12f4c6aeac392555f1ea86fab82b5e5e31ad4/guava-14.0.1.jar\" />\n                          </list>\n                        </option>\n                        <option name=\"path\" value=\"$PROJECT_DIR$/app\" />\n                      </ExternalModuleBuildClasspathPojo>\n                    </value>\n                  </entry>\n                </map>\n              </option>\n              <option name=\"name\" value=\"app\" />\n              <option name=\"projectBuildClasspath\">\n                <list>\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/announce\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/antlr\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/base-services\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/base-services-groovy\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/build-comparison\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/build-init\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/cli\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/code-quality\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/core\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/core-impl\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/cpp\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/diagnostics\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/ear\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/ide\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/internal-integ-testing\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/internal-testing\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/ivy\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/jacoco\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/javascript\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/jetty\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/language-base\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/language-jvm\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/launcher\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/maven\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/messaging\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/native\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/open-api\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/osgi\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/plugins\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/publish\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/reporting\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/resources\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/scala\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/signing\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/sonar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/tooling-api\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/ui\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/src/wrapper\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/ant-1.9.3.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/ant-launcher-1.9.3.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/gradle-base-services-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/gradle-base-services-groovy-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/gradle-cli-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/gradle-core-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/gradle-docs-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/gradle-launcher-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/gradle-messaging-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/gradle-native-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/gradle-open-api-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/gradle-resources-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/gradle-tooling-api-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/gradle-ui-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/gradle-wrapper-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/groovy-all-1.8.6.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/ivy-2.2.0.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/ant-antlr-1.9.3.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-announce-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-antlr-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-build-comparison-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-build-init-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-code-quality-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-core-impl-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-cpp-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-diagnostics-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-ear-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-ide-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-ivy-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-jacoco-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-javascript-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-jetty-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-language-base-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-language-jvm-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-maven-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-osgi-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-plugins-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-publish-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-reporting-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-scala-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-signing-1.12.jar\" />\n                  <option value=\"$USER_HOME$/.gradle/wrapper/dists/gradle-1.12-all/2apkk7d25miauqf1pdjp1bm0uo/gradle-1.12/lib/plugins/gradle-sonar-1.12.jar\" />\n                  <option value=\"$PROJECT_DIR$/buildSrc/src/main/java\" />\n                  <option value=\"$PROJECT_DIR$/buildSrc/src/main/groovy\" />\n                </list>\n              </option>\n            </ExternalProjectBuildClasspathPojo>\n          </value>\n        </entry>\n      </map>\n    </option>\n  </component>\n  <component name=\"ProjectFrameBounds\">\n    <option name=\"x\" value=\"20\" />\n    <option name=\"y\" value=\"22\" />\n    <option name=\"width\" value=\"1400\" />\n    <option name=\"height\" value=\"819\" />\n  </component>\n  <component name=\"ProjectLevelVcsManager\" settingsEditedManually=\"false\">\n    <OptionsSetting value=\"true\" id=\"Add\" />\n    <OptionsSetting value=\"true\" id=\"Remove\" />\n    <OptionsSetting value=\"true\" id=\"Checkout\" />\n    <OptionsSetting value=\"true\" id=\"Update\" />\n    <OptionsSetting value=\"true\" id=\"Status\" />\n    <OptionsSetting value=\"true\" id=\"Edit\" />\n    <ConfirmationsSetting value=\"0\" id=\"Add\" />\n    <ConfirmationsSetting value=\"0\" id=\"Remove\" />\n  </component>\n  <component name=\"ProjectReloadState\">\n    <option name=\"STATE\" value=\"0\" />\n  </component>\n  <component name=\"ProjectView\">\n    <navigator proportions=\"\" version=\"1\">\n      <flattenPackages />\n      <showMembers />\n      <showModules />\n      <showLibraryContents />\n      <hideEmptyPackages />\n      <abbreviatePackageNames />\n      <autoscrollToSource />\n      <autoscrollFromSource />\n      <sortByType />\n    </navigator>\n    <panes />\n  </component>\n  <component name=\"PropertiesComponent\">\n    <property name=\"GoToClass.includeLibraries\" value=\"false\" />\n    <property name=\"GoToClass.toSaveIncludeLibraries\" value=\"false\" />\n    <property name=\"GoToFile.includeJavaFiles\" value=\"false\" />\n    <property name=\"MemberChooser.sorted\" value=\"false\" />\n    <property name=\"MemberChooser.showClasses\" value=\"true\" />\n    <property name=\"MemberChooser.copyJavadoc\" value=\"false\" />\n    <property name=\"last_opened_file_path\" value=\"$PROJECT_DIR$\" />\n    <property name=\"recentsLimit\" value=\"5\" />\n    <property name=\"FullScreen\" value=\"false\" />\n  </component>\n  <component name=\"RunManager\" selected=\"Android Application.app\">\n    <configuration default=\"true\" type=\"Remote\" factoryName=\"Remote\">\n      <option name=\"USE_SOCKET_TRANSPORT\" value=\"true\" />\n      <option name=\"SERVER_MODE\" value=\"false\" />\n      <option name=\"SHMEM_ADDRESS\" value=\"javadebug\" />\n      <option name=\"HOST\" value=\"localhost\" />\n      <option name=\"PORT\" value=\"5005\" />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"TestNG\" factoryName=\"TestNG\">\n      <module name=\"\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"SUITE_NAME\" />\n      <option name=\"PACKAGE_NAME\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"METHOD_NAME\" />\n      <option name=\"GROUP_NAME\" />\n      <option name=\"TEST_OBJECT\" value=\"CLASS\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$PROJECT_DIR$\" />\n      <option name=\"OUTPUT_DIRECTORY\" />\n      <option name=\"ANNOTATION_TYPE\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"moduleWithDependencies\" />\n      </option>\n      <option name=\"USE_DEFAULT_REPORTERS\" value=\"false\" />\n      <option name=\"PROPERTIES_FILE\" />\n      <envs />\n      <properties />\n      <listeners />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"Applet\" factoryName=\"Applet\">\n      <module name=\"\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"HTML_FILE_NAME\" />\n      <option name=\"HTML_USED\" value=\"false\" />\n      <option name=\"WIDTH\" value=\"400\" />\n      <option name=\"HEIGHT\" value=\"300\" />\n      <option name=\"POLICY_FILE\" value=\"$APPLICATION_HOME_DIR$/bin/appletviewer.policy\" />\n      <option name=\"VM_PARAMETERS\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"Application\" factoryName=\"Application\">\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"VM_PARAMETERS\" />\n      <option name=\"PROGRAM_PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$PROJECT_DIR$\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"ENABLE_SWING_INSPECTOR\" value=\"false\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <module name=\"\" />\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"JUnit\" factoryName=\"JUnit\">\n      <module name=\"\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"PACKAGE_NAME\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"METHOD_NAME\" />\n      <option name=\"TEST_OBJECT\" value=\"class\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$PROJECT_DIR$\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"moduleWithDependencies\" />\n      </option>\n      <envs />\n      <patterns />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"AndroidRunConfigurationType\" factoryName=\"Android Application\">\n      <module name=\"\" />\n      <option name=\"ACTIVITY_CLASS\" value=\"\" />\n      <option name=\"MODE\" value=\"default_activity\" />\n      <option name=\"DEPLOY\" value=\"true\" />\n      <option name=\"ARTIFACT_NAME\" value=\"\" />\n      <option name=\"TARGET_SELECTION_MODE\" value=\"EMULATOR\" />\n      <option name=\"USE_LAST_SELECTED_DEVICE\" value=\"false\" />\n      <option name=\"PREFERRED_AVD\" value=\"\" />\n      <option name=\"USE_COMMAND_LINE\" value=\"true\" />\n      <option name=\"COMMAND_LINE\" value=\"\" />\n      <option name=\"WIPE_USER_DATA\" value=\"false\" />\n      <option name=\"DISABLE_BOOT_ANIMATION\" value=\"false\" />\n      <option name=\"NETWORK_SPEED\" value=\"full\" />\n      <option name=\"NETWORK_LATENCY\" value=\"none\" />\n      <option name=\"CLEAR_LOGCAT\" value=\"false\" />\n      <option name=\"SHOW_LOGCAT_AUTOMATICALLY\" value=\"true\" />\n      <option name=\"FILTER_LOGCAT_AUTOMATICALLY\" value=\"true\" />\n      <method />\n    </configuration>\n    <configuration default=\"false\" name=\"app\" type=\"AndroidRunConfigurationType\" factoryName=\"Android Application\">\n      <module name=\"app\" />\n      <option name=\"ACTIVITY_CLASS\" value=\"\" />\n      <option name=\"MODE\" value=\"default_activity\" />\n      <option name=\"DEPLOY\" value=\"true\" />\n      <option name=\"ARTIFACT_NAME\" value=\"\" />\n      <option name=\"TARGET_SELECTION_MODE\" value=\"SHOW_DIALOG\" />\n      <option name=\"USE_LAST_SELECTED_DEVICE\" value=\"false\" />\n      <option name=\"PREFERRED_AVD\" value=\"\" />\n      <option name=\"USE_COMMAND_LINE\" value=\"true\" />\n      <option name=\"COMMAND_LINE\" value=\"\" />\n      <option name=\"WIPE_USER_DATA\" value=\"false\" />\n      <option name=\"DISABLE_BOOT_ANIMATION\" value=\"false\" />\n      <option name=\"NETWORK_SPEED\" value=\"full\" />\n      <option name=\"NETWORK_LATENCY\" value=\"none\" />\n      <option name=\"CLEAR_LOGCAT\" value=\"false\" />\n      <option name=\"SHOW_LOGCAT_AUTOMATICALLY\" value=\"true\" />\n      <option name=\"FILTER_LOGCAT_AUTOMATICALLY\" value=\"true\" />\n      <method />\n    </configuration>\n    <list size=\"1\">\n      <item index=\"0\" class=\"java.lang.String\" itemvalue=\"Android Application.app\" />\n    </list>\n    <configuration name=\"&lt;template&gt;\" type=\"#org.jetbrains.idea.devkit.run.PluginConfigurationType\" default=\"true\" selected=\"false\">\n      <option name=\"VM_PARAMETERS\" value=\"-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea\" />\n    </configuration>\n    <configuration name=\"&lt;template&gt;\" type=\"WebApp\" default=\"true\" selected=\"false\">\n      <Host>localhost</Host>\n      <Port>5050</Port>\n    </configuration>\n  </component>\n  <component name=\"ShelveChangesManager\" show_recycled=\"false\" />\n  <component name=\"SvnConfiguration\">\n    <configuration />\n  </component>\n  <component name=\"TaskManager\">\n    <task active=\"true\" id=\"Default\" summary=\"Default task\">\n      <changelist id=\"210c3ae9-616a-4bee-ad59-44d578e78cdb\" name=\"Default\" comment=\"\" />\n      <created>1410079059530</created>\n      <updated>1410079059530</updated>\n    </task>\n    <servers />\n  </component>\n  <component name=\"ToolWindowManager\">\n    <frame x=\"20\" y=\"22\" width=\"1400\" height=\"819\" extended-state=\"0\" />\n    <editor active=\"false\" />\n    <layout>\n      <window_info id=\"Palette&#9;\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"2\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Changes\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"7\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Designer\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"3\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Palette\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"3\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Terminal\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"7\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Debug\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.4\" sideWeight=\"0.5\" order=\"3\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Event Log\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"7\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Favorites\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"2\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Version Control\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"7\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Gradle Console\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"7\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Build Variants\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"2\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Android\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"7\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Gradle\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"3\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"TODO\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"6\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Structure\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.25\" sideWeight=\"0.5\" order=\"1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Maven Projects\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"3\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Commander\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"SLIDING\" type=\"SLIDING\" visible=\"false\" weight=\"0.4\" sideWeight=\"0.5\" order=\"0\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Application Servers\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"7\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Project\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.25\" sideWeight=\"0.5\" order=\"0\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Run\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"2\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Ant Build\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.25\" sideWeight=\"0.5\" order=\"1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Hierarchy\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.25\" sideWeight=\"0.5\" order=\"2\" side_tool=\"false\" content_ui=\"combo\" />\n      <window_info id=\"Cvs\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.25\" sideWeight=\"0.5\" order=\"4\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Message\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"0\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Find\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Messages\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.32872927\" sideWeight=\"0.5\" order=\"7\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Inspection\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" weight=\"0.4\" sideWeight=\"0.5\" order=\"5\" side_tool=\"false\" content_ui=\"tabs\" />\n    </layout>\n  </component>\n  <component name=\"Vcs.Log.UiProperties\">\n    <option name=\"RECENTLY_FILTERED_USER_GROUPS\">\n      <collection />\n    </option>\n    <option name=\"RECENTLY_FILTERED_BRANCH_GROUPS\">\n      <collection />\n    </option>\n  </component>\n  <component name=\"VcsContentAnnotationSettings\">\n    <option name=\"myLimit\" value=\"2678400000\" />\n  </component>\n  <component name=\"VcsManagerConfiguration\">\n    <option name=\"myTodoPanelSettings\">\n      <TodoPanelSettings />\n    </option>\n  </component>\n  <component name=\"XDebuggerManager\">\n    <breakpoint-manager />\n  </component>\n</project>\n\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/.project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>PebbleKitExamples(git)</name>\n\t<comment></comment>\n\t<projects>\n\t</projects>\n\t<buildSpec>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.jdt.core.javabuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.ApkBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t</buildSpec>\n\t<natures>\n\t\t<nature>com.android.ide.eclipse.adt.AndroidNature</nature>\n\t\t<nature>org.eclipse.jdt.core.javanature</nature>\n\t</natures>\n</projectDescription>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/.settings/org.eclipse.jdt.core.prefs",
    "content": "eclipse.preferences.version=1\norg.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6\norg.eclipse.jdt.core.compiler.compliance=1.6\norg.eclipse.jdt.core.compiler.source=1.6\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.example.PebbleKitExample\"\n  android:versionCode=\"1\"\n  android:versionName=\"1.0\">\n\n  <permission android:name=\"com.example.PebbleKitExample.permission.C2D_MESSAGE\" android:protectionLevel=\"signature\" />\n  <uses-permission android:name=\"com.example.PebbleKitExample.permission.C2D_MESSAGE\" />\n  <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />\n  <uses-permission android:name=\"android.permission.INTERNET\" />\n  <uses-permission android:name=\"android.permission.SEND_SMS\"/>\n  <uses-permission android:name=\"android.permission.READ_CONTACTS\"/>\n  <uses-permission android:name=\"android.permission.NFC\" />\n  <uses-feature android:name=\"android.hardware.nfc\" />\n\n    <!-- App receives GCM messages. -->\n    <uses-permission android:name=\"com.google.android.c2dm.permission.RECEIVE\" />\n    <!-- GCM connects to Google Services. -->\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <!-- GCM requires a Google account. -->\n    <uses-permission android:name=\"android.permission.GET_ACCOUNTS\" />\n    <!-- Keeps the processor from sleeping when a message is received. -->\n    <uses-permission android:name=\"android.permission.WAKE_LOCK\" />\n\n  <application android:label=\"@string/app_name\">\n\n    <activity\n      android:name=\".MainActivity\"\n      android:label=\"@string/app_name\">\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n\n    <activity\n      android:name=\".ExampleSportsActivity\"\n      android:label=\"@string/activity_sports\">\n\n    </activity>\n\n    <activity\n      android:name=\".ExampleGolfActivity\"\n      android:label=\"@string/activity_golf\">\n\n    </activity>\n\n    <activity\n      android:name=\".ExampleWeatherActivity\"\n      android:label=\"@string/activity_weather\">\n\n    </activity>\n\n    <activity\n      android:name=\".TodoList.ExampleTodoListActivity\"\n      android:label=\"@string/activity_todo_list\">\n\n    </activity>\n\n      <activity\n          android:name=\".ExampleSmsActivity\"\n          android:label=\"@string/activity_sms\">\n\n      </activity>\n\n    <activity\n       android:name=\".ExampleGCMActivity\"\n       android:label=\"@string/activity_gcm\"\n       android:screenOrientation=\"portrait\"\n       android:launchMode=\"singleInstance\">\n       <intent-filter>\n            <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n            <category android:name=\"android.intent.category.DEFAULT\" />\n            <data android:mimeType=\"application/com.example.android.beam\" />\n        </intent-filter>\n    </activity>\n\n    <receiver android:name=\"com.google.android.gcm.GCMBroadcastReceiver\" android:permission=\"com.google.android.c2dm.permission.SEND\" >\n        <intent-filter>\n            <action android:name=\"com.google.android.c2dm.intent.RECEIVE\" />\n            <action android:name=\"com.google.android.c2dm.intent.REGISTRATION\" />\n            <category android:name=\"com.example.PebbleKitExample\" />\n        </intent-filter>\n    </receiver>\n\n    <service android:name=\".GCMIntentService\" />\n  </application>\n</manifest> \n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/README.md",
    "content": "PebbleKitExample\n================\n\nA class containing sample code that demonstrates how Android applications can\nsend to and receive data from Pebble Smartwatch applications that support\nAppMessages.\n\nEmergency SMS: ExampleSmsActivity\n---------------------------------\nThis app looks like an ordinary clock, but pressing a button on your Pebble will discreetly alert a friend to your current location so they can rescue you. \n\n1. From the watch SDK, build and install demos/feature_app_messages_send to your Pebble.\n2. Launch the ExamplePebbleKitActivity on your phone.\n3. Tap \"GPS/SMS App Example\"\n4. Enter a phone number, or tap \"Select Contact\" to choose one.\n5. If the app hasn't already launched on your watch, pick GPS/SMS Time from the watch menu\n6. On your watch, press the up button\n\nYou'll see GPS start up on your phone.  After it gets a fix, the number you entered will receive two texts: one with GPS coordinates, and another with the address corresponding to those coordinates (if the Geocoding API can find one.)\n\nNote: this app will only function if it's in the foreground, and the screen is on.\n\n---\n\nPebble-to-pebble communication via Google Cloud Messaging and NFC: ExampleGCMActivity\n-------------------------------------------------------------------------------------\nThis app lets you pair a friend's Pebble with yours so you can send a vibrating notification from your watch to theirs.   It's called Happy Hour because it could be a good way to tell a friend about free beer or food.  You'll need two Pebbles and two NFC-enabled Android devices for this app.\n\n1. From the watch SDK, build and install demos/app_vibrate_paired_pebble to your Pebble.\n2. Launch the ExamplePebbleKitActivity on your phones.  \n3. Tap \"GCM Activity\" on both phones.\n4. Tap the two phones together.  When the Android Beam UI comes up, tap \"Touch to Beam\" on one of the phones.  Tap the two phones again, and tap the send button on the other phone.\n5. If the app hasn't already launched on your watch, pick Happy Hour from the watch menu\n6. The phones are now paired.  Pressing the up button on the watch will make the other watch vibrate.\n\nHow it works: the NFC tap sends one phone's GCM id to the other phone.  We ping the GCM server directly from the phone, rather than needing to have a backend.  When a GCM notification arrives, it sends an app message to the watch, causing it to vibrate.\n\nNote: this app will only function if it's in the foreground, and the screen is on.\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/WeatherDemo-Android.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.path=\"$MODULE_DIR$\" external.root.project.path=\"$MODULE_DIR$\" external.system.id=\"GRADLE\" external.system.module.group=\"\" external.system.module.version=\"unspecified\" type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"FacetManager\">\n    <facet type=\"java-gradle\" name=\"Java-Gradle\">\n      <configuration>\n        <option name=\"BUILD_FOLDER_PATH\" value=\"$MODULE_DIR$/build\" />\n      </configuration>\n    </facet>\n  </component>\n  <component name=\"NewModuleRootManager\" inherit-compiler-output=\"true\">\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$\">\n      <excludeFolder url=\"file://$MODULE_DIR$/.gradle\" />\n    </content>\n    <orderEntry type=\"inheritedJdk\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n  </component>\n</module>\n\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/ant.properties",
    "content": "# This file is used to override default values used by the Ant build system.\n#\n# This file must be checked into Version Control Systems, as it is\n# integral to the build system of your project.\n\n# This file is only used by the Ant script.\n\n# You can use this to override default values such as\n#  'source.dir' for the location of your java source folder and\n#  'out.dir' for the location of your output folder.\n\n# You can also use it define how the release builds are signed by declaring\n# the following properties:\n#  'key.store' for the location of your keystore and\n#  'key.alias' for the name of the key to use.\n# The password will be asked during the build when you use the 'release' target.\n\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/app/app.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.path=\"$MODULE_DIR$\" external.root.project.path=\"$MODULE_DIR$/..\" external.system.id=\"GRADLE\" external.system.module.group=\"WeatherDemo-Android\" external.system.module.version=\"unspecified\" type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"FacetManager\">\n    <facet type=\"android-gradle\" name=\"Android-Gradle\">\n      <configuration>\n        <option name=\"GRADLE_PROJECT_PATH\" value=\":app\" />\n      </configuration>\n    </facet>\n    <facet type=\"android\" name=\"Android\">\n      <configuration>\n        <option name=\"SELECTED_BUILD_VARIANT\" value=\"debug\" />\n        <option name=\"ASSEMBLE_TASK_NAME\" value=\"assembleDebug\" />\n        <option name=\"COMPILE_JAVA_TASK_NAME\" value=\"compileDebugJava\" />\n        <option name=\"ASSEMBLE_TEST_TASK_NAME\" value=\"assembleDebugTest\" />\n        <option name=\"SOURCE_GEN_TASK_NAME\" value=\"generateDebugSources\" />\n        <option name=\"ALLOW_USER_CONFIGURATION\" value=\"false\" />\n        <option name=\"MANIFEST_FILE_RELATIVE_PATH\" value=\"/src/main/AndroidManifest.xml\" />\n        <option name=\"RES_FOLDER_RELATIVE_PATH\" value=\"/src/main/res\" />\n        <option name=\"RES_FOLDERS_RELATIVE_PATH\" value=\"file://$MODULE_DIR$/src/main/res\" />\n        <option name=\"ASSETS_FOLDER_RELATIVE_PATH\" value=\"/src/main/assets\" />\n      </configuration>\n    </facet>\n  </component>\n  <component name=\"NewModuleRootManager\" inherit-compiler-output=\"false\">\n    <output url=\"file://$MODULE_DIR$/build/intermediates/classes/debug\" />\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$\">\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/r/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/aidl/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/buildConfig/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/rs/debug\" isTestSource=\"false\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/res/rs/debug\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/r/test/debug\" isTestSource=\"true\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/aidl/test/debug\" isTestSource=\"true\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/buildConfig/test/debug\" isTestSource=\"true\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/source/rs/test/debug\" isTestSource=\"true\" generated=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/build/generated/res/rs/test/debug\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/res\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/resources\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/aidl\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/assets\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/java\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/jni\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/debug/rs\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/res\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/resources\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/aidl\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/assets\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/java\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/jni\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/rs\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/res\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/resources\" type=\"java-test-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/aidl\" isTestSource=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/assets\" isTestSource=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/java\" isTestSource=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/jni\" isTestSource=\"true\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/androidTest/rs\" isTestSource=\"true\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/assets\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/bundles\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/classes\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/dependency-cache\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/dex\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/dex-cache\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/incremental\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/jacoco\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/javaResources\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/libs\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/lint\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/manifests\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/ndk\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/pre-dexed\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/proguard\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/res\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/rs\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/intermediates/symbols\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build/outputs\" />\n    </content>\n    <orderEntry type=\"jdk\" jdkName=\"Android API 17 Platform\" jdkType=\"Android SDK\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n    <orderEntry type=\"library\" exported=\"\" name=\"pebblekit-2.5-SNAPSHOT\" level=\"project\" />\n  </component>\n</module>\n\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nrepositories {\n    mavenCentral()\n    maven { url \"https://oss.sonatype.org/content/groups/public/\" }\n}\n\nandroid {\n    compileSdkVersion 17\n    buildToolsVersion '20.0.0'\n\n    defaultConfig {\n        applicationId \"com.example.pebblekit.weather\"\n        minSdkVersion 14\n        targetSdkVersion 17\n    }\n\n    lintOptions {\n        abortOnError false\n    }\n\n    buildTypes {\n        release {\n            runProguard false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'\n        }\n    }\n}\n\ndependencies {\n    compile 'com.getpebble:pebblekit:2.5.0'\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/app/src/main/.classpath",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<classpath>\n\t<classpathentry kind=\"src\" path=\"src\"/>\n\t<classpathentry kind=\"src\" path=\"java\"/>\n\t<classpathentry kind=\"src\" path=\"gen\"/>\n\t<classpathentry kind=\"con\" path=\"com.android.ide.eclipse.adt.ANDROID_FRAMEWORK\"/>\n\t<classpathentry exported=\"true\" kind=\"con\" path=\"com.android.ide.eclipse.adt.LIBRARIES\"/>\n\t<classpathentry exported=\"true\" kind=\"con\" path=\"com.android.ide.eclipse.adt.DEPENDENCIES\"/>\n\t<classpathentry kind=\"output\" path=\"bin/classes\"/>\n</classpath>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/app/src/main/.project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>ExampleWeatherActivity</name>\n\t<comment></comment>\n\t<projects>\n\t</projects>\n\t<buildSpec>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.jdt.core.javabuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.ApkBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t</buildSpec>\n\t<natures>\n\t\t<nature>com.android.ide.eclipse.adt.AndroidNature</nature>\n\t\t<nature>org.eclipse.jdt.core.javanature</nature>\n\t</natures>\n</projectDescription>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/app/src/main/.settings/org.eclipse.jdt.core.prefs",
    "content": "eclipse.preferences.version=1\norg.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6\norg.eclipse.jdt.core.compiler.compliance=1.6\norg.eclipse.jdt.core.compiler.source=1.6\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.example.PebbleKitExample\"\n  android:versionCode=\"1\"\n  android:versionName=\"1.0\">\n\n  <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />\n  <uses-permission android:name=\"android.permission.INTERNET\" />\n  <uses-permission android:name=\"android.permission.SEND_SMS\"/>\n  <uses-permission android:name=\"android.permission.READ_CONTACTS\"/>\n  <uses-permission android:name=\"android.permission.NFC\" />\n  <uses-feature android:name=\"android.hardware.nfc\" />\n  \n  <!-- Keeps the processor from sleeping when a message is received. -->\n  <uses-permission android:name=\"android.permission.WAKE_LOCK\" />\n\n  <application android:label=\"@string/app_name\">\n\n    <activity\n      android:name=\".ExampleWeatherActivity\"\n      android:label=\"@string/activity_weather\">\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n          </activity>\n\n  </application>\n</manifest> \n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/app/src/main/bin/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.example.PebbleKitExample\"\n  android:versionCode=\"1\"\n  android:versionName=\"1.0\">\n\n  <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />\n  <uses-permission android:name=\"android.permission.INTERNET\" />\n  <uses-permission android:name=\"android.permission.SEND_SMS\"/>\n  <uses-permission android:name=\"android.permission.READ_CONTACTS\"/>\n  <uses-permission android:name=\"android.permission.NFC\" />\n  <uses-feature android:name=\"android.hardware.nfc\" />\n  \n  <!-- Keeps the processor from sleeping when a message is received. -->\n  <uses-permission android:name=\"android.permission.WAKE_LOCK\" />\n\n  <application android:label=\"@string/app_name\">\n\n    <activity\n      android:name=\".ExampleWeatherActivity\"\n      android:label=\"@string/activity_weather\">\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n          </activity>\n\n  </application>\n</manifest> \n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/app/src/main/bin/jarlist.cache",
    "content": "# cache for current jar dependency. DO NOT EDIT.\n# format is <lastModified> <length> <SHA-1> <path>\n# Encoding is UTF-8\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/app/src/main/gen/com/example/PebbleKitExample/BuildConfig.java",
    "content": "/** Automatically generated file. DO NOT MODIFY */\npackage com.example.PebbleKitExample;\n\npublic final class BuildConfig {\n    public final static boolean DEBUG = true;\n}"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/app/src/main/gen/com/example/PebbleKitExample/R.java",
    "content": "/* AUTO-GENERATED FILE.  DO NOT MODIFY.\n *\n * This class was automatically generated by the\n * aapt tool from the resource data it found.  It\n * should not be modified by hand.\n */\n\npackage com.example.PebbleKitExample;\n\npublic final class R {\n    public static final class attr {\n    }\n    public static final class drawable {\n        public static final int watch=0x7f020000;\n    }\n    public static final class id {\n        public static final int button=0x7f050000;\n    }\n    public static final class layout {\n        public static final int activity_weather=0x7f030000;\n    }\n    public static final class string {\n        public static final int activity_weather=0x7f040001;\n        public static final int app_name=0x7f040000;\n    }\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/app/src/main/java/com/example/PebbleKitExample/ExampleWeatherActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.location.Criteria;\nimport android.location.Location;\nimport android.location.LocationListener;\nimport android.location.LocationManager;\nimport android.os.AsyncTask;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.Toast;\n\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\nimport org.json.JSONObject;\n\nimport java.io.BufferedReader;\nimport java.io.InputStreamReader;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.util.UUID;\n\n/**\n * Sample activity demonstrating how to send data to a \"weather\" watch-app.\n *\n * The watch-app in question is available here:\n * https://github.com/pebble/pebble-apps/tree/master/demos/feature_app_messages\n *\n * @author zulak@getpebble.com\n */\npublic class ExampleWeatherActivity extends Activity {\n    // the tuple key corresponding to the weather icon displayed on the watch\n    private static final int ICON_KEY = 0;\n    // the tuple key corresponding to the temperature displayed on the watch\n    private static final int TEMP_KEY = 1;\n    // This UUID identifies the weather app\n    private static final UUID WEATHER_UUID = UUID.fromString(\"28AF3DC7-E40D-490F-BEF2-29548C8B0600\");\n\n    private LocationManager mLocationManager;\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_weather);\n        mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);\n    }\n\n    public void updateWeather(View view) {\n        // when this button is clicked, get the handset's approximate location and request weather data from a\n        // third-party web service\n        LocationListener locationListener = new LocationListener() {\n            public void onLocationChanged(Location location) {\n            \tnew UpdateWeatherTask().execute(location);\n            }\n\n            public void onStatusChanged(String provider, int status, Bundle extras) {\n            }\n\n            public void onProviderEnabled(String provider) {\n            }\n\n            public void onProviderDisabled(String provider) {\n            }\n        };\t\n        \n        String locationProvider = mLocationManager.getBestProvider(new Criteria(), true);\n        \n        if (locationProvider == null) {\n        \tToast.makeText(getApplicationContext(), \"No location services enabled.\",\n        \t\t\t   Toast.LENGTH_LONG).show();\n        } else {\n        \t// update might take a while, use last known location to speed things up\n        \tLocation location = mLocationManager.getLastKnownLocation(locationProvider);\n        \tif(location != null) {\n        \t\tnew UpdateWeatherTask().execute(location);\n        \t}\n        \tmLocationManager.requestSingleUpdate(locationProvider, locationListener, this.getMainLooper());\n        }\n\n        \n    }\n\n    public void sendWeatherDataToWatch(int weatherIconId, int temperatureCelsius) {\n        // Build up a Pebble dictionary containing the weather icon and the current temperature in degrees celsius\n        PebbleDictionary data = new PebbleDictionary();\n        data.addUint8(ICON_KEY, (byte) weatherIconId);\n        data.addString(TEMP_KEY, String.format(\"%d\\u00B0C\", temperatureCelsius));\n\n        // Send the assembled dictionary to the weather watch-app; this is a no-op if the app isn't running or is not\n        // installed\n        PebbleKit.sendDataToPebble(getApplicationContext(), WEATHER_UUID, data);\n    }\n    \n    private class UpdateWeatherTask extends AsyncTask<Location, Integer, Integer> {\n    \t@Override\n    \tprotected Integer doInBackground(Location... params) {\n    \t\tdoWeatherUpdate(params[0]);\n    \t\treturn null;\n    \t}\n    }\n\n    public void doWeatherUpdate(Location location) {\n        // A very sketchy, rough way of getting the local weather forecast from the phone's approximate location\n        // using the OpenWeatherMap webservice: http://openweathermap.org/wiki/API/JSON_API\n        double latitude = location.getLatitude();\n        double longitude = location.getLongitude();\n\n        try {\n            URL u = new URL(String.format(\"http://api.openweathermap.org/data/2.1/find/city?lat=%f&lon=%f&cnt=1\",\n                    latitude,\n                    longitude));\n\n            HttpURLConnection urlConnection = (HttpURLConnection) u.openConnection();\n            try {\n                BufferedReader reader =\n                        new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), \"UTF-8\"));\n                String json = reader.readLine();\n\n                JSONObject jsonObject = new JSONObject(json);\n                JSONObject l = jsonObject.getJSONArray(\"list\").getJSONObject(0);\n                JSONObject m = l.getJSONObject(\"main\");\n                double temperature = m.getDouble(\"temp\");\n                int wtype = l.getJSONArray(\"weather\").getJSONObject(0).getInt(\"id\");\n\n                int weatherIcon = getIconFromWeatherId(wtype);\n                int temp = (int) (temperature - 273.15);\n\n                sendWeatherDataToWatch(weatherIcon, temp);\n            } finally {\n                urlConnection.disconnect();\n            }\n\n            Log.d(\"WeatherActivity\", String.format(\"%f, %f\", latitude, longitude));\n        } catch (Exception e) {\n        \trunOnUiThread(new Runnable() {\n\t\t\t\t\n\t\t\t\t@Override\n\t\t\t\tpublic void run() {\n\t\t        \tToast.makeText(getApplicationContext(), \"Error while accessing openweathermap.org.\\nSee LogCat for details.\",\n\t\t        \t\t\t   Toast.LENGTH_LONG).show();\n\t\t\t\t}\n\t\t\t});\n        \tLog.e(\"WeatherActivity\", \"doWeatherUpdate\", e);\n        }\n    }\n\n    private int getIconFromWeatherId(int weatherId) {\n        if (weatherId < 600) {\n            return 2;\n        } else if (weatherId < 700) {\n            return 3;\n        } else if (weatherId > 800) {\n            return 1;\n        } else {\n            return 0;\n        }\n    }\n\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/app/src/main/project.properties",
    "content": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# This file must be checked in Version Control Systems.\n#\n# To customize properties used by the Ant build system edit\n# \"ant.properties\", and override values to adapt the script to your\n# project structure.\n#\n# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):\n#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt\n\n# Project target.\ntarget=android-14\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/app/src/main/res/layout/activity_weather.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:orientation=\"vertical\"\n  android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n\n  <Button\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Update Weather\"\n    android:id=\"@+id/button\"\n    android:onClick=\"updateWeather\"/>\n\n</LinearLayout>"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"app_name\">PebbleKit Weather Example</string>\n  <string name=\"activity_weather\">Weather App Example</string>\n</resources>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n    repositories {\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:0.12.+'\n    }\n}\n\nallprojects {\n    repositories {\n        jcenter()\n    }\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/build.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project name=\"PebbleKitExample\" default=\"help\">\n\n    <!-- The local.properties file is created and updated by the 'android' tool.\n         It contains the path to the SDK. It should *NOT* be checked into\n         Version Control Systems. -->\n    <property file=\"local.properties\" />\n\n    <!-- The ant.properties file can be created by you. It is only edited by the\n         'android' tool to add properties to it.\n         This is the place to change some Ant specific build properties.\n         Here are some properties you may want to change/update:\n\n         source.dir\n             The name of the source directory. Default is 'src'.\n         out.dir\n             The name of the output directory. Default is 'bin'.\n\n         For other overridable properties, look at the beginning of the rules\n         files in the SDK, at tools/ant/build.xml\n\n         Properties related to the SDK location or the project target should\n         be updated using the 'android' tool with the 'update' action.\n\n         This file is an integral part of the build system for your\n         application and should be checked into Version Control Systems.\n\n         -->\n    <property file=\"ant.properties\" />\n\n    <!-- if sdk.dir was not set from one of the property file, then\n         get it from the ANDROID_HOME env var.\n         This must be done before we load project.properties since\n         the proguard config can use sdk.dir -->\n    <property environment=\"env\" />\n    <condition property=\"sdk.dir\" value=\"${env.ANDROID_HOME}\">\n        <isset property=\"env.ANDROID_HOME\" />\n    </condition>\n\n    <!-- The project.properties file is created and updated by the 'android'\n         tool, as well as ADT.\n\n         This contains project specific properties such as project target, and library\n         dependencies. Lower level build properties are stored in ant.properties\n         (or in .classpath for Eclipse projects).\n\n         This file is an integral part of the build system for your\n         application and should be checked into Version Control Systems. -->\n    <loadproperties srcFile=\"project.properties\" />\n\n    <!-- quick check on sdk.dir -->\n    <fail\n            message=\"sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable.\"\n            unless=\"sdk.dir\"\n    />\n\n    <!--\n        Import per project custom build rules if present at the root of the project.\n        This is the place to put custom intermediary targets such as:\n            -pre-build\n            -pre-compile\n            -post-compile (This is typically used for code obfuscation.\n                           Compiled code location: ${out.classes.absolute.dir}\n                           If this is not done in place, override ${out.dex.input.absolute.dir})\n            -post-package\n            -post-build\n            -pre-clean\n    -->\n    <import file=\"custom_rules.xml\" optional=\"true\" />\n\n    <!-- Import the actual build file.\n\n         To customize existing targets, there are two options:\n         - Customize only one target:\n             - copy/paste the target into this file, *before* the\n               <import> task.\n             - customize it to your needs.\n         - Customize the whole content of build.xml\n             - copy/paste the content of the rules files (minus the top node)\n               into this file, replacing the <import> task.\n             - customize to your needs.\n\n         ***********************\n         ****** IMPORTANT ******\n         ***********************\n         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,\n         in order to avoid having your file be overridden by tools such as \"android update project\"\n    -->\n    <!-- version-tag: 1 -->\n    <import file=\"${sdk.dir}/tools/ant/build.xml\" />\n\n</project>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Wed Apr 10 15:27:10 PDT 2013\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=http\\://services.gradle.org/distributions/gradle-1.12-all.zip\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# For Cygwin, ensure paths are in UNIX format before anything is touched.\nif $cygwin ; then\n    [ -n \"$JAVA_HOME\" ] && JAVA_HOME=`cygpath --unix \"$JAVA_HOME\"`\nfi\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >&-\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >&-\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\r\nset CMD_LINE_ARGS=%$\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/proguard-project.txt",
    "content": "# To enable ProGuard in your project, edit project.properties\n# to define the proguard.config property as described in that file.\n#\n# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in ${sdk.dir}/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the ProGuard\n# include property in project.properties.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/project.properties",
    "content": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# This file must be checked in Version Control Systems.\n#\n# To customize properties used by the Ant build system edit\n# \"ant.properties\", and override values to adapt the script to your\n# project structure.\n#\n# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):\n#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt\n\n# Project target.\ntarget=android-14\nandroid.library.reference.1=../../../PebbleKit-Android/PebbleKit\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/res/layout/activity_gcm.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:orientation=\"vertical\"\n  android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Run this Activity on the other phone you want to pair with, then tap.\"\n    android:id=\"@+id/textGcmStatus\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"24sp\" />\n\n</LinearLayout>"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/res/layout/activity_golf.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:orientation=\"vertical\"\n  android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"New Text\"\n    android:id=\"@+id/textBack\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"24sp\" />\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"New Text\"\n    android:id=\"@+id/textMiddle\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"32sp\"\n    android:textStyle=\"bold\" />\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"New Text\"\n    android:id=\"@+id/textFront\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"24sp\" />\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"New Text\"\n    android:id=\"@+id/textHole\"\n    android:layout_gravity=\"center\"\n    android:layout_marginTop=\"15dp\"\n    android:textSize=\"24sp\" />\n\n  <LinearLayout\n    android:orientation=\"horizontal\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\"\n    android:layout_margin=\"5dp\">\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Start App\"\n      android:id=\"@+id/button\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"startWatchApp\"/>\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Stop App\"\n      android:id=\"@+id/button1\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"stopWatchApp\"/>\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Customize App\"\n      android:id=\"@+id/button2\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"customizeWatchApp\"/>\n\n  </LinearLayout>\n\n  <Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Prev Hole\"\n    android:id=\"@+id/button4\"\n    android:layout_gravity=\"center\"\n    android:onClick=\"goPrevious\"/>\n\n  <Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Next Hole\"\n    android:id=\"@+id/button3\"\n    android:layout_gravity=\"center\"\n    android:onClick=\"goNext\"/>\n\n</LinearLayout>"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/res/layout/activity_sms.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:orientation=\"vertical\"\n  android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Number to send text to\"\n    android:id=\"@+id/textBack\"\n    android:layout_gravity=\"center\"\n    android:textSize=\"24sp\" />\n\n  <EditText\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"\"\n    android:id=\"@+id/destinationNumber\"\n    android:layout_gravity=\"center\"/>\n\n    <LinearLayout\n            android:orientation=\"horizontal\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_margin=\"5dp\">\n\n        <Button\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"Select Contact\"\n                android:id=\"@+id/pickContactButton\"\n                android:layout_gravity=\"center\"\n                android:onClick=\"pickContact\"/>\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/res/layout/activity_sports.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:orientation=\"vertical\"\n  android:layout_width=\"fill_parent\"\n  android:layout_height=\"fill_parent\"\n  android:padding=\"10dp\">\n\n  <ImageView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:id=\"@+id/imageView\"\n    android:layout_gravity=\"center\"\n    android:src=\"@drawable/running\" />\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Paused\"\n    android:id=\"@+id/status\"\n    android:layout_gravity=\"center\"\n    android:typeface=\"sans\"\n    android:textStyle=\"bold\"\n    android:textSize=\"32sp\"\n    android:layout_marginTop=\"5dp\" />\n\n  <LinearLayout\n    android:orientation=\"horizontal\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\"\n    android:layout_marginTop=\"20dp\">\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"fill_parent\"\n      android:text=\"Start App\"\n      android:id=\"@+id/button\"\n      android:onClick=\"startWatchApp\" />\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Stop App\"\n      android:id=\"@+id/button2\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"stopWatchApp\" />\n\n    <Button\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"Customize App\"\n      android:id=\"@+id/button1\"\n      android:layout_gravity=\"center\"\n      android:onClick=\"customizeWatchApp\" />\n  </LinearLayout>\n\n  <Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Update Data\"\n    android:id=\"@+id/button3\"\n    android:layout_gravity=\"center\"\n    android:onClick=\"updateWatchApp\" />\n\n  <Button\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Change Units\"\n    android:id=\"@+id/button4\"\n    android:layout_gravity=\"center\"\n    android:onClick=\"changeUnitsOnWatch\" />\n\n</LinearLayout>\n\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/res/layout/activity_todo_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<com.mobeta.android.dslv.DragSortListView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:dslv=\"http://schemas.android.com/apk/res/com.example.PebbleKitExample\"\n  android:id=\"@android:id/list\"\n  android:layout_width=\"fill_parent\"\n  android:layout_height=\"fill_parent\"\n  android:layout_margin=\"3dp\"\n  android:choiceMode=\"multipleChoice\"\n  android:dividerHeight=\"1px\"\n  android:padding=\"3dp\"\n  dslv:click_remove_id=\"@id/click_remove\"\n  dslv:collapsed_height=\"1px\"\n  dslv:drag_enabled=\"true\"\n  dslv:drag_handle_id=\"@id/drag_handle\"\n  dslv:drag_scroll_start=\"0.33\"\n  dslv:drag_start_mode=\"onDown\"\n  dslv:float_alpha=\"0.6\"\n  dslv:remove_enabled=\"true\"\n  dslv:remove_mode=\"clickRemove\"\n  dslv:slide_shuffle_speed=\"0.3\" />"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/res/layout/activity_weather.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:orientation=\"vertical\"\n  android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n\n  <Button\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Update Weather\"\n    android:id=\"@+id/button\"\n    android:onClick=\"updateWeather\"/>\n\n</LinearLayout>"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/res/layout/checkable_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.mobeta.android.dslv.DragSortListView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:dslv=\"http://schemas.android.com/apk/res/com.example.PebbleKitExample\"\n    android:id=\"@android:id/list\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"fill_parent\"\n    android:layout_margin=\"3dp\"\n    android:choiceMode=\"multipleChoice\"\n    android:dividerHeight=\"1px\"\n    android:padding=\"3dp\"\n    dslv:click_remove_id=\"@id/click_remove\"\n    dslv:collapsed_height=\"1px\"\n    dslv:drag_enabled=\"true\"\n    dslv:drag_handle_id=\"@id/drag_handle\"\n    dslv:drag_scroll_start=\"0.33\"\n    dslv:drag_start_mode=\"onDown\"\n    dslv:float_alpha=\"0.6\"\n    dslv:remove_enabled=\"true\"\n    dslv:remove_mode=\"clickRemove\"\n    dslv:slide_shuffle_speed=\"0.3\" />\n\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/res/layout/dialog_add_todo_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\" >\n    \n    <EditText\n        android:id=\"@+id/todo_list_add_item_dialog_description\"\n        android:inputType=\"text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"16dp\"\n        android:layout_marginLeft=\"4dp\"\n        android:layout_marginRight=\"4dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:hint=\"@string/todo_list_add_item_dialog_description_hint\" />\n\n</LinearLayout>"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/res/layout/list_item_checkable.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.example.PebbleKitExample.TodoList.CheckableLinearLayout\n  xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"fill_parent\"\n  android:layout_height=\"@dimen/item_height\"\n  android:orientation=\"horizontal\">\n  <ImageView\n    android:id=\"@id/drag_handle\"\n    android:background=\"@drawable/drag\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"@dimen/item_height\"\n    android:layout_weight=\"0\" />\n  <CheckedTextView\n    android:checkMark=\"?android:attr/listChoiceIndicatorMultiple\"\n    android:id=\"@+id/text\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"@dimen/item_height\"\n    android:layout_weight=\"1\"\n    android:textAppearance=\"?android:attr/textAppearanceMedium\"\n    android:gravity=\"center_vertical\"\n    android:paddingLeft=\"8dp\" />\n  <ImageView\n    android:id=\"@id/click_remove\"\n    android:background=\"@drawable/delete_x\"\n    android:layout_width=\"@dimen/item_height\"\n    android:layout_height=\"@dimen/item_height\"\n    android:layout_weight=\"0\" />\n</com.example.PebbleKitExample.TodoList.CheckableLinearLayout>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/res/menu/options_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n  <!-- FIXME is there a way to avoid using the condensed titles here, perhaps by stacking the items? -->\n    <item android:id=\"@+id/add_mi\" android:title=\"Add\" android:visible=\"true\" android:enabled=\"true\" android:titleCondensed=\"+\"></item>\n    <item android:id=\"@+id/remove_all_checked_mi\" android:enabled=\"true\" android:titleCondensed=\"X\" android:title=\"Remove Checked\" android:visible=\"true\"></item>\n</menu>"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"item_height\">67dp</dimen>\n    <dimen name=\"section_div_height\">20dp</dimen>\n</resources>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/res/values/dslv_attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<resources>\n  <declare-styleable name=\"DragSortListView\">\n    <attr name=\"collapsed_height\" format=\"dimension\" />\n    <attr name=\"drag_scroll_start\" format=\"float\" />\n    <attr name=\"max_drag_scroll_speed\" format=\"float\" />\n    <attr name=\"float_background_color\" format=\"color\" />\n    <attr name=\"remove_mode\">\n      <enum name=\"clickRemove\" value=\"0\" />\n      <enum name=\"flingRemove\" value=\"1\" />\n    </attr>\n    <attr name=\"track_drag_sort\" format=\"boolean\"/>\n    <attr name=\"float_alpha\" format=\"float\"/>\n    <attr name=\"slide_shuffle_speed\" format=\"float\"/>\n    <attr name=\"remove_animation_duration\" format=\"integer\"/>\n    <attr name=\"drop_animation_duration\" format=\"integer\"/>\n    <attr name=\"drag_enabled\" format=\"boolean\" />\n    <attr name=\"sort_enabled\" format=\"boolean\" />\n    <attr name=\"remove_enabled\" format=\"boolean\" />\n    <attr name=\"drag_start_mode\">\n      <enum name=\"onDown\" value=\"0\" />\n      <enum name=\"onMove\" value=\"1\" />\n      <enum name=\"onLongPress\" value=\"2\"/>\n    </attr>\n    <attr name=\"drag_handle_id\" format=\"integer\" />\n    <attr name=\"fling_handle_id\" format=\"integer\" />\n    <attr name=\"click_remove_id\" format=\"integer\" />\n    <attr name=\"use_default_controller\" format=\"boolean\" />\n  </declare-styleable>\n</resources>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item type=\"id\" name=\"drag_handle\" />\n    <item type=\"id\" name=\"click_remove\" />\n</resources>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"app_name\">ExamplePebbleKitActivity</string>\n  <string name=\"activity_golf\">Golf App Example</string>\n  <string name=\"activity_sports\">Sports App Example</string>\n  <string name=\"activity_weather\">Weather App Example</string>\n  <string name=\"activity_todo_list\">To-Do List Example</string>\n  <string-array name=\"jazz_artist_names\">\n      <item>Brad Mehldau</item>\n      <item>Joshua Redman</item>\n      <item>Chick Corea</item>\n      <item>Kurt Rosenwinkel</item>\n      <item>Miles Davis</item>\n      <item>Wayne Shorter</item>\n      <item>Michael Brecker</item>\n      <item>Herbie Hancock</item>\n      <item>Joe Zawinul</item>\n      <item>Brian Blade</item>\n      <item>Jeff Ballard</item>\n      <item>Larry Grenadier</item>\n      <item>Keith Jarrett</item>\n      <item>McCoy Tyner</item>\n      <item>Stephon Harris</item>\n      <item>Mark Turner</item>\n  </string-array>\n  <string name=\"todo_list_add_item_dialog_description_hint\">Short description</string>\n  <string name=\"todo_list_add_dialog_ok_button\">Append</string>\n  <string name=\"todo_list_add_dialog_cancel_button\">Cancel</string>\n  <string name=\"activity_sms\">Sms App Example</string>\n  <string name=\"activity_gcm\">GCM App Example</string>\n</resources>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/settings.gradle",
    "content": "include ':app'\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/example/PebbleKitExample/ExampleGCMActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.content.SharedPreferences;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.nfc.NdefMessage;\nimport android.nfc.NdefRecord;\nimport android.nfc.NfcAdapter;\nimport android.nfc.NfcAdapter.*;\nimport android.nfc.NfcEvent;\nimport android.os.AsyncTask;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Message;\nimport android.os.Parcelable;\nimport android.text.format.Time;\n\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.google.android.gcm.GCMRegistrar;\n\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\n\nimport java.util.Random;\nimport java.util.UUID;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.IOException;\nimport java.nio.charset.Charset;\n\nimport org.apache.http.client.ClientProtocolException;\nimport org.apache.http.client.HttpClient;\nimport org.apache.http.client.methods.HttpPost;\nimport org.apache.http.entity.BasicHttpEntity;\nimport org.apache.http.HttpResponse;\nimport org.apache.http.impl.client.DefaultHttpClient;\n\n\n/**\n * Allows for sending messages between two Android-paired Pebbles via Google Cloud Messaging.\n * Uses NFC to exchange GCM registration IDs.\n *\n * Pressing a button on the Pebble running the companion app (app_vibrate_paired_pebble in watch examples) will\n * cause this to send a message via GCM to a phone paired via NFC.  That phone will use app_messages to\n * vibrate the Pebble it's paired with.\n *\n * @author matt.hornyak@getpebble.com\n *\n */\npublic class ExampleGCMActivity extends Activity implements CreateNdefMessageCallback,\n        OnNdefPushCompleteCallback {\n\n    AsyncTask<Void, Void, Void> mRegisterTask;\n\n    NfcAdapter mNfcAdapter;\n    private static final int MESSAGE_SENT = 1;\n\n    private final String TAG = \"ExampleGCMActivity\";\n    private final String PREF_GCM_ACTIVITY = \"pref_gcm\";\n    private final String PREF_PAIRED_ID = \"paired_gcm_id\";\n\n    static final String SENDER_ID = \"501014417325\";\n    static final String API_KEY = \"AIzaSyAg9KiFRSkQtvaOCA6ESesVawkmm7OnVUk\";\n\n    private final Random rand = new Random();\n    private final static UUID PEBBLE_APP_UUID = UUID.fromString(\"7BD103D3-0F87-4D31-AEF8-F5237A79C72E\");\n    private final static int MSG_CMD_OUT_KEY = 0x00;\n    private final static int MSG_CMD_IN_KEY = 0x01;\n\n    private final static int MSG_CMD_VIBRATE = 0x00;\n    private final static int MSG_CMD_UP = 0x01;\n\n    private PebbleKit.PebbleDataReceiver dataReceiver;\n\n    public static String myGcmId = \"\";\n    private String mPairedGcmId;\n    private TextView mInfoText;\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_gcm);\n\n        mInfoText = (TextView) findViewById(R.id.textGcmStatus);\n        loadPairedId();\n\n        if (mPairedGcmId != null && !mPairedGcmId.equals(\"\")) {\n            mInfoText.setText(\"Paired to another phone. Ready to use.\");\n        }  else {\n            mInfoText.setText(\"Run this Activity on the other phone you want to pair with, then tap them together.\");\n        }\n\n        // Check for available NFC Adapter\n        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);\n        if (mNfcAdapter == null) {\n            mInfoText.setText(\"NFC is not available on this device.\");\n        } else {\n            // Register callback to set NDEF message\n            mNfcAdapter.setNdefPushMessageCallback(this, this);\n            // Register callback to listen for message-sent success\n            mNfcAdapter.setOnNdefPushCompleteCallback(this, this);\n        }\n\n        // GCM\n\n        // Make sure the device has the proper dependencies.\n        GCMRegistrar.checkDevice(this);\n//        GCMRegistrar.checkManifest(this);\n\n        final String regId = GCMRegistrar.getRegistrationId(this);\n        if (regId.equals(\"\")) {\n            // Automatically registers application on startup.\n            GCMRegistrar.register(this, SENDER_ID);\n        } else {\n            myGcmId = regId;\n            // Device is already registered on GCM, check server.\n            if (!GCMRegistrar.isRegisteredOnServer(this)) {\n                GCMRegistrar.setRegisteredOnServer(this, true);\n            }\n        }\n\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (dataReceiver != null) {\n            unregisterReceiver(dataReceiver);\n            dataReceiver = null;\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        // In order to interact with the UI thread from a broadcast receiver, we need to perform any updates through\n        // an Android handler. For more information, see: http://developer.android.com/reference/android/os/Handler.html\n\n        // To receive data back from the app, android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        //\n        // In this example, we're registering a receiver to listen for\n        // button presses sent from the watch\n\n        dataReceiver = new PebbleKit.PebbleDataReceiver(PEBBLE_APP_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                final int cmd = data.getUnsignedInteger(MSG_CMD_IN_KEY).intValue();\n\n                mHandler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        // All data received from the Pebble must be ACK'd, otherwise you'll hit time-outs in the\n                        // watch-app which will cause the watch to feel \"laggy\" during periods of frequent\n                        // communication.\n                        PebbleKit.sendAckToPebble(context, transactionId);\n\n                        switch (cmd) {\n                            // send GCM message when the up button is pressed\n                            case MSG_CMD_UP:\n                                sendGCMMessageToPairedDevice();\n                                break;\n                            default:\n                                break;\n                        }\n                    }\n                });\n            }\n        };\n        PebbleKit.registerReceivedDataHandler(this, dataReceiver);\n        startWatchApp(getApplicationContext());\n\n        // Check to see that the Activity started due to an Android Beam\n        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {\n            processIntent(getIntent());\n        }\n    }\n\n    protected void onDestroy() {\n        GCMRegistrar.onDestroy(this);\n        super.onDestroy();\n    }\n\n    @Override\n    public void onNewIntent(Intent intent) {\n        // onResume gets called after this to handle the intent\n        setIntent(intent);\n    }\n\n    /**\n     * On an NFC tap, retrieve the GCM ID of the other device & save it\n     */\n    void processIntent(Intent intent) {\n        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(\n                NfcAdapter.EXTRA_NDEF_MESSAGES);\n\n        NdefMessage msg = (NdefMessage) rawMsgs[0];\n        // record 0 contains the MIME type, record 1 is the AAR, if present\n        String otherDeviceId = new String(msg.getRecords()[0].getPayload());\n        mInfoText.setText(\"Paired successfully. Pressing the up button on your Pebble while running the app will now vibrate the Pebble paired to that phone.\");\n\n        setPairedId(otherDeviceId);\n        sendGCMMessageToPairedDevice();\n    }\n\n    public NdefMessage createNdefMessage(NfcEvent event) {\n        Time time = new Time();\n        time.setToNow();\n        String text;\n        if (ExampleGCMActivity.myGcmId.equals(\"\")) {\n            text = \"NO-GCM-ID\";\n        } else {\n            text = ExampleGCMActivity.myGcmId;\n        }\n        NdefMessage msg = new NdefMessage(\n                new NdefRecord[] { createMimeRecord(\n                        \"application/com.example.android.beam\", text.getBytes())\n                });\n        return msg;\n    }\n\n    /**\n     * Creates a custom MIME type encapsulated in an NDEF record\n     *\n     * @param mimeType\n     */\n    public NdefRecord createMimeRecord(String mimeType, byte[] payload) {\n        byte[] mimeBytes = mimeType.getBytes(Charset.forName(\"US-ASCII\"));\n        NdefRecord mimeRecord = new NdefRecord(\n                NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload);\n        return mimeRecord;\n    }\n\n    /**\n     * Implementation for the OnNdefPushCompleteCallback interface\n     */\n    @Override\n    public void onNdefPushComplete(NfcEvent arg0) {\n        // A handler is needed to send messages to the activity when this\n        // callback occurs, because it happens from a binder thread\n        mHandler.obtainMessage(MESSAGE_SENT).sendToTarget();\n    }\n\n    /** This handler receives a message from onNdefPushComplete */\n    private final Handler mHandler = new Handler() {\n        @Override\n        public void handleMessage(Message msg) {\n            switch (msg.what) {\n                case MESSAGE_SENT:\n                    Toast.makeText(getApplicationContext(), \"GCM id sent\", Toast.LENGTH_LONG).show();\n                    break;\n            }\n        }\n    };\n\n    protected void loadPairedId() {\n        SharedPreferences settings = getSharedPreferences(PREF_GCM_ACTIVITY, 0);\n        mPairedGcmId = settings.getString(PREF_PAIRED_ID, null);\n    }\n\n    protected void setPairedId(String id) {\n        mPairedGcmId = id;\n        SharedPreferences settings = getSharedPreferences(PREF_GCM_ACTIVITY, 0);\n        SharedPreferences.Editor editor = settings.edit();\n        editor.putString(PREF_PAIRED_ID, mPairedGcmId);\n\n        editor.commit();\n    }\n\n    private void sendGCMMessageToPairedDevice() {\n        HttpClient httpclient = new DefaultHttpClient();\n\n        HttpPost httppost = new HttpPost(\"https://android.googleapis.com/gcm/send\");\n        httppost.setHeader(\"Authorization\", \"key=\" + API_KEY);\n        httppost.setHeader(\"Content-Type\", \"application/json\");\n\n        try {\n            String reqBody = String.format(\"{\\\"registration_ids\\\" : [\\\"%s\\\"],\\\"data\\\" : { \\\"hi\\\":\\\"pebble\\\"}}\", mPairedGcmId);\n            BasicHttpEntity e = new BasicHttpEntity();\n\n            ByteArrayInputStream is = new ByteArrayInputStream(reqBody.getBytes());\n            e.setContent(is);\n            httppost.setEntity(e);\n//            Log.e(TAG, \"Data being sent via push : \" + reqBody);\n\n            HttpResponse response = httpclient.execute(httppost);\n\n            Log.e(TAG, response.toString());\n        } catch (ClientProtocolException e) {\n            Log.e(TAG, e.getMessage());\n        } catch (IOException e) {\n            Log.e(TAG, e.getMessage());\n        }\n    }\n\n    public static void vibrateWatch(Context c) {\n        ExampleGCMActivity.startWatchApp(c);\n        PebbleDictionary data = new PebbleDictionary();\n        data.addUint8(MSG_CMD_OUT_KEY, (byte) MSG_CMD_VIBRATE);\n        PebbleKit.sendDataToPebble(c, PEBBLE_APP_UUID, data);\n    }\n\n    // Send a broadcast to launch the specified application on the connected Pebble\n    public static void startWatchApp(Context c) {\n        PebbleKit.startAppOnPebble(c, PEBBLE_APP_UUID);\n    }\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/example/PebbleKitExample/ExampleGolfActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.view.View;\nimport android.widget.TextView;\nimport com.getpebble.android.kit.Constants;\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\n\nimport java.util.Random;\n\n/**\n * Sample code demonstrating how Android applications can send+receive data using the 'Golf' app,\n * one of Pebble's built-in sports watch-apps.\n */\npublic class ExampleGolfActivity extends Activity {\n\n    private final Random rand = new Random();\n    private PebbleKit.PebbleDataReceiver dataReceiver;\n    private int appData[][] = new int[18][4];\n    private int selection = 0;\n\n    // Generate random (but somewhat believable) values to be displayed on the watch.\n    private void generateGolfData() {\n        for (int i = 0; i < appData.length; ++i) {\n            int backDistance = rand.nextInt(800) + 50;\n            appData[i][0] = 1 + rand.nextInt(5); // par\n            appData[i][1] = backDistance; // back of the green\n            appData[i][2] = backDistance - 15; // middle of the green\n            appData[i][3] = backDistance - 30; // front of the green\n        }\n    }\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_golf);\n        generateGolfData();\n        selection = 0;\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (dataReceiver != null) {\n            unregisterReceiver(dataReceiver);\n            dataReceiver = null;\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n\n        updateUi();\n\n        // In order to interact with the UI thread from a broadcast receiver, we need to perform any updates through\n        // an Android handler. For more information, see: http://developer.android.com/reference/android/os/Handler.html\n        final Handler handler = new Handler();\n\n        // To receive data back from the sports watch-app, android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        //\n        // In this example, we're registering a receiver to listen for\n        // button presses sent from the watch, allowing us to page\n        // through the holes displayed on the phone and watch.\n        dataReceiver = new PebbleKit.PebbleDataReceiver(Constants.GOLF_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                final int cmd = data.getUnsignedInteger(Constants.GOLF_CMD_KEY).intValue();\n\n                handler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        // All data received from the Pebble must be ACK'd, otherwise you'll hit time-outs in the\n                        // watch-app which will cause the watch to feel \"laggy\" during periods of frequent\n                        // communication.\n                        PebbleKit.sendAckToPebble(context, transactionId);\n\n                        switch (cmd) {\n                            case Constants.GOLF_CMD_NEXT:\n                                next();\n                                break;\n                            case Constants.GOLF_CMD_PREV:\n                                previous();\n                                break;\n                        }\n                    }\n                });\n            }\n        };\n        PebbleKit.registerReceivedDataHandler(this, dataReceiver);\n    }\n\n    // Send a broadcast to launch the specified application on the connected Pebble\n    public void startWatchApp(View view) {\n        PebbleKit.startAppOnPebble(getApplicationContext(), Constants.GOLF_UUID);\n    }\n\n    // Send a broadcast to close the specified application on the connected Pebble\n    public void stopWatchApp(View view) {\n        PebbleKit.closeAppOnPebble(getApplicationContext(), Constants.GOLF_UUID);\n    }\n\n    // A custom icon and name can be applied to the golf-app to\n    // provide some support for \"branding\" your Pebble-enabled sports\n    // application on the watch.\n    //\n    // It is recommended that applications customize the sports\n    // application before launching it. Only one application may\n    // customize the sports application at a time on a first-come,\n    // first-serve basis.\n    public void customizeWatchApp(View view) {\n        final String customAppName = \"My Golf App\";\n        final Bitmap customIcon = BitmapFactory.decodeResource(getResources(), R.drawable.watch);\n\n        PebbleKit.customizeWatchApp(\n                getApplicationContext(), Constants.PebbleAppType.GOLF, customAppName, customIcon);\n    }\n\n    // Update the Activity with the data for a given hole\n    public void updateUi() {\n        int holeInfo[] = appData[selection];\n\n        String holePar = String.format(\"Hole: %d Par: %d\", selection + 1, holeInfo[0]);\n        String back = String.format(\"%d\", holeInfo[1]);\n        String mid = String.format(\"%d\", holeInfo[2]);\n        String front = String.format(\"%d\", holeInfo[3]);\n\n        TextView parText = (TextView) findViewById(R.id.textHole);\n        parText.setText(holePar);\n\n        TextView backText = (TextView) findViewById(R.id.textBack);\n        backText.setText(back);\n\n        TextView midText = (TextView) findViewById(R.id.textMiddle);\n        midText.setText(mid);\n\n        TextView frontText = (TextView) findViewById(R.id.textFront);\n        frontText.setText(front);\n    }\n\n    // Push {range, hole, par} data to be displayed on Pebble's Golf app.\n    // To simplify formatting, values are transmitted to Pebble as null-terminated strings.\n    public void updateWatch() {\n        int holeInfo[] = appData[selection];\n\n        String hole = String.format(\"%d\", selection + 1);\n        String par = String.format(\"%d\", holeInfo[0]);\n        String back = String.format(\"%d\", holeInfo[1]);\n        String mid = String.format(\"%d\", holeInfo[2]);\n        String front = String.format(\"%d\", holeInfo[3]);\n\n        // All data sent handled by PebbleKit is wrapped in a PebbleDictionary. The interface is somewhat similar to\n        // Map<Integer, Object>, as PebbleDictionaries may contain heterogeneous types.\n        //\n        // Here we are building up a Dictionary that maps integer keys to String values that will be interpreted &\n        // displayed by the watch.\n        PebbleDictionary data = new PebbleDictionary();\n        data.addString(Constants.GOLF_HOLE_KEY, hole);\n        data.addString(Constants.GOLF_PAR_KEY, par);\n        data.addString(Constants.GOLF_BACK_KEY, back);\n        data.addString(Constants.GOLF_MID_KEY, mid);\n        data.addString(Constants.GOLF_FRONT_KEY, front);\n\n        // Once the dictionary has been populated, it is scheduled to be sent to the watch. The sender/recipient of\n        // all PebbleKit messages is determined by the UUID. In this case, since we're sending the data to the golf app,\n        // we specify the Golf UUID.\n        PebbleKit.sendDataToPebble(getApplicationContext(), Constants.GOLF_UUID, data);\n    }\n\n    private void previous() {\n        if (selection > 0) {\n            selection -= 1;\n        }\n\n        updateUi();\n        updateWatch();\n    }\n\n    public void goPrevious(View view) {\n        previous();\n    }\n\n    public void next() {\n        if (selection < 17) {\n            selection += 1;\n        }\n\n        updateUi();\n        updateWatch();\n    }\n\n    public void goNext(View view) {\n        next();\n    }\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/example/PebbleKitExample/ExampleSmsActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.database.Cursor;\nimport android.location.*;\nimport android.telephony.PhoneNumberUtils;\nimport android.text.format.DateUtils;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.provider.ContactsContract;\nimport android.provider.ContactsContract.Contacts;\nimport android.provider.ContactsContract.CommonDataKinds.Phone;\nimport android.telephony.SmsManager;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.EditText;\n\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\n\nimport java.util.Random;\nimport java.util.UUID;\nimport java.util.List;\n\n/**\n * Sample activity that sends an SMS containing the user's location when the user presses a button on the watch *\n */\npublic class ExampleSmsActivity extends Activity {\n\n    private final String TAG = \"ExampleSmsActivity\";\n    private final String PREF_SMS_ACTIVITY = \"pref_sms\";\n    private final String PREF_NUMBER = \"phone_number\";\n\n    private final Random rand = new Random();\n    private final static UUID PEBBLE_APP_UUID = UUID.fromString(\"EC7EE5C6-8DDF-4089-AA84-C3396A11CC95\");\n    private final static int CMD_KEY = 0x00;\n    private final static int CMD_UP = 0x01;\n\n    private final static int REQUEST_CONTACT = 0x01;\n\n    private PebbleKit.PebbleDataReceiver dataReceiver;\n\n    private LocationManager mLocationManager;\n    private String mProviderName;\n    private Handler mHandler;\n\n    private boolean mLocationPending;\n\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_sms);\n\n        // allocate instance of the LocationManager\n        mLocationManager =\n                (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);\n\n        Criteria criteria = new Criteria();\n        criteria.setAccuracy(Criteria.ACCURACY_FINE);\n        criteria.setCostAllowed(false);\n\n        mProviderName = mLocationManager.getBestProvider(criteria, true);\n\n        mHandler = new Handler();\n\n        loadLastNumber();\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (dataReceiver != null) {\n            unregisterReceiver(dataReceiver);\n            dataReceiver = null;\n        }\n\n        mLocationManager.removeUpdates(mLocationListener);\n        saveLastNumber();\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        // In order to interact with the UI thread from a broadcast receiver, we need to perform any updates through\n        // an Android handler. For more information, see: http://developer.android.com/reference/android/os/Handler.html\n\n        // To receive data back from the app, android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        //\n        // In this example, we're registering a receiver to listen for\n        // button presses sent from the watch\n\n        dataReceiver = new PebbleKit.PebbleDataReceiver(PEBBLE_APP_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                final int cmd = data.getUnsignedInteger(CMD_KEY).intValue();\n\n                mHandler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        // All data received from the Pebble must be ACK'd, otherwise you'll hit time-outs in the\n                        // watch-app which will cause the watch to feel \"laggy\" during periods of frequent\n                        // communication.\n                        PebbleKit.sendAckToPebble(context, transactionId);\n\n                        switch (cmd) {\n                            // send SMS when the up button is pressed\n                            case CMD_UP:\n                                requestLocationForSms();\n                                break;\n                            default:\n                                break;\n                        }\n                    }\n                });\n            }\n        };\n        PebbleKit.registerReceivedDataHandler(this, dataReceiver);\n        startWatchApp(null);\n    }\n\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        if (resultCode == RESULT_OK) {\n            if(data != null && requestCode == REQUEST_CONTACT) {\n                Uri uriOfPhoneNumberRecord = data.getData();\n                String idOfPhoneRecord = uriOfPhoneNumberRecord.getLastPathSegment();\n                Cursor cursor = getContentResolver().query(Phone.CONTENT_URI, new String[]{Phone.NUMBER}, Phone._ID + \"=?\", new String[]{idOfPhoneRecord}, null);\n                if(cursor != null) {\n                    if(cursor.getCount() > 0) {\n                        cursor.moveToFirst();\n                        String formattedPhoneNumber = cursor.getString( cursor.getColumnIndex(Phone.NUMBER) );\n                        if (formattedPhoneNumber != null) {\n                            EditText destinationEditText = (EditText)findViewById(R.id.destinationNumber);\n                            destinationEditText.setText(PhoneNumberUtils.stripSeparators(formattedPhoneNumber));\n                        }\n                    }\n                    cursor.close();\n                }\n            }\n        }\n    }\n\n    public void pickContact(View view) {\n        Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);\n        intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);\n        startActivityForResult(intent, 1);\n    }\n\n    protected void loadLastNumber() {\n        SharedPreferences settings = getSharedPreferences(PREF_SMS_ACTIVITY, 0);\n        String number = settings.getString(PREF_NUMBER, \"\");\n\n        EditText destinationEditText = (EditText)findViewById(R.id.destinationNumber);\n        destinationEditText.setText(number);\n    }\n\n    protected void saveLastNumber() {\n        EditText destinationEditText = (EditText)findViewById(R.id.destinationNumber);\n        String destinationNumber = destinationEditText.getText().toString();\n        if (destinationNumber == null || destinationNumber.equals(\"\")) {\n            return;\n        }\n\n        SharedPreferences settings = getSharedPreferences(PREF_SMS_ACTIVITY, 0);\n        SharedPreferences.Editor editor = settings.edit();\n        editor.putString(PREF_NUMBER, destinationNumber);\n\n        editor.commit();\n    }\n\n    // Send a broadcast to launch the specified application on the connected Pebble\n    public void startWatchApp(View view) {\n        PebbleKit.startAppOnPebble(getApplicationContext(), PEBBLE_APP_UUID);\n    }\n\n    // Send a broadcast to close the specified application on the connected Pebble\n    public void stopWatchApp(View view) {\n        PebbleKit.closeAppOnPebble(getApplicationContext(), PEBBLE_APP_UUID);\n    }\n\n    private final LocationListener mLocationListener = new LocationListener() {\n        @Override\n        public void onLocationChanged(Location location) {\n            sendLocationSms(location);\n            mLocationManager.removeUpdates(this);\n        }\n\n        @Override\n        public void onStatusChanged(String provider, int status, Bundle bundle) {\n            Log.e(TAG, \"onStatusChanged\");\n        }\n\n        @Override\n        public void onProviderEnabled(String provider) {\n            Log.e(TAG, \"onProviderEnabled\");\n        }\n\n        @Override\n        public void onProviderDisabled(String provider) {\n            Log.e(TAG, \"onProviderDisabled\");\n        }\n    };\n\n    public void requestLocationForSms() {\n        if (mProviderName != null && mLocationPending == false) {\n            mLocationPending = true;\n\n            Location lastLocation = mLocationManager.getLastKnownLocation(mProviderName);\n             // if we have a location that's newer than 10 minutes, use it; otherwise get a new location\n            if (lastLocation != null && (System.currentTimeMillis() - lastLocation.getTime() > DateUtils.MINUTE_IN_MILLIS * 10)) {\n                mLocationManager.requestLocationUpdates(mProviderName,\n                    10000,\n                    10,\n                    mLocationListener);\n            } else {\n                 sendLocationSms(lastLocation);\n            }\n        }\n    }\n\n    public void sendLocationSms(Location l) {\n        if (mLocationPending) {\n            mLocationPending = false;\n\n            EditText destinationEditText = (EditText)findViewById(R.id.destinationNumber);\n            String destinationNumber = destinationEditText.getText().toString();\n            if (destinationNumber == null || destinationNumber.equals(\"\")) {\n                return;\n            }\n\n            // send SMS with GPS coordinates\n            SmsManager smsManager = SmsManager.getDefault();\n            String locationString = \"Get me: \" + l.getLatitude() + \", \" + l.getLongitude();\n            smsManager.sendTextMessage(destinationNumber, null, locationString, null, null);\n\n            // get address text if we can\n            Geocoder geocoder = new Geocoder(ExampleSmsActivity.this);\n\n            try {\n                List<Address> addresses = geocoder.getFromLocation(l.getLatitude(), l.getLongitude(), 1);\n\n                if (addresses.size() > 0) {\n                    Address a = addresses.get(0);\n                    String addressText = \"\";\n                    for (int i = 0; i <= a.getMaxAddressLineIndex(); i++) {\n                        addressText += a.getAddressLine(i) + \" \";\n                    }\n                    vibrateWatch(getApplicationContext());\n                    smsManager.sendTextMessage(destinationNumber, null, addressText, null, null);\n                }\n            } catch (Exception e) {\n                // unable to geocode\n            }\n        }\n    }\n\n    public static void vibrateWatch(Context c) {\n        PebbleDictionary data = new PebbleDictionary();\n        data.addUint8(CMD_KEY, (byte) CMD_UP);\n        PebbleKit.sendDataToPebble(c, PEBBLE_APP_UUID, data);\n    }\n\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/example/PebbleKitExample/ExampleSportsActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.view.View;\nimport android.widget.TextView;\nimport com.getpebble.android.kit.Constants;\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\n\nimport java.util.Random;\n\n/**\n * Sample code demonstrating how Android applications can send+receive data using the 'Sports' app, one of Pebble's\n * built-in watch-apps that supports app messaging.\n */\npublic class ExampleSportsActivity extends Activity {\n\n    private static final String TAG = \"ExampleSportsActivity\";\n\n    private final Random rand = new Random();\n    private PebbleKit.PebbleDataReceiver sportsDataHandler = null;\n    private int sportsState = Constants.SPORTS_STATE_INIT;\n    private boolean useMetric = false;\n    private boolean isPaceLabel = true;\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_sports);\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (sportsDataHandler != null) {\n            unregisterReceiver(sportsDataHandler);\n            sportsDataHandler = null;\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        final Handler handler = new Handler();\n\n        // To receive data back from the sports watch-app, Android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        //\n        // In this example, we're registering a receiver to listen for\n        // changes in the activity state sent from the watch, allowing\n        // us the pause/resume the activity when the user presses a\n        // button in the watch-app.\n        sportsDataHandler = new PebbleKit.PebbleDataReceiver(Constants.SPORTS_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                int newState = data.getUnsignedInteger(Constants.SPORTS_STATE_KEY).intValue();\n                sportsState = newState;\n\n                PebbleKit.sendAckToPebble(context, transactionId);\n\n                handler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        updateUi();\n                    }\n                });\n            }\n        };\n        PebbleKit.registerReceivedDataHandler(this, sportsDataHandler);\n    }\n\n    public void updateUi() {\n        TextView statusText = (TextView) findViewById(R.id.status);\n        if (sportsState == Constants.SPORTS_STATE_RUNNING) {\n            statusText.setText(\"Running\");\n        } else {\n            statusText.setText(\"Paused\");\n        }\n    }\n\n    // Send a broadcast to launch the specified application on the connected Pebble\n    public void startWatchApp(View view) {\n        PebbleKit.startAppOnPebble(getApplicationContext(), Constants.SPORTS_UUID);\n    }\n\n    // Send a broadcast to close the specified application on the connected Pebble\n    public void stopWatchApp(View view) {\n        PebbleKit.closeAppOnPebble(getApplicationContext(), Constants.SPORTS_UUID);\n    }\n\n    // A custom icon and name can be applied to the sports-app to\n    // provide some support for \"branding\" your Pebble-enabled sports\n    // application on the watch.\n    //\n    // It is recommended that applications customize the sports\n    // application before launching it. Only one application may\n    // customize the sports application at a time on a first-come,\n    // first-serve basis.\n    public void customizeWatchApp(View view) {\n        final String customAppName = \"My Sports App\";\n        final Bitmap customIcon = BitmapFactory.decodeResource(getResources(), R.drawable.watch);\n\n        PebbleKit.customizeWatchApp(\n                getApplicationContext(), Constants.PebbleAppType.SPORTS, customAppName, customIcon);\n    }\n\n    // Push (distance, time, pace) data to be displayed on Pebble's Sports app.\n    //\n    // To simplify formatting, values are transmitted to the watch as strings.\n    public void updateWatchApp(View view) {\n        String time = String.format(\"%02d:%02d\", rand.nextInt(60), rand.nextInt(60));\n        String distance = String.format(\"%02.02f\", 32 * rand.nextDouble());\n\tString addl_data = String.format(\"%02d:%02d\", rand.nextInt(10), rand.nextInt(60));\n\n        PebbleDictionary data = new PebbleDictionary();\n        data.addString(Constants.SPORTS_TIME_KEY, time);\n        data.addString(Constants.SPORTS_DISTANCE_KEY, distance);\n\tdata.addString(Constants.SPORTS_DATA_KEY, addl_data);\n\tdata.addUint8(Constants.SPORTS_LABEL_KEY, (byte) (isPaceLabel ? Constants.SPORTS_DATA_SPEED : Constants.SPORTS_DATA_PACE));\n\n        PebbleKit.sendDataToPebble(getApplicationContext(), Constants.SPORTS_UUID, data);\n\tisPaceLabel = !isPaceLabel;\n    }\n\n    // The units in the sports app can be toggled between Metric (1) and Imperial (0)\n    // by sending the following message to Pebble once the sports app is running.\n    public void changeUnitsOnWatch(View view) {\n        PebbleDictionary data = new PebbleDictionary();\n        data.addUint8(Constants.SPORTS_UNITS_KEY,\n                (byte) (useMetric ? Constants.SPORTS_UNITS_METRIC : Constants.SPORTS_UNITS_IMPERIAL));\n\n        PebbleKit.sendDataToPebble(getApplicationContext(), Constants.SPORTS_UUID, data);\n        useMetric = !useMetric;\n    }\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/example/PebbleKitExample/ExampleWeatherActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.location.Criteria;\nimport android.location.Location;\nimport android.location.LocationListener;\nimport android.location.LocationManager;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.Toast;\n\nimport com.getpebble.android.kit.PebbleKit;\nimport com.getpebble.android.kit.util.PebbleDictionary;\nimport org.json.JSONObject;\n\nimport java.io.BufferedReader;\nimport java.io.InputStreamReader;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.util.UUID;\n\n/**\n * Sample activity demonstrating how to send data to a \"weather\" watch-app.\n *\n * The watch-app in question is available here:\n * https://github.com/pebble/pebble-apps/tree/master/demos/feature_app_messages\n *\n * @author zulak@getpebble.com\n */\npublic class ExampleWeatherActivity extends Activity {\n    // the tuple key corresponding to the weather icon displayed on the watch\n    private static final int ICON_KEY = 0;\n    // the tuple key corresponding to the temperature displayed on the watch\n    private static final int TEMP_KEY = 1;\n    // This UUID identifies the weather app\n    private static final UUID WEATHER_UUID = UUID.fromString(\"28AF3DC7-E40D-490F-BEF2-29548C8B0600\");\n\n    private LocationManager mLocationManager;\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_weather);\n        mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);\n    }\n\n    public void updateWeather(View view) {\n        // when this button is clicked, get the handset's approximate location and request weather data from a\n        // third-party web service\n        LocationListener locationListener = new LocationListener() {\n            public void onLocationChanged(Location location) {\n                mLocationManager.removeUpdates(this);\n                doWeatherUpdate(location);\n            }\n\n            public void onStatusChanged(String provider, int status, Bundle extras) {\n            }\n\n            public void onProviderEnabled(String provider) {\n            }\n\n            public void onProviderDisabled(String provider) {\n            }\n        };\t\n        \n        String locationProvider = mLocationManager.getBestProvider(new Criteria(), true);\n        \n        if (locationProvider == null) {\n        \tToast.makeText(getApplicationContext(), \"No location services enabled.\",\n        \t\t\t   Toast.LENGTH_LONG).show();\n        } else {\n        \tmLocationManager.requestLocationUpdates(locationProvider, 0, 0, locationListener);\n        }\n\n        \n    }\n\n    public void sendWeatherDataToWatch(int weatherIconId, int temperatureCelsius) {\n        // Build up a Pebble dictionary containing the weather icon and the current temperature in degrees celsius\n        PebbleDictionary data = new PebbleDictionary();\n        data.addUint8(ICON_KEY, (byte) weatherIconId);\n        data.addString(TEMP_KEY, String.format(\"%d\\u00B0C\", temperatureCelsius));\n\n        // Send the assembled dictionary to the weather watch-app; this is a no-op if the app isn't running or is not\n        // installed\n        PebbleKit.sendDataToPebble(getApplicationContext(), WEATHER_UUID, data);\n    }\n\n    public void doWeatherUpdate(Location location) {\n        // A very sketchy, rough way of getting the local weather forecast from the phone's approximate location\n        // using the OpenWeatherMap webservice: http://openweathermap.org/wiki/API/JSON_API\n        double latitude = location.getLatitude();\n        double longitude = location.getLongitude();\n\n        try {\n            URL u = new URL(String.format(\"http://api.openweathermap.org/data/2.1/find/city?lat=%f&lon=%f&cnt=1\",\n                    latitude,\n                    longitude));\n\n            HttpURLConnection urlConnection = (HttpURLConnection) u.openConnection();\n            try {\n                BufferedReader reader =\n                        new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), \"UTF-8\"));\n                String json = reader.readLine();\n\n                JSONObject jsonObject = new JSONObject(json);\n                JSONObject l = jsonObject.getJSONArray(\"list\").getJSONObject(0);\n                JSONObject m = l.getJSONObject(\"main\");\n                double temperature = m.getDouble(\"temp\");\n                int wtype = l.getJSONArray(\"weather\").getJSONObject(0).getInt(\"id\");\n\n                int weatherIcon = getIconFromWeatherId(wtype);\n                int temp = (int) (temperature - 273.15);\n\n                sendWeatherDataToWatch(weatherIcon, temp);\n            } finally {\n                urlConnection.disconnect();\n            }\n\n            Log.d(\"WeatherActivity\", String.format(\"%f, %f\", latitude, longitude));\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    private int getIconFromWeatherId(int weatherId) {\n        if (weatherId < 600) {\n            return 2;\n        } else if (weatherId < 700) {\n            return 3;\n        } else if (weatherId > 800) {\n            return 1;\n        } else {\n            return 0;\n        }\n    }\n\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/example/PebbleKitExample/GCMIntentService.java",
    "content": "\npackage com.example.PebbleKitExample;\n\nimport android.app.Notification;\nimport android.app.NotificationManager;\nimport android.app.PendingIntent;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.util.Log;\n\nimport com.google.android.gcm.GCMBaseIntentService;\nimport com.google.android.gcm.GCMRegistrar;\n\n/**\n * IntentService responsible for handling GCM messages.\n */\npublic class GCMIntentService extends GCMBaseIntentService {\n\n    @SuppressWarnings(\"hiding\")\n    private static final String TAG = \"GCMIntentService\";\n\n    public GCMIntentService() {\n        super(ExampleGCMActivity.SENDER_ID);\n    }\n\n    @Override\n    protected void onRegistered(Context context, String registrationId) {\n        Log.i(TAG, \"Device registered: regId = \" + registrationId);\n        ExampleGCMActivity.myGcmId = registrationId;\n        GCMRegistrar.setRegisteredOnServer(context, true);\n    }\n\n    @Override\n    protected void onUnregistered(Context context, String registrationId) {\n         Log.i(TAG, \"Ignoring unregister callback\");\n    }\n\n    @Override\n    protected void onMessage(Context context, Intent intent) {\n        Log.i(TAG, \"Received message\");\n//        generateNotification(context, \"GCM message received!\");\n        vibrateWatch(context);\n    }\n\n    @Override\n    protected void onDeletedMessages(Context context, int total) {\n        Log.i(TAG, \"Received deleted messages notification\");\n    }\n\n    @Override\n    public void onError(Context context, String errorId) {\n        Log.i(TAG, \"Received error: \" + errorId);\n    }\n\n    @Override\n    protected boolean onRecoverableError(Context context, String errorId) {\n        // log message\n        Log.i(TAG, \"Received recoverable error: \" + errorId);\n        return super.onRecoverableError(context, errorId);\n    }\n\n    /**\n     * Issues a notification to inform the user that server has sent a message.\n     */\n    private static void generateNotification(Context context, String message) {\n        int icon = R.drawable.watch;\n        long when = System.currentTimeMillis();\n        NotificationManager notificationManager = (NotificationManager)\n                context.getSystemService(Context.NOTIFICATION_SERVICE);\n        Notification notification = new Notification(icon, message, when);\n        String title = context.getString(R.string.app_name);\n        Intent notificationIntent = new Intent(context, ExampleGCMActivity.class);\n        // set intent so it does not start a new activity\n        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |\n                Intent.FLAG_ACTIVITY_SINGLE_TOP);\n        PendingIntent intent =\n                PendingIntent.getActivity(context, 0, notificationIntent, 0);\n        notification.setLatestEventInfo(context, title, message, intent);\n        notification.flags |= Notification.FLAG_AUTO_CANCEL;\n        notificationManager.notify(0, notification);\n    }\n\n    private void vibrateWatch(Context c) {\n        ExampleGCMActivity.vibrateWatch(c);\n    }\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/example/PebbleKitExample/MainActivity.java",
    "content": "package com.example.PebbleKitExample;\n\nimport android.R;\nimport android.app.ListActivity;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.view.View;\nimport android.widget.ArrayAdapter;\nimport android.widget.ListView;\nimport com.example.PebbleKitExample.TodoList.ExampleTodoListActivity;\n\npublic class MainActivity extends ListActivity {\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        String[] menu = {\n                \"Sports App Example\",\n                \"Golf App Example\",\n                \"Weather App Example\",\n                \"To-Do List Example\",\n                \"GPS/SMS App Example\",\n                \"GCM Activity\"\n        };\n\n        setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_1, menu));\n    }\n\n    @Override\n    protected void onListItemClick(final ListView l, final View v, final int position, final long id) {\n        Intent intent = null;\n        switch (position) {\n            case 0:\n                intent = new Intent(this, ExampleSportsActivity.class);\n                break;\n            case 1:\n                intent = new Intent(this, ExampleGolfActivity.class);\n                break;\n            case 2:\n                intent = new Intent(this, ExampleWeatherActivity.class);\n                break;\n            case 3:\n                intent = new Intent(this, ExampleTodoListActivity.class);\n                break;\n            case 4:\n                intent = new Intent(this, ExampleSmsActivity.class);\n                break;\n            case 5:\n                intent = new Intent(this, ExampleGCMActivity.class);\n                break;\n        }\n\n        if (intent != null) {\n            startActivity(intent);\n        }\n    }\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/example/PebbleKitExample/TodoList/CheckableLinearLayout.java",
    "content": "package com.example.PebbleKitExample.TodoList;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.widget.Checkable;\nimport android.widget.LinearLayout;\n\npublic class CheckableLinearLayout extends LinearLayout implements Checkable {\n\n    private static final int CHECKABLE_CHILD_INDEX = 1;\n    private Checkable child;\n\n    public CheckableLinearLayout(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    @Override\n    protected void onFinishInflate() {\n        super.onFinishInflate();\n        child = (Checkable) getChildAt(CHECKABLE_CHILD_INDEX);\n    }\n\n    @Override\n    public boolean isChecked() {\n        return child.isChecked();\n    }\n\n    @Override\n    public void setChecked(boolean checked) {\n        child.setChecked(checked);\n    }\n\n    @Override\n    public void toggle() {\n        child.toggle();\n    }\n\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/example/PebbleKitExample/TodoList/ExampleTodoListActivity.java",
    "content": "package com.example.PebbleKitExample.TodoList;\n\nimport android.app.AlertDialog;\nimport android.app.Dialog;\nimport android.app.ListActivity;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.os.*;\nimport android.util.Log;\nimport android.view.*;\nimport android.widget.AdapterView;\nimport android.widget.EditText;\nimport com.example.PebbleKitExample.R;\nimport com.getpebble.android.kit.PebbleKit;\n import com.getpebble.android.kit.util.PebbleDictionary;\nimport com.mobeta.android.dslv.DragSortListView;\n\nimport java.util.HashSet;\nimport java.util.UUID;\nimport java.util.concurrent.BlockingQueue;\nimport java.util.concurrent.LinkedBlockingQueue;\n\n/**\n * Sample activity demonstrating how to synchronize data with a \"To-Do List\" watch-app.\n */\npublic class ExampleTodoListActivity extends ListActivity {\n    private PebbleKit.PebbleDataReceiver dataReceiver;\n    private PebbleKit.PebbleAckReceiver ackReceiver;\n    private PebbleKit.PebbleNackReceiver nackReceiver;\n\n    private static final int APPEND_KEY = 0;\n    private static final int DELETE_KEY = 1;\n    private static final int MOVE_KEY = 2;\n    private static final int TOGGLE_KEY = 3;\n    private static final int FETCH_KEY = 4;\n\n    private static final UUID TODO_LIST_UUID = UUID.fromString(\"e0ca665a-cf96-4c09-bbea-aa113e8cc18f\");\n\n    private TodoListAdapter todoListAdapter;\n    private DialogManager dialogManager = new DialogManager();\n    private final MessageManager messageManager = new MessageManager();\n\n    /**\n     * Manages a thread-safe message queue using a Looper worker thread to complete blocking tasks.\n     */\n    public class MessageManager implements Runnable {\n        public Handler messageHandler;\n        private final BlockingQueue<PebbleDictionary> messageQueue = new LinkedBlockingQueue<PebbleDictionary>();\n        private Boolean isMessagePending = Boolean.valueOf(false);\n\n        @Override\n        public void run() {\n            Looper.prepare();\n            messageHandler = new Handler() {\n                @Override\n                public void handleMessage(Message msg) {\n                    Log.w(this.getClass().getSimpleName(), \"Please post() your blocking runnables to Mr Manager, \" +\n                            \"don't use sendMessage()\");\n                }\n\n            };\n            Looper.loop();\n        }\n\n        private void consumeAsync() {\n            messageHandler.post(new Runnable() {\n                @Override\n                public void run() {\n                    synchronized (isMessagePending) {\n                        if (isMessagePending.booleanValue()) {\n                            return;\n                        }\n\n                        synchronized (messageQueue) {\n                            if (messageQueue.size() == 0) {\n                                return;\n                            }\n                            PebbleKit.sendDataToPebble(getApplicationContext(), TODO_LIST_UUID, messageQueue.peek());\n                        }\n\n                        isMessagePending = Boolean.valueOf(true);\n                    }\n                }\n            });\n        }\n\n        public void notifyAckReceivedAsync() {\n            messageHandler.post(new Runnable() {\n                @Override\n                public void run() {\n                    synchronized (isMessagePending) {\n                        isMessagePending = Boolean.valueOf(false);\n                    }\n                    messageQueue.remove();\n                }\n            });\n            consumeAsync();\n        }\n\n        public void notifyNackReceivedAsync() {\n            messageHandler.post(new Runnable() {\n                @Override\n                public void run() {\n                    synchronized (isMessagePending) {\n                        isMessagePending = Boolean.valueOf(false);\n                    }\n                }\n            });\n            consumeAsync();\n        }\n\n        public boolean offer(final PebbleDictionary data) {\n            final boolean success = messageQueue.offer(data);\n\n            if (success) {\n                consumeAsync();\n            }\n\n            return success;\n        }\n    }\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_todo_list);\n\n        todoListAdapter = TodoListAdapter.createTodoListAdapter(getApplicationContext());\n\n        // Populate list before starting app on the Pebble\n        String[] dummyItems = getResources().getStringArray(R.array.jazz_artist_names);\n        todoListAdapter.addItems(dummyItems);\n\n        setListAdapter(todoListAdapter);\n        final DragSortListView dslv = getListViewAsDSLV();\n\n        dslv.setDropListener(new DragSortListView.DropListener() {\n            @Override\n            public void drop(final int from, final int to) {\n                if (from == to) {\n                    return;\n                }\n                todoListAdapter.moveItemFromIndexToIndex(from, to);\n                dslv.moveCheckState(from, to);\n\n                PebbleDictionary data = new PebbleDictionary();\n                data.addBytes(MOVE_KEY, new byte[]{(byte) from, (byte) to});\n                messageManager.offer(data);\n            }\n        });\n\n        dslv.setRemoveListener(new DragSortListView.RemoveListener() {\n            @Override\n            public void remove(final int which) {\n                final TodoListItem item = todoListAdapter.removeItemAtIndex(which);\n                if (item == null) {\n                    return;\n                }\n\n                dslv.removeCheckState(which);\n\n                // Notify the watch\n                PebbleDictionary data = new PebbleDictionary();\n                data.addUint8(DELETE_KEY, (byte) which);\n                messageManager.offer(data);\n            }\n        });\n\n        dslv.setOnItemClickListener(new AdapterView.OnItemClickListener() {\n            @Override\n            public void onItemClick(final AdapterView<?> parentAdapterView, final View view, final int position,\n                                    final long rowId) {\n                todoListAdapter.toggleItemCompletenessAtIndex(position);\n                PebbleDictionary data = new PebbleDictionary();\n                data.addUint8(TOGGLE_KEY, (byte) position);\n                messageManager.offer(data);\n            }\n        });\n\n        PebbleKit.startAppOnPebble(getApplicationContext(), TODO_LIST_UUID);\n    }\n\n    @Override\n    public void onStart() {\n        // FIXME do I need to do any cleanup in onStop()?\n        super.onStart();\n        new Thread(messageManager).start();\n\n    }\n\n    private DragSortListView getListViewAsDSLV() {\n        return (DragSortListView) super.getListView();\n    }\n\n    @Override\n    public DragSortListView getListView() {\n        return getListViewAsDSLV();\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n\n        // Always deregister any Activity-scoped BroadcastReceivers when the Activity is paused\n        if (dataReceiver != null) {\n            unregisterReceiver(dataReceiver);\n            dataReceiver = null;\n        }\n\n        if (ackReceiver != null) {\n            unregisterReceiver(ackReceiver);\n            ackReceiver = null;\n        }\n\n        if (nackReceiver != null) {\n            unregisterReceiver(nackReceiver);\n            nackReceiver = null;\n        }\n\n        dialogManager.dismissAll();\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        // In order to interact with the UI thread from a broadcast receiver, we need to perform any updates through\n        // an Android handler. For more information, see: http://developer.android.com/reference/android/os/Handler\n        // .html\n        final Handler handler = new Handler();\n\n        // To receive data back from a watch-app, android\n        // applications must register a \"DataReceiver\" to operate on the\n        // dictionaries received from the watch.\n        dataReceiver = new PebbleKit.PebbleDataReceiver(TODO_LIST_UUID) {\n            @Override\n            public void receiveData(final Context context, final int transactionId, final PebbleDictionary data) {\n                handler.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        // All data received from the Pebble must be ACK'd, otherwise you'll hit time-outs in the\n                        // watch-app which will cause the watch to feel \"laggy\" during periods of frequent\n                        // communication.\n                        PebbleKit.sendAckToPebble(context, transactionId);\n\n                        if (!data.iterator().hasNext()) {\n                            return;\n                        }\n\n                        final DragSortListView dslv = getListViewAsDSLV();\n\n                        final Long deleteValue = data.getUnsignedInteger(DELETE_KEY);\n                        if (deleteValue != null) {\n                            final int value = deleteValue.intValue();\n                            final TodoListItem item = todoListAdapter.removeItemAtIndex(value);\n                            if (item == null) {\n                                return;\n                            }\n\n                            dslv.removeCheckState(value);\n                        }\n\n                        final Long toggleValue = data.getUnsignedInteger(TOGGLE_KEY);\n                        if (toggleValue != null) {\n                            final int value = toggleValue.intValue();\n                            todoListAdapter.toggleItemCompletenessAtIndex(value);\n                            dslv.setItemChecked(value, todoListAdapter.getItem(value).isComplete());\n                        }\n\n                        final Long fetchValue = data.getUnsignedInteger(FETCH_KEY);\n                        if (fetchValue != null) {\n                            // Add entire list to messageQueue\n                            for (int i = 0; i < todoListAdapter.getCount(); i++) {\n                                PebbleDictionary data = new PebbleDictionary();\n                                TodoListItem item = todoListAdapter.getItem(i);\n                                data.addString(APPEND_KEY, item.getDescription());\n\n                                if (item.isComplete()) {\n                                    data.addUint8(TOGGLE_KEY, (byte) i);\n                                }\n                                if (!messageManager.offer(data)) {\n                                    return;\n                                }\n                            }\n                        }\n                    }\n                });\n            }\n        };\n\n        PebbleKit.registerReceivedDataHandler(this, dataReceiver);\n\n        ackReceiver = new PebbleKit.PebbleAckReceiver(TODO_LIST_UUID) {\n            @Override\n            public void receiveAck(final Context context, final int transactionId) {\n                messageManager.notifyAckReceivedAsync();\n            }\n        };\n\n        PebbleKit.registerReceivedAckHandler(this, ackReceiver);\n\n\n        nackReceiver = new PebbleKit.PebbleNackReceiver(TODO_LIST_UUID) {\n            @Override\n            public void receiveNack(final Context context, final int transactionId) {\n                messageManager.notifyNackReceivedAsync();\n            }\n        };\n\n        PebbleKit.registerReceivedNackHandler(this, nackReceiver);\n    }\n\n    private static class DialogManager {\n        public void showDialog(Dialog d) {\n            if (mDialogs.contains(d) == false) {\n                mDialogs.add(d);\n            }\n            d.show();\n        }\n\n        public void dismissAll() {\n            for (Dialog d : mDialogs) {\n                if (d != null) {\n                    if (d.isShowing()) {\n                        d.dismiss();\n                    }\n                }\n            }\n            mDialogs.clear();\n        }\n\n        public HashSet<Dialog> mDialogs = new HashSet<Dialog>();\n    }\n\n    private void removeAllCompletedItems() {\n        for (int i = todoListAdapter.getCount() - 1; i >= 0; i--) {\n            final TodoListItem item = todoListAdapter.getItem(i);\n            if (!item.isComplete()) {\n                continue;\n            }\n\n            getListViewAsDSLV().removeCheckState(i);\n            todoListAdapter.remove(item);\n\n            PebbleDictionary data = new PebbleDictionary();\n            data.addUint8(DELETE_KEY, (byte) i);\n            if (!messageManager.offer(data)) {\n                return;\n            }\n        }\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        // Handle item selection\n        switch (item.getItemId()) {\n            case (R.id.add_mi):\n                dialogManager.showDialog(createDialog());\n                return true;\n            case (R.id.remove_all_checked_mi):\n                removeAllCompletedItems();\n                return true;\n            default:\n                return super.onOptionsItemSelected(item);\n        }\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        MenuInflater inflater = getMenuInflater();\n        inflater.inflate(R.menu.options_menu, menu);\n        return true;\n    }\n\n    public Dialog createDialog() {\n        AlertDialog.Builder builder = new AlertDialog.Builder(this);\n        final LayoutInflater inflater = getLayoutInflater();\n\n        // Inflate and set the layout for the dialog\n        // Pass null as the parent view because its going in the dialog layout\n        final View rootView = inflater.inflate(R.layout.dialog_add_todo_item, null);\n        builder.setView(rootView)\n                // Add action buttons\n                .setPositiveButton(R.string.todo_list_add_dialog_ok_button, new DialogInterface.OnClickListener() {\n                    @Override\n                    public void onClick(DialogInterface dialog, int id) {\n                        final EditText editTextWidget = ((EditText) rootView.findViewById(R.id.todo_list_add_item_dialog_description));\n                        final String description = editTextWidget.getText().toString();\n                        final TodoListItem item = todoListAdapter.addItem(description);\n\n                        if (item == null) {\n                            dialog.dismiss();\n                            return;\n                        }\n\n                        final PebbleDictionary data = new PebbleDictionary();\n                        data.addString(APPEND_KEY, item.getDescription());\n                        messageManager.offer(data);\n                        dialog.dismiss();\n                    }\n                })\n                .setNegativeButton(R.string.todo_list_add_dialog_cancel_button, new DialogInterface.OnClickListener() {\n                    public void onClick(DialogInterface dialog, int id) {\n                        dialog.cancel();\n                    }\n                });\n        return builder.create();\n    }\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/example/PebbleKitExample/TodoList/TodoListAdapter.java",
    "content": "package com.example.PebbleKitExample.TodoList;\n\nimport android.content.Context;\nimport android.util.Log;\nimport android.widget.ArrayAdapter;\nimport com.example.PebbleKitExample.R;\n\nimport java.util.LinkedList;\nimport java.util.List;\n\npublic class TodoListAdapter extends ArrayAdapter<TodoListItem> {\n    private final Context mContext;\n    private static final int MAX_TODO_LIST_LENGTH = 10;\n    private static final int MAX_DESCRIPTION_LENGTH = 15;\n\n    private TodoListAdapter(final Context context, final int resource, final int textViewResourceId,\n                            final List<TodoListItem> items) {\n        super(context, resource, textViewResourceId, items);\n        mContext = context;\n    }\n\n    public static TodoListAdapter createTodoListAdapter(final Context context) {\n        final List<TodoListItem> items = new LinkedList<TodoListItem>();\n        // FIXME can getContext() be used here?\n        return new TodoListAdapter(context, R.layout.list_item_checkable, R.id.text, items);\n    }\n\n    public TodoListItem addItem(String description) {\n        if (getCount() >= MAX_TODO_LIST_LENGTH) {\n            return null;\n        }\n\n        if (description == null || description.length() == 0) {\n            return null;\n        }\n\n        // FIXME Can you make this UTF-8 safe? :)\n        if (description.length() >= MAX_DESCRIPTION_LENGTH) {\n            description = description.substring(0, MAX_DESCRIPTION_LENGTH);\n        }\n\n        final TodoListItem item = TodoListItem.getItemWithDescription(description);\n        this.add(item);\n\n        return item;\n    }\n\n    public LinkedList<TodoListItem> addItems(String[] descriptions) {\n        LinkedList<TodoListItem> itemsAdded = new LinkedList<TodoListItem>();\n\n        if (descriptions == null) {\n            Log.w(\"TodoList\", \"Null descriptions...\");\n            return null;\n        }\n\n        for (String description : descriptions) {\n            if (description == null) {\n                continue;\n            }\n\n            final TodoListItem item = addItem(description);\n            if (item != null) {\n                itemsAdded.add(item);\n            }\n        }\n\n        return itemsAdded;\n    }\n\n    public TodoListItem removeItemAtIndex(final int index) {\n        if (index >= getCount()) {\n            return null;\n        }\n        final TodoListItem item = getItem(index);\n        remove(item);\n        return item;\n    }\n\n    public void moveItemFromIndexToIndex(final int sourceIndex, final int destIndex) {\n        if (sourceIndex >= getCount() || destIndex >= getCount()) {\n            return;\n        }\n\n        if (sourceIndex == destIndex) {\n            return;\n        }\n\n        TodoListItem toAdd = getItem(sourceIndex);\n        remove(toAdd);\n\n        if (sourceIndex < destIndex) {\n            insert(toAdd, destIndex + 1);\n            return;\n        }\n\n        insert(toAdd, destIndex);\n    }\n\n    public void toggleItemCompletenessAtIndex(final int index) {\n        if (index >= getCount()) {\n            return;\n        }\n\n        TodoListItem item = getItem(index);\n        item.setComplete(!item.isComplete());\n    }\n\n    public List<String> getDescriptions() {\n        LinkedList<String> descriptions = new LinkedList<String>();\n        for (int i = 0; i < getCount(); i++) {\n            descriptions.add(getItem(i).getDescription());\n        }\n        return descriptions;\n    }\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/example/PebbleKitExample/TodoList/TodoListItem.java",
    "content": "package com.example.PebbleKitExample.TodoList;\n\npublic class TodoListItem {\n    private boolean mIsComplete;\n    private String mDescription;\n\n\n    private TodoListItem(final boolean isComplete, final String description) {\n        mIsComplete = isComplete;\n        mDescription = description;\n    }\n\n    public static TodoListItem getItemWithDescription(final String description) {\n        return new TodoListItem(false, description);\n    }\n\n\n    public boolean isComplete() {\n        return mIsComplete;\n    }\n\n    public void setComplete(final boolean isComplete) {\n        mIsComplete = isComplete;\n    }\n\n    public String getDescription() {\n        return mDescription;\n    }\n\n    public void setDescription(final String description) {\n        mDescription = description;\n    }\n\n    @Override\n    public String toString() {\n        return mDescription;\n    }\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/mobeta/android/dslv/DragSortController.java",
    "content": "package com.mobeta.android.dslv;\n\nimport android.graphics.Point;\nimport android.view.GestureDetector;\nimport android.view.HapticFeedbackConstants;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewConfiguration;\nimport android.widget.AdapterView;\n\n/**\n * Class that starts and stops item drags on a {@link DragSortListView}\n * based on touch gestures. This class also inherits from\n * {@link SimpleFloatViewManager}, which provides basic float View\n * creation.\n *\n * An instance of this class is meant to be passed to the methods\n * {@link DragSortListView#setTouchListener()} and\n * {@link DragSortListView#setFloatViewManager()} of your\n * {@link DragSortListView} instance.\n */\npublic class DragSortController extends SimpleFloatViewManager implements View.OnTouchListener, GestureDetector.OnGestureListener {\n\n    /**\n     * Drag init mode enum.\n     */\n    public static final int ON_DOWN = 0;\n    public static final int ON_DRAG = 1;\n    public static final int ON_LONG_PRESS = 2;\n\n    private int mDragInitMode = ON_DOWN;\n\n    private boolean mSortEnabled = true;\n\n    /**\n     * Remove mode enum.\n     */\n    public static final int CLICK_REMOVE = 0;\n    public static final int FLING_REMOVE = 1;\n\n    /**\n     * The current remove mode.\n     */\n    private int mRemoveMode;\n\n    private boolean mRemoveEnabled = false;\n    private boolean mIsRemoving = false;\n\n    private GestureDetector mDetector;\n\n    private GestureDetector mFlingRemoveDetector;\n\n    private int mTouchSlop;\n\n    public static final int MISS = -1;\n\n    private int mHitPos = MISS;\n    private int mFlingHitPos = MISS;\n\n    private int mClickRemoveHitPos = MISS;\n\n    private int[] mTempLoc = new int[2];\n\n    private int mItemX;\n    private int mItemY;\n\n    private int mCurrX;\n    private int mCurrY;\n\n    private boolean mDragging = false;\n\n    private float mFlingSpeed = 500f;\n\n    private int mDragHandleId;\n\n    private int mClickRemoveId;\n\n    private int mFlingHandleId;\n    private boolean mCanDrag;\n\n    private DragSortListView mDslv;\n    private int mPositionX;\n\n    /**\n     * Calls {@link #DragSortController(DragSortListView, int)} with a\n     * 0 drag handle id, FLING_RIGHT_REMOVE remove mode,\n     * and ON_DOWN drag init. By default, sorting is enabled, and\n     * removal is disabled.\n     *\n     * @param dslv The DSLV instance\n     */\n    public DragSortController(DragSortListView dslv) {\n        this(dslv, 0, ON_DOWN, FLING_REMOVE);\n    }\n\n    public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitMode, int removeMode) {\n        this(dslv, dragHandleId, dragInitMode, removeMode, 0);\n    }\n\n    public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitMode, int removeMode, int clickRemoveId) {\n        this(dslv, dragHandleId, dragInitMode, removeMode, clickRemoveId, 0);\n    }\n\n    /**\n     * By default, sorting is enabled, and removal is disabled.\n     *\n     * @param dslv The DSLV instance\n     * @param dragHandleId The resource id of the View that represents\n     * the drag handle in a list item.\n     */\n    public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitMode,\n            int removeMode, int clickRemoveId, int flingHandleId) {\n        super(dslv);\n        mDslv = dslv;\n        mDetector = new GestureDetector(dslv.getContext(), this);\n        mFlingRemoveDetector = new GestureDetector(dslv.getContext(), mFlingRemoveListener);\n        mFlingRemoveDetector.setIsLongpressEnabled(false);\n        mTouchSlop = ViewConfiguration.get(dslv.getContext()).getScaledTouchSlop();\n        mDragHandleId = dragHandleId;\n        mClickRemoveId = clickRemoveId;\n        mFlingHandleId = flingHandleId;\n        setRemoveMode(removeMode);\n        setDragInitMode(dragInitMode);\n    }\n\n\n    public int getDragInitMode() {\n        return mDragInitMode;\n    }\n\n    /**\n     * Set how a drag is initiated. Needs to be one of\n     * {@link ON_DOWN}, {@link ON_DRAG}, or {@link ON_LONG_PRESS}.\n     *\n     * @param mode The drag init mode.\n     */\n    public void setDragInitMode(int mode) {\n        mDragInitMode = mode;\n    }\n\n    /**\n     * Enable/Disable list item sorting. Disabling is useful if only item\n     * removal is desired. Prevents drags in the vertical direction.\n     *\n     * @param enabled Set <code>true</code> to enable list\n     * item sorting.\n     */\n    public void setSortEnabled(boolean enabled) {\n        mSortEnabled = enabled;\n    }\n\n    public boolean isSortEnabled() {\n        return mSortEnabled;\n    }\n\n    /**\n     * One of {@link CLICK_REMOVE}, {@link FLING_RIGHT_REMOVE},\n     * {@link FLING_LEFT_REMOVE},\n     * {@link SLIDE_RIGHT_REMOVE}, or {@link SLIDE_LEFT_REMOVE}.\n     */\n    public void setRemoveMode(int mode) {\n        mRemoveMode = mode;\n    }\n\n    public int getRemoveMode() {\n        return mRemoveMode;\n    }\n\n    /**\n     * Enable/Disable item removal without affecting remove mode.\n     */\n    public void setRemoveEnabled(boolean enabled) {\n        mRemoveEnabled = enabled;\n    }\n\n    public boolean isRemoveEnabled() {\n        return mRemoveEnabled;\n    }\n\n    /**\n     * Set the resource id for the View that represents the drag\n     * handle in a list item.\n     *\n     * @param id An android resource id.\n     */\n    public void setDragHandleId(int id) {\n        mDragHandleId = id;\n    }\n\n    /**\n     * Set the resource id for the View that represents the fling\n     * handle in a list item.\n     *\n     * @param id An android resource id.\n     */\n    public void setFlingHandleId(int id) {\n        mFlingHandleId = id;\n    }\n\n    /**\n     * Set the resource id for the View that represents click\n     * removal button.\n     *\n     * @param id An android resource id.\n     */\n    public void setClickRemoveId(int id) {\n        mClickRemoveId = id;\n    }\n\n    /**\n     * Sets flags to restrict certain motions of the floating View\n     * based on DragSortController settings (such as remove mode).\n     * Starts the drag on the DragSortListView.\n     *\n     * @param position The list item position (includes headers).\n     * @param deltaX Touch x-coord minus left edge of floating View.\n     * @param deltaY Touch y-coord minus top edge of floating View.\n     *\n     * @return True if drag started, false otherwise.\n     */\n    public boolean startDrag(int position, int deltaX, int deltaY) {\n\n        int dragFlags = 0;\n        if (mSortEnabled && !mIsRemoving) {\n            dragFlags |= DragSortListView.DRAG_POS_Y | DragSortListView.DRAG_NEG_Y;\n        }\n        if (mRemoveEnabled && mIsRemoving) {\n            dragFlags |= DragSortListView.DRAG_POS_X;\n            dragFlags |= DragSortListView.DRAG_NEG_X;\n        }\n\n        mDragging = mDslv.startDrag(position - mDslv.getHeaderViewsCount(), dragFlags, deltaX,\n                deltaY);\n        return mDragging;\n    }\n\n    @Override\n    public boolean onTouch(View v, MotionEvent ev) {\n        if (!mDslv.isDragEnabled() || mDslv.listViewIntercepted()) {\n            return false;\n        }\n\n        mDetector.onTouchEvent(ev);\n        if (mRemoveEnabled && mDragging && mRemoveMode == FLING_REMOVE) {\n            mFlingRemoveDetector.onTouchEvent(ev);\n        }\n\n        int action = ev.getAction() & MotionEvent.ACTION_MASK;\n        switch (action) {\n            case MotionEvent.ACTION_DOWN:\n                mCurrX = (int) ev.getX();\n                mCurrY = (int) ev.getY();\n                break;\n            case MotionEvent.ACTION_UP:\n                if (mRemoveEnabled && mIsRemoving) {\n                    int x = mPositionX >= 0 ? mPositionX : -mPositionX;\n                    int removePoint = mDslv.getWidth() / 2;\n                    if (x > removePoint) {\n                        mDslv.stopDragWithVelocity(true, 0);\n                    }\n                }\n            case MotionEvent.ACTION_CANCEL:\n                mIsRemoving = false;\n                mDragging = false;\n                break;\n        }\n\n        return false;\n    }\n\n    /**\n     * Overrides to provide fading when slide removal is enabled.\n     */\n    @Override\n    public void onDragFloatView(View floatView, Point position, Point touch) {\n\n        if (mRemoveEnabled && mIsRemoving) {\n            mPositionX = position.x;\n        }\n    }\n\n    /**\n     * Get the position to start dragging based on the ACTION_DOWN\n     * MotionEvent. This function simply calls\n     * {@link #dragHandleHitPosition(MotionEvent)}. Override\n     * to change drag handle behavior;\n     * this function is called internally when an ACTION_DOWN\n     * event is detected.\n     *\n     * @param ev The ACTION_DOWN MotionEvent.\n     *\n     * @return The list position to drag if a drag-init gesture is\n     * detected; MISS if unsuccessful.\n     */\n    public int startDragPosition(MotionEvent ev) {\n        return dragHandleHitPosition(ev);\n    }\n\n    public int startFlingPosition(MotionEvent ev) {\n        return mRemoveMode == FLING_REMOVE ? flingHandleHitPosition(ev) : MISS;\n    }\n\n    /**\n     * Checks for the touch of an item's drag handle (specified by\n     * {@link #setDragHandleId(int)}), and returns that item's position\n     * if a drag handle touch was detected.\n     *\n     * @param ev The ACTION_DOWN MotionEvent.\n\n     * @return The list position of the item whose drag handle was\n     * touched; MISS if unsuccessful.\n     */\n    public int dragHandleHitPosition(MotionEvent ev) {\n        return viewIdHitPosition(ev, mDragHandleId);\n    }\n\n    public int flingHandleHitPosition(MotionEvent ev) {\n        return viewIdHitPosition(ev, mFlingHandleId);\n    }\n\n    public int viewIdHitPosition(MotionEvent ev, int id) {\n        final int x = (int) ev.getX();\n        final int y = (int) ev.getY();\n\n        int touchPos = mDslv.pointToPosition(x, y); // includes headers/footers\n\n        final int numHeaders = mDslv.getHeaderViewsCount();\n        final int numFooters = mDslv.getFooterViewsCount();\n        final int count = mDslv.getCount();\n\n        // Log.d(\"mobeta\", \"touch down on position \" + itemnum);\n        // We're only interested if the touch was on an\n        // item that's not a header or footer.\n        if (touchPos != AdapterView.INVALID_POSITION && touchPos >= numHeaders\n                && touchPos < (count - numFooters)) {\n            final View item = mDslv.getChildAt(touchPos - mDslv.getFirstVisiblePosition());\n            final int rawX = (int) ev.getRawX();\n            final int rawY = (int) ev.getRawY();\n\n            View dragBox = id == 0 ? item : (View) item.findViewById(id);\n            if (dragBox != null) {\n                dragBox.getLocationOnScreen(mTempLoc);\n\n                if (rawX > mTempLoc[0] && rawY > mTempLoc[1] &&\n                        rawX < mTempLoc[0] + dragBox.getWidth() &&\n                        rawY < mTempLoc[1] + dragBox.getHeight()) {\n\n                    mItemX = item.getLeft();\n                    mItemY = item.getTop();\n\n                    return touchPos;\n                }\n            }\n        }\n\n        return MISS;\n    }\n\n    @Override\n    public boolean onDown(MotionEvent ev) {\n        if (mRemoveEnabled && mRemoveMode == CLICK_REMOVE) {\n            mClickRemoveHitPos = viewIdHitPosition(ev, mClickRemoveId);\n        }\n\n        mHitPos = startDragPosition(ev);\n        if (mHitPos != MISS && mDragInitMode == ON_DOWN) {\n            startDrag(mHitPos, (int) ev.getX() - mItemX, (int) ev.getY() - mItemY);\n        }\n\n        mIsRemoving = false;\n        mCanDrag = true;\n        mPositionX = 0;\n        mFlingHitPos = startFlingPosition(ev);\n\n        return true;\n    }\n\n    @Override\n    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {\n\n        final int x1 = (int) e1.getX();\n        final int y1 = (int) e1.getY();\n        final int x2 = (int) e2.getX();\n        final int y2 = (int) e2.getY();\n        final int deltaX = x2 - mItemX;\n        final int deltaY = y2 - mItemY;\n\n        if (mCanDrag && !mDragging && (mHitPos != MISS || mFlingHitPos != MISS)) {\n            if (mHitPos != MISS) {\n                if (mDragInitMode == ON_DRAG && Math.abs(y2 - y1) > mTouchSlop && mSortEnabled) {\n                    startDrag(mHitPos, deltaX, deltaY);\n                }\n                else if (mDragInitMode != ON_DOWN && Math.abs(x2 - x1) > mTouchSlop && mRemoveEnabled)\n                {\n                    mIsRemoving = true;\n                    startDrag(mFlingHitPos, deltaX, deltaY);\n                }\n            } else if (mFlingHitPos != MISS) {\n                if (Math.abs(x2 - x1) > mTouchSlop && mRemoveEnabled) {\n                    mIsRemoving = true;\n                    startDrag(mFlingHitPos, deltaX, deltaY);\n                } else if (Math.abs(y2 - y1) > mTouchSlop) {\n                    mCanDrag = false; // if started to scroll the list then\n                                      // don't allow sorting nor fling-removing\n                }\n            }\n        }\n        // return whatever\n        return false;\n    }\n\n    @Override\n    public void onLongPress(MotionEvent e) {\n        // Log.d(\"mobeta\", \"lift listener long pressed\");\n        if (mHitPos != MISS && mDragInitMode == ON_LONG_PRESS) {\n            mDslv.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);\n            startDrag(mHitPos, mCurrX - mItemX, mCurrY - mItemY);\n        }\n    }\n\n    // complete the OnGestureListener interface\n    @Override\n    public final boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {\n        return false;\n    }\n\n    // complete the OnGestureListener interface\n    @Override\n    public boolean onSingleTapUp(MotionEvent ev) {\n        if (mRemoveEnabled && mRemoveMode == CLICK_REMOVE) {\n            if (mClickRemoveHitPos != MISS) {\n                mDslv.removeItem(mClickRemoveHitPos - mDslv.getHeaderViewsCount());\n            }\n        }\n        return true;\n    }\n\n    // complete the OnGestureListener interface\n    @Override\n    public void onShowPress(MotionEvent ev) {\n        // do nothing\n    }\n\n    private GestureDetector.OnGestureListener mFlingRemoveListener =\n            new GestureDetector.SimpleOnGestureListener() {\n                @Override\n                public final boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,\n                        float velocityY) {\n                    // Log.d(\"mobeta\", \"on fling remove called\");\n                    if (mRemoveEnabled && mIsRemoving) {\n                        int w = mDslv.getWidth();\n                        int minPos = w / 5;\n                        if (velocityX > mFlingSpeed) {\n                            if (mPositionX > -minPos) {\n                                mDslv.stopDragWithVelocity(true, velocityX);\n                            }\n                        } else if (velocityX < -mFlingSpeed) {\n                            if (mPositionX < minPos) {\n                                mDslv.stopDragWithVelocity(true, velocityX);\n                            }\n                        }\n                        mIsRemoving = false;\n                    }\n                    return false;\n                }\n            };\n\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/mobeta/android/dslv/DragSortCursorAdapter.java",
    "content": "package com.mobeta.android.dslv;\n\nimport java.util.ArrayList;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.util.SparseIntArray;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.support.v4.widget.CursorAdapter;\n\n\n/**\n * A subclass of {@link android.widget.CursorAdapter} that provides\n * reordering of the elements in the Cursor based on completed\n * drag-sort operations. The reordering is a simple mapping of\n * list positions into Cursor positions (the Cursor is unchanged).\n * To persist changes made by drag-sorts, one can retrieve the\n * mapping with the {@link #getCursorPositions()} method, which\n * returns the reordered list of Cursor positions.\n *\n * An instance of this class is passed\n * to {@link DragSortListView#setAdapter(ListAdapter)} and, since\n * this class implements the {@link DragSortListView.DragSortListener}\n * interface, it is automatically set as the DragSortListener for\n * the DragSortListView instance.\n */\npublic abstract class DragSortCursorAdapter extends CursorAdapter implements DragSortListView.DragSortListener {\n\n    public static final int REMOVED = -1;\n\n    /**\n     * Key is ListView position, value is Cursor position\n     */\n    private SparseIntArray mListMapping = new SparseIntArray();\n\n    private ArrayList<Integer> mRemovedCursorPositions = new ArrayList<Integer>();\n    \n    public DragSortCursorAdapter(Context context, Cursor c) {\n        super(context, c);\n    }\n\n    public DragSortCursorAdapter(Context context, Cursor c, boolean autoRequery) {\n        super(context, c, autoRequery);\n    }\n\n    public DragSortCursorAdapter(Context context, Cursor c, int flags) {\n        super(context, c, flags);\n    }\n\n    /**\n     * Swaps Cursor and clears list-Cursor mapping.\n     *\n     * @see android.widget.CursorAdapter#swapCursor(android.database.Cursor)\n     */\n    @Override\n    public Cursor swapCursor(Cursor newCursor) {\n        Cursor old = super.swapCursor(newCursor);\n        resetMappings();\n        return old;\n    }\n\n    /**\n     * Changes Cursor and clears list-Cursor mapping.\n     *\n     * @see android.widget.CursorAdapter#changeCursor(android.database.Cursor)\n     */\n    @Override\n    public void changeCursor(Cursor cursor) {\n        super.changeCursor(cursor);\n        resetMappings();\n    }\n\n    /**\n     * Resets list-cursor mapping.\n     */\n    public void reset() {\n        resetMappings();\n        notifyDataSetChanged();\n    }\n\n    private void resetMappings() {\n        mListMapping.clear();\n        mRemovedCursorPositions.clear();\n    }\n\n    @Override\n    public Object getItem(int position) {\n        return super.getItem(mListMapping.get(position, position));\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return super.getItemId(mListMapping.get(position, position));\n    }\n\n    @Override\n    public View getDropDownView(int position, View convertView, ViewGroup parent) {\n        return super.getDropDownView(mListMapping.get(position, position), convertView, parent);\n    }\n\n    @Override\n    public View getView(int position, View convertView, ViewGroup parent) {\n        return super.getView(mListMapping.get(position, position), convertView, parent);\n    }\n\n    /**\n     * On drop, this updates the mapping between Cursor positions\n     * and ListView positions. The Cursor is unchanged. Retrieve\n     * the current mapping with {@link getCursorPositions()}.\n     *\n     * @see DragSortListView.DropListener#drop(int, int)\n     */\n    @Override\n    public void drop(int from, int to) {\n        if (from != to) {\n            int cursorFrom = mListMapping.get(from, from);\n\n            if (from > to) {\n                for (int i = from; i > to; --i) {\n                    mListMapping.put(i, mListMapping.get(i - 1, i - 1));\n                }\n            } else {\n                for (int i = from; i < to; ++i) {\n                    mListMapping.put(i, mListMapping.get(i + 1, i + 1));\n                }\n            }\n            mListMapping.put(to, cursorFrom);\n\n            cleanMapping();        \n            notifyDataSetChanged();\n        }\n    }\n\n    /**\n     * On remove, this updates the mapping between Cursor positions\n     * and ListView positions. The Cursor is unchanged. Retrieve\n     * the current mapping with {@link getCursorPositions()}.\n     *\n     * @see DragSortListView.RemoveListener#remove(int)\n     */\n    @Override\n    public void remove(int which) {\n        int cursorPos = mListMapping.get(which, which);\n        if (!mRemovedCursorPositions.contains(cursorPos)) {\n            mRemovedCursorPositions.add(cursorPos);\n        }\n\n        int newCount = getCount();\n        for (int i = which; i < newCount; ++i) {\n            mListMapping.put(i, mListMapping.get(i + 1, i + 1));\n        }\n\n        mListMapping.delete(newCount);\n\n        cleanMapping();\n        notifyDataSetChanged();\n    }\n\n    /**\n     * Does nothing. Just completes DragSortListener interface.\n     */\n    @Override\n    public void drag(int from, int to) {\n        // do nothing\n    }\n\n    /**\n     * Remove unnecessary mappings from sparse array.\n     */\n    private void cleanMapping() {\n        ArrayList<Integer> toRemove = new ArrayList<Integer>();\n\n        int size = mListMapping.size();\n        for (int i = 0; i < size; ++i) {\n            if (mListMapping.keyAt(i) == mListMapping.valueAt(i)) {\n                toRemove.add(mListMapping.keyAt(i));\n            }\n        }\n\n        size = toRemove.size();\n        for (int i = 0; i < size; ++i) {\n            mListMapping.delete(toRemove.get(i));\n        }\n    }\n\n    @Override\n    public int getCount() {\n        return super.getCount() - mRemovedCursorPositions.size();\n    }\n\n    /**\n     * Get the Cursor position mapped to by the provided list position\n     * (given all previously handled drag-sort\n     * operations).\n     *\n     * @param position List position\n     *\n     * @return The mapped-to Cursor position\n     */\n    public int getCursorPosition(int position) {\n        return mListMapping.get(position, position);\n    }\n\n    /**\n     * Get the current order of Cursor positions presented by the\n     * list.\n     */\n    public ArrayList<Integer> getCursorPositions() {\n        ArrayList<Integer> result = new ArrayList<Integer>();\n\n        for (int i = 0; i < getCount(); ++i) {\n            result.add(mListMapping.get(i, i));\n        }\n\n        return result;\n    }\n\n    /**\n     * Get the list position mapped to by the provided Cursor position.\n     * If the provided Cursor position has been removed by a drag-sort,\n     * this returns {@link #REMOVED}.\n     *\n     * @param cursorPosition A Cursor position\n     * @return The mapped-to list position or REMOVED\n     */\n    public int getListPosition(int cursorPosition) {\n        if (mRemovedCursorPositions.contains(cursorPosition)) {\n            return REMOVED;\n        }\n\n        int index = mListMapping.indexOfValue(cursorPosition);\n        if (index < 0) {\n            return cursorPosition;\n        } else {\n            return mListMapping.keyAt(index);\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/mobeta/android/dslv/DragSortItemView.java",
    "content": "package com.mobeta.android.dslv;\n\nimport android.content.Context;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.View.MeasureSpec;\nimport android.view.ViewGroup;\nimport android.widget.AbsListView;\nimport android.util.Log;\n\n/**\n * Lightweight ViewGroup that wraps list items obtained from user's\n * ListAdapter. ItemView expects a single child that has a definite\n * height (i.e. the child's layout height is not MATCH_PARENT).\n * The width of\n * ItemView will always match the width of its child (that is,\n * the width MeasureSpec given to ItemView is passed directly\n * to the child, and the ItemView measured width is set to the\n * child's measured width). The height of ItemView can be anything;\n * the \n * \n *\n * The purpose of this class is to optimize slide\n * shuffle animations.\n */\npublic class DragSortItemView extends ViewGroup {\n\n    private int mGravity = Gravity.TOP;\n\n    public DragSortItemView(Context context) {\n        super(context);\n\n        // always init with standard ListView layout params\n        setLayoutParams(new AbsListView.LayoutParams(\n                ViewGroup.LayoutParams.FILL_PARENT,\n                ViewGroup.LayoutParams.WRAP_CONTENT));\n\n        //setClipChildren(true);\n    }\n\n    public void setGravity(int gravity) {\n        mGravity = gravity;\n    }\n\n    public int getGravity() {\n        return mGravity;\n    }\n\n    @Override\n    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {\n        final View child = getChildAt(0);\n\n        if (child == null) {\n            return;\n        }\n\n        if (mGravity == Gravity.TOP) {\n            child.layout(0, 0, getMeasuredWidth(), child.getMeasuredHeight());\n        } else {\n            child.layout(0, getMeasuredHeight() - child.getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight());\n        }\n    }\n\n    /**\n     * \n     */\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        \n        int height = MeasureSpec.getSize(heightMeasureSpec);\n        int width = MeasureSpec.getSize(widthMeasureSpec);\n\n        int heightMode = MeasureSpec.getMode(heightMeasureSpec);\n\n        final View child = getChildAt(0);\n        if (child == null) {\n            setMeasuredDimension(0, width);\n            return;\n        }\n\n        if (child.isLayoutRequested()) {\n            // Always let child be as tall as it wants.\n            measureChild(child, widthMeasureSpec,\n                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));\n        }\n\n        if (heightMode == MeasureSpec.UNSPECIFIED) {\n            ViewGroup.LayoutParams lp = getLayoutParams();\n\n            if (lp.height > 0) {\n                height = lp.height;\n            } else {\n                height = child.getMeasuredHeight();\n            }\n        }\n\n        setMeasuredDimension(width, height);\n    }\n\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/mobeta/android/dslv/DragSortItemViewCheckable.java",
    "content": "package com.mobeta.android.dslv;\n\nimport android.content.Context;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.View.MeasureSpec;\nimport android.view.ViewGroup;\nimport android.widget.AbsListView;\nimport android.widget.Checkable;\nimport android.util.Log;\n\n/**\n * Lightweight ViewGroup that wraps list items obtained from user's\n * ListAdapter. ItemView expects a single child that has a definite\n * height (i.e. the child's layout height is not MATCH_PARENT).\n * The width of\n * ItemView will always match the width of its child (that is,\n * the width MeasureSpec given to ItemView is passed directly\n * to the child, and the ItemView measured width is set to the\n * child's measured width). The height of ItemView can be anything;\n * the \n * \n *\n * The purpose of this class is to optimize slide\n * shuffle animations.\n */\npublic class DragSortItemViewCheckable extends DragSortItemView implements Checkable {\n\n    public DragSortItemViewCheckable(Context context) {\n        super(context);\n    }\n\n    @Override\n    public boolean isChecked() {\n        View child = getChildAt(0);\n        if (child instanceof Checkable)\n            return ((Checkable) child).isChecked();\n        else\n            return false;\n    }\n\n    @Override\n    public void setChecked(boolean checked) {\n        View child = getChildAt(0);\n        if (child instanceof Checkable)\n            ((Checkable) child).setChecked(checked);\n    }\n\n    @Override\n    public void toggle() {\n        View child = getChildAt(0);\n        if (child instanceof Checkable)\n            ((Checkable) child).toggle();\n    }\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/mobeta/android/dslv/DragSortListView.java",
    "content": "/*\n * DragSortListView.\n *\n * A subclass of the Android ListView component that enables drag\n * and drop re-ordering of list items.\n *\n * Copyright 2012 Carl Bauer\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.mobeta.android.dslv;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.database.DataSetObserver;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Point;\nimport android.graphics.drawable.Drawable;\nimport android.os.Environment;\nimport android.os.SystemClock;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.util.SparseBooleanArray;\nimport android.util.SparseIntArray;\nimport android.view.Gravity;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.AbsListView;\nimport android.widget.BaseAdapter;\nimport android.widget.Checkable;\nimport android.widget.ListAdapter;\nimport android.widget.ListView;\n\nimport java.io.File;\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport com.example.PebbleKitExample.R;\n\n/**\n * ListView subclass that mediates drag and drop resorting of items.\n * \n * \n * @author heycosmo\n *\n */\npublic class DragSortListView extends ListView {\n    \n    \n    /**\n     * The View that floats above the ListView and represents\n     * the dragged item.\n     */\n    private View mFloatView;\n\n    /**\n     * The float View location. First based on touch location\n     * and given deltaX and deltaY. Then restricted by callback\n     * to FloatViewManager.onDragFloatView(). Finally restricted\n     * by bounds of DSLV.\n     */\n    private Point mFloatLoc = new Point();\n\n    private Point mTouchLoc = new Point();\n\n    /**\n     * The middle (in the y-direction) of the floating View.\n     */\n    private int mFloatViewMid;\n\n    /**\n     * Flag to make sure float View isn't measured twice\n     */\n    private boolean mFloatViewOnMeasured = false;\n\n    /**\n     * Watch the Adapter for data changes. Cancel a drag if\n     * coincident with a change.\n     */ \n    private DataSetObserver mObserver;\n\n    /**\n     * Transparency for the floating View (XML attribute).\n     */\n    private float mFloatAlpha = 1.0f;\n    private float mCurrFloatAlpha = 1.0f;\n\n    /**\n     * While drag-sorting, the current position of the floating\n     * View. If dropped, the dragged item will land in this position.\n     */\n    private int mFloatPos;\n\n    /**\n     * The first expanded ListView position that helps represent\n     * the drop slot tracking the floating View.\n     */\n    private int mFirstExpPos;\n\n    /**\n     * The second expanded ListView position that helps represent\n     * the drop slot tracking the floating View. This can equal\n     * mFirstExpPos if there is no slide shuffle occurring; otherwise\n     * it is equal to mFirstExpPos + 1.\n     */\n    private int mSecondExpPos;\n\n    /**\n     * Flag set if slide shuffling is enabled.\n     */\n    private boolean mAnimate = false;\n\n    /**\n     * The user dragged from this position.\n     */\n    private int mSrcPos;\n\n    /**\n     * Offset (in x) within the dragged item at which the user\n     * picked it up (or first touched down with the digitalis).\n     */\n    private int mDragDeltaX;\n\n    /**\n     * Offset (in y) within the dragged item at which the user\n     * picked it up (or first touched down with the digitalis).\n     */\n    private int mDragDeltaY;\n\n\n    /**\n     * The difference (in x) between screen coordinates and coordinates\n     * in this view.\n     */\n    private int mOffsetX;\n\n    /**\n     * The difference (in y) between screen coordinates and coordinates\n     * in this view.\n     */\n    private int mOffsetY;\n\n    /**\n     * A listener that receives callbacks whenever the floating View\n     * hovers over a new position.\n     */\n    private DragListener mDragListener;\n\n    /**\n     * A listener that receives a callback when the floating View\n     * is dropped.\n     */\n    private DropListener mDropListener;\n\n    /**\n     * A listener that receives a callback when the floating View\n     * (or more precisely the originally dragged item) is removed\n     * by one of the provided gestures.\n     */\n    private RemoveListener mRemoveListener;\n\n    /**\n     * Enable/Disable item dragging\n     * \n     * @attr name dslv:drag_enabled\n     */\n    private boolean mDragEnabled = true;\n\n    /**\n     * Drag state enum.\n     */\n    private final static int IDLE = 0;\n    private final static int REMOVING = 1;\n    private final static int DROPPING = 2;\n    private final static int STOPPED = 3;\n    private final static int DRAGGING = 4;\n\n    private int mDragState = IDLE;\n\n    /**\n     * Height in pixels to which the originally dragged item\n     * is collapsed during a drag-sort. Currently, this value\n     * must be greater than zero.\n     */\n    private int mItemHeightCollapsed = 1;\n\n    /**\n     * Height of the floating View. Stored for the purpose of\n     * providing the tracking drop slot.\n     */\n    private int mFloatViewHeight;\n\n    /**\n     * Convenience member. See above.\n     */\n    private int mFloatViewHeightHalf;\n\n    /**\n     * Save the given width spec for use in measuring children\n     */\n    private int mWidthMeasureSpec = 0;\n\n    /**\n     * Sample Views ultimately used for calculating the height\n     * of ListView items that are off-screen.\n     */\n    private View[] mSampleViewTypes = new View[1];\n\n    /**\n     * Drag-scroll encapsulator!\n     */\n    private DragScroller mDragScroller;\n\n    /**\n     * Determines the start of the upward drag-scroll region\n     * at the top of the ListView. Specified by a fraction\n     * of the ListView height, thus screen resolution agnostic.\n     */\n    private float mDragUpScrollStartFrac = 1.0f / 3.0f;\n\n    /**\n     * Determines the start of the downward drag-scroll region\n     * at the bottom of the ListView. Specified by a fraction\n     * of the ListView height, thus screen resolution agnostic.\n     */\n    private float mDragDownScrollStartFrac = 1.0f / 3.0f;\n\n    /**\n     * The following are calculated from the above fracs.\n     */\n    private int mUpScrollStartY;\n    private int mDownScrollStartY;\n    private float mDownScrollStartYF;\n    private float mUpScrollStartYF;\n\n    /**\n     * Calculated from above above and current ListView height.\n     */\n    private float mDragUpScrollHeight;\n\n    /**\n     * Calculated from above above and current ListView height.\n     */\n    private float mDragDownScrollHeight;\n\n    /**\n     * Maximum drag-scroll speed in pixels per ms. Only used with\n     * default linear drag-scroll profile.\n     */\n    private float mMaxScrollSpeed = 0.5f;\n\n    /**\n     * Defines the scroll speed during a drag-scroll. User can\n     * provide their own; this default is a simple linear profile\n     * where scroll speed increases linearly as the floating View\n     * nears the top/bottom of the ListView.\n     */\n    private DragScrollProfile mScrollProfile = new DragScrollProfile() {\n        @Override\n        public float getSpeed(float w, long t) {\n            return mMaxScrollSpeed * w;\n        }\n    };\n\n    /**\n     * Current touch x.\n     */\n    private int mX;\n\n    /**\n     * Current touch y.\n     */\n    private int mY;\n\n    /**\n     * Last touch x.\n     */\n    private int mLastX;\n\n    /**\n     * Last touch y.\n     */\n    private int mLastY;\n\n    /**\n     * The touch y-coord at which drag started\n     */\n    private int mDragStartY;\n\n    /**\n     * Drag flag bit. Floating View can move in the positive\n     * x direction.\n     */\n    public final static int DRAG_POS_X = 0x1;\n\n    /**\n     * Drag flag bit. Floating View can move in the negative\n     * x direction.\n     */\n    public final static int DRAG_NEG_X = 0x2;\n\n    /**\n     * Drag flag bit. Floating View can move in the positive\n     * y direction. This is subtle. What this actually means is\n     * that, if enabled, the floating View can be dragged below its starting\n     * position. Remove in favor of upper-bounding item position?\n     */\n    public final static int DRAG_POS_Y = 0x4;\n\n    /**\n     * Drag flag bit. Floating View can move in the negative\n     * y direction. This is subtle. What this actually means is\n     * that the floating View can be dragged above its starting\n     * position. Remove in favor of lower-bounding item position?\n     */\n    public final static int DRAG_NEG_Y = 0x8;\n\n    /**\n     * Flags that determine limits on the motion of the\n     * floating View. See flags above.\n     */\n    private int mDragFlags = 0;\n\n    /**\n     * Last call to an on*TouchEvent was a call to\n     * onInterceptTouchEvent.\n     */\n    private boolean mLastCallWasIntercept = false;\n\n    /**\n     * A touch event is in progress.\n     */\n    private boolean mInTouchEvent = false;\n\n    /**\n     * Let the user customize the floating View.\n     */\n    private FloatViewManager mFloatViewManager = null;\n\n    /**\n     * Given to ListView to cancel its action when a drag-sort\n     * begins.\n     */\n    private MotionEvent mCancelEvent;\n\n    /**\n     * Enum telling where to cancel the ListView action when a\n     * drag-sort begins\n     */\n    private static final int NO_CANCEL = 0;\n    private static final int ON_TOUCH_EVENT = 1;\n    private static final int ON_INTERCEPT_TOUCH_EVENT = 2;\n\n    /**\n     * Where to cancel the ListView action when a\n     * drag-sort begins\n     */ \n    private int mCancelMethod = NO_CANCEL;\n\n    /**\n     * Determines when a slide shuffle animation starts. That is,\n     * defines how close to the edge of the drop slot the floating\n     * View must be to initiate the slide.\n     */\n    private float mSlideRegionFrac = 0.25f;\n\n    /**\n     * Number between 0 and 1 indicating the relative location of\n     * a sliding item (only used if drag-sort animations\n     * are turned on). Nearly 1 means the item is \n     * at the top of the slide region (nearly full blank item\n     * is directly below).\n     */\n    private float mSlideFrac = 0.0f;\n\n    /**\n     * Wraps the user-provided ListAdapter. This is used to wrap each\n     * item View given by the user inside another View (currenly\n     * a RelativeLayout) which\n     * expands and collapses to simulate the item shuffling.\n     */\n    private AdapterWrapper mAdapterWrapper;\n\n    /**\n     * Turn on custom debugger.\n     */\n    private boolean mTrackDragSort = false;\n\n    /**\n     * Debugging class.\n     */\n    private DragSortTracker mDragSortTracker;\n\n    /**\n     * Needed for adjusting item heights from within layoutChildren\n     */\n    private boolean mBlockLayoutRequests = false;\n\n    /**\n     * Set to true when a down event happens during drag sort;\n     * for example, when drag finish animations are\n     * playing.\n     */\n    private boolean mIgnoreTouchEvent = false;\n\n    /**\n     * Caches DragSortItemView child heights. Sometimes DSLV has to\n     * know the height of an offscreen item. Since ListView virtualizes\n     * these, DSLV must get the item from the ListAdapter to obtain\n     * its height. That process can be expensive, but often the same\n     * offscreen item will be requested many times in a row. Once an\n     * offscreen item height is calculated, we cache it in this guy.\n     * Actually, we cache the height of the child of the\n     * DragSortItemView since the item height changes often during a\n     * drag-sort.\n     */\n    private static final int sCacheSize = 3;\n    private HeightCache mChildHeightCache = new HeightCache(sCacheSize);\n\n    private RemoveAnimator mRemoveAnimator;\n\n    private LiftAnimator mLiftAnimator;\n\n    private DropAnimator mDropAnimator;\n\n    private boolean mUseRemoveVelocity;\n    private float mRemoveVelocityX = 0;\n\n    public DragSortListView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n\n        int defaultDuration = 150;\n        int removeAnimDuration = defaultDuration; // ms\n        int dropAnimDuration = defaultDuration; // ms\n\n        if (attrs != null) {\n            TypedArray a = getContext().obtainStyledAttributes(attrs,\n                    R.styleable.DragSortListView, 0, 0);\n\n            mItemHeightCollapsed = Math.max(1, a.getDimensionPixelSize(\n                    R.styleable.DragSortListView_collapsed_height, 1));\n\n            mTrackDragSort = a.getBoolean(\n                    R.styleable.DragSortListView_track_drag_sort, false);\n\n            if (mTrackDragSort) {\n                mDragSortTracker = new DragSortTracker();\n            }\n\n            // alpha between 0 and 255, 0=transparent, 255=opaque\n            mFloatAlpha = a.getFloat(R.styleable.DragSortListView_float_alpha, mFloatAlpha);\n            mCurrFloatAlpha = mFloatAlpha;\n\n            mDragEnabled = a.getBoolean(R.styleable.DragSortListView_drag_enabled, mDragEnabled);\n\n            mSlideRegionFrac = Math.max(0.0f,\n                    Math.min(1.0f, 1.0f - a.getFloat(\n                            R.styleable.DragSortListView_slide_shuffle_speed,\n                            0.75f)));\n\n            mAnimate = mSlideRegionFrac > 0.0f;\n\n            float frac = a.getFloat(\n                    R.styleable.DragSortListView_drag_scroll_start,\n                    mDragUpScrollStartFrac);\n\n            setDragScrollStart(frac);\n\n            mMaxScrollSpeed = a.getFloat(\n                    R.styleable.DragSortListView_max_drag_scroll_speed,\n                    mMaxScrollSpeed);\n\n            removeAnimDuration = a.getInt(\n                    R.styleable.DragSortListView_remove_animation_duration,\n                    removeAnimDuration);\n\n            dropAnimDuration = a.getInt(\n                    R.styleable.DragSortListView_drop_animation_duration,\n                    dropAnimDuration);\n\n            boolean useDefault = a.getBoolean(\n                    R.styleable.DragSortListView_use_default_controller,\n                    true);\n\n            if (useDefault) {\n                boolean removeEnabled = a.getBoolean(\n                        R.styleable.DragSortListView_remove_enabled,\n                        false);\n                int removeMode = a.getInt(\n                        R.styleable.DragSortListView_remove_mode,\n                        DragSortController.FLING_REMOVE);\n                boolean sortEnabled = a.getBoolean(\n                        R.styleable.DragSortListView_sort_enabled,\n                        true);\n                int dragInitMode = a.getInt(\n                        R.styleable.DragSortListView_drag_start_mode,\n                        DragSortController.ON_DOWN);\n                int dragHandleId = a.getResourceId(\n                        R.styleable.DragSortListView_drag_handle_id,\n                        0);\n                int flingHandleId = a.getResourceId(\n                        R.styleable.DragSortListView_fling_handle_id,\n                        0);\n                int clickRemoveId = a.getResourceId(\n                        R.styleable.DragSortListView_click_remove_id,\n                        0);\n                int bgColor = a.getColor(\n                        R.styleable.DragSortListView_float_background_color,\n                        Color.BLACK);\n\n                DragSortController controller = new DragSortController(\n                        this, dragHandleId, dragInitMode, removeMode,\n                        clickRemoveId, flingHandleId);\n                controller.setRemoveEnabled(removeEnabled);\n                controller.setSortEnabled(sortEnabled);\n                controller.setBackgroundColor(bgColor);\n\n                mFloatViewManager = controller;\n                setOnTouchListener(controller);\n            }\n\n            a.recycle();\n        }\n\n        mDragScroller = new DragScroller();\n\n        float smoothness = 0.5f;\n        if (removeAnimDuration > 0) {\n            mRemoveAnimator = new RemoveAnimator(smoothness, removeAnimDuration);\n        }\n        // mLiftAnimator = new LiftAnimator(smoothness, 100);\n        if (dropAnimDuration > 0) {\n            mDropAnimator = new DropAnimator(smoothness, dropAnimDuration);\n        }\n\n        mCancelEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0f, 0f, 0f, 0f, 0, 0f,\n                0f, 0, 0);\n\n        // construct the dataset observer\n        mObserver = new DataSetObserver() {\n            private void cancel() {\n                if (mDragState == DRAGGING) {\n                    cancelDrag();\n                }\n            }\n\n            @Override\n            public void onChanged() {\n                cancel();\n            }\n\n            @Override\n            public void onInvalidated() {\n                cancel();\n            }\n        };\n    }\n\n    /**\n     * Usually called from a FloatViewManager. The float alpha\n     * will be reset to the xml-defined value every time a drag\n     * is stopped.\n     */\n    public void setFloatAlpha(float alpha) {\n        mCurrFloatAlpha = alpha;\n    }\n\n    public float getFloatAlpha() {\n        return mCurrFloatAlpha;\n    }\n\n    /**\n     * Set maximum drag scroll speed in positions/second. Only applies\n     * if using default ScrollSpeedProfile.\n     * \n     * @param max Maximum scroll speed.\n     */\n    public void setMaxScrollSpeed(float max) {\n        mMaxScrollSpeed = max;\n    }\n\n    /**\n     * For each DragSortListView Listener interface implemented by\n     * <code>adapter</code>, this method calls the appropriate\n     * set*Listener method with <code>adapter</code> as the argument.\n     * \n     * @param adapter The ListAdapter providing data to back\n     * DragSortListView.\n     *\n     * @see android.widget.ListView#setAdapter(android.widget.ListAdapter)\n     */\n    @Override\n    public void setAdapter(ListAdapter adapter) {\n        if (adapter != null) {\n            mAdapterWrapper = new AdapterWrapper(adapter);\n            adapter.registerDataSetObserver(mObserver);\n\n            if (adapter instanceof DropListener) {\n                setDropListener((DropListener) adapter);\n            }\n            if (adapter instanceof DragListener) {\n                setDragListener((DragListener) adapter);\n            }\n            if (adapter instanceof RemoveListener) {\n                setRemoveListener((RemoveListener) adapter);\n            }\n        } else {\n            mAdapterWrapper = null;\n        }\n\n        super.setAdapter(mAdapterWrapper);\n    }\n\n    /**\n     * As opposed to {@link ListView#getAdapter()}, which returns\n     * a heavily wrapped ListAdapter (DragSortListView wraps the\n     * input ListAdapter {\\emph and} ListView wraps the wrapped one).\n     *\n     * @return The ListAdapter set as the argument of {@link setAdapter()}\n     */\n    public ListAdapter getInputAdapter() {\n        if (mAdapterWrapper == null) {\n            return null;\n        } else {\n            return mAdapterWrapper.getAdapter();\n        }\n    }\n\n    private class AdapterWrapper extends BaseAdapter {\n        private ListAdapter mAdapter;\n\n        public AdapterWrapper(ListAdapter adapter) {\n            super();\n            mAdapter = adapter;\n            \n            mAdapter.registerDataSetObserver(new DataSetObserver() {\n                public void onChanged() {\n                    notifyDataSetChanged();\n                }\n\n                public void onInvalidated() {\n                    notifyDataSetInvalidated();\n                }\n            });\n        }\n\n        public ListAdapter getAdapter() {\n            return mAdapter;\n        }\n\n        @Override\n        public long getItemId(int position) {\n            return mAdapter.getItemId(position);\n        }\n\n        @Override\n        public Object getItem(int position) {\n            return mAdapter.getItem(position);\n        }\n\n        @Override\n        public int getCount() {\n            return mAdapter.getCount();\n        }\n\n        @Override\n        public boolean areAllItemsEnabled() {\n            return mAdapter.areAllItemsEnabled();\n        }\n\n        @Override\n        public boolean isEnabled(int position) {\n            return mAdapter.isEnabled(position);\n        }\n        \n        @Override\n        public int getItemViewType(int position) {\n            return mAdapter.getItemViewType(position);\n        }\n\n        @Override\n        public int getViewTypeCount() {\n            return mAdapter.getViewTypeCount();\n        }\n        \n        @Override\n        public boolean hasStableIds() {\n            return mAdapter.hasStableIds();\n        }\n        \n        @Override\n        public boolean isEmpty() {\n            return mAdapter.isEmpty();\n        }\n\n\n        @Override\n        public View getView(int position, View convertView, ViewGroup parent) {\n\n            DragSortItemView v;\n            View child;\n            // Log.d(\"mobeta\",\n            // \"getView: position=\"+position+\" convertView=\"+convertView);\n            if (convertView != null) {\n                v = (DragSortItemView) convertView;\n                View oldChild = v.getChildAt(0);\n\n                child = mAdapter.getView(position, oldChild, DragSortListView.this);\n                if (child != oldChild) {\n                    // shouldn't get here if user is reusing convertViews\n                    // properly\n                    if (oldChild != null) {\n                        v.removeViewAt(0);\n                    }\n                    v.addView(child);\n                }\n            } else {\n                child = mAdapter.getView(position, null, DragSortListView.this);\n                if (child instanceof Checkable) {\n                    v = new DragSortItemViewCheckable(getContext());\n                } else {\n                    v = new DragSortItemView(getContext());\n                }\n                v.setLayoutParams(new AbsListView.LayoutParams(\n                        ViewGroup.LayoutParams.FILL_PARENT,\n                        ViewGroup.LayoutParams.WRAP_CONTENT));\n                v.addView(child);\n            }\n\n            // Set the correct item height given drag state; passed\n            // View needs to be measured if measurement is required.\n            adjustItem(position + getHeaderViewsCount(), v, true);\n\n            return v;\n        }\n    }\n\n    private void drawDivider(int expPosition, Canvas canvas) {\n\n        final Drawable divider = getDivider();\n        final int dividerHeight = getDividerHeight();\n        // Log.d(\"mobeta\", \"div=\"+divider+\" divH=\"+dividerHeight);\n\n        if (divider != null && dividerHeight != 0) {\n            final ViewGroup expItem = (ViewGroup) getChildAt(expPosition\n                    - getFirstVisiblePosition());\n            if (expItem != null) {\n                final int l = getPaddingLeft();\n                final int r = getWidth() - getPaddingRight();\n                final int t;\n                final int b;\n\n                final int childHeight = expItem.getChildAt(0).getHeight();\n\n                if (expPosition > mSrcPos) {\n                    t = expItem.getTop() + childHeight;\n                    b = t + dividerHeight;\n                } else {\n                    b = expItem.getBottom() - childHeight;\n                    t = b - dividerHeight;\n                }\n                // Log.d(\"mobeta\", \"l=\"+l+\" t=\"+t+\" r=\"+r+\" b=\"+b);\n\n                // Have to clip to support ColorDrawable on <= Gingerbread\n                canvas.save();\n                canvas.clipRect(l, t, r, b);\n                divider.setBounds(l, t, r, b);\n                divider.draw(canvas);\n                canvas.restore();\n            }\n        }\n    }\n\n    @Override\n    protected void dispatchDraw(Canvas canvas) {\n        super.dispatchDraw(canvas);\n\n        if (mDragState != IDLE) {\n            // draw the divider over the expanded item\n            if (mFirstExpPos != mSrcPos) {\n                drawDivider(mFirstExpPos, canvas);\n            }\n            if (mSecondExpPos != mFirstExpPos && mSecondExpPos != mSrcPos) {\n                drawDivider(mSecondExpPos, canvas);\n            }\n        }\n\n        if (mFloatView != null) {\n            // draw the float view over everything\n            final int w = mFloatView.getWidth();\n            final int h = mFloatView.getHeight();\n\n            int x = mFloatLoc.x;\n\n            int width = getWidth();\n            if (x < 0)\n                x = -x;\n            float alphaMod;\n            if (x < width) {\n                alphaMod = ((float) (width - x)) / ((float) width);\n                alphaMod *= alphaMod;\n            } else {\n                alphaMod = 0;\n            }\n\n            final int alpha = (int) (255f * mCurrFloatAlpha * alphaMod);\n\n            canvas.save();\n            // Log.d(\"mobeta\", \"clip rect bounds: \" + canvas.getClipBounds());\n            canvas.translate(mFloatLoc.x, mFloatLoc.y);\n            canvas.clipRect(0, 0, w, h);\n\n            // Log.d(\"mobeta\", \"clip rect bounds: \" + canvas.getClipBounds());\n            canvas.saveLayerAlpha(0, 0, w, h, alpha, Canvas.ALL_SAVE_FLAG);\n            mFloatView.draw(canvas);\n            canvas.restore();\n            canvas.restore();\n        }\n    }\n\n    private int getItemHeight(int position) {\n        View v = getChildAt(position - getFirstVisiblePosition());\n\n        if (v != null) {\n            // item is onscreen, just get the height of the View\n            return v.getHeight();\n        } else {\n            // item is offscreen. get child height and calculate\n            // item height based on current shuffle state\n            return calcItemHeight(position, getChildHeight(position));\n        }\n    }\n\n    private void printPosData() {\n        Log.d(\"mobeta\", \"mSrcPos=\" + mSrcPos + \" mFirstExpPos=\" + mFirstExpPos + \" mSecondExpPos=\"\n                + mSecondExpPos);\n    }\n\n    private class HeightCache {\n\n        private SparseIntArray mMap;\n        private ArrayList<Integer> mOrder;\n        private int mMaxSize;\n\n        public HeightCache(int size) {\n            mMap = new SparseIntArray(size);\n            mOrder = new ArrayList<Integer>(size);\n            mMaxSize = size;\n        }\n\n        /**\n         * Add item height at position if doesn't already exist.\n         */\n        public void add(int position, int height) {\n            int currHeight = mMap.get(position, -1);\n            if (currHeight != height) {\n                if (currHeight == -1) {\n                    if (mMap.size() == mMaxSize) {\n                        // remove oldest entry\n                        mMap.delete(mOrder.remove(0));\n                    }\n                } else {\n                    // move position to newest slot\n                    mOrder.remove((Integer) position);\n                }\n                mMap.put(position, height);\n                mOrder.add(position);\n            }\n        }\n\n        public int get(int position) {\n            return mMap.get(position, -1);\n        }\n\n        public void clear() {\n            mMap.clear();\n            mOrder.clear();\n        }\n\n    }\n\n    /**\n     * Get the shuffle edge for item at position when top of\n     * item is at y-coord top. Assumes that current item heights\n     * are consistent with current float view location and\n     * thus expanded positions and slide fraction. i.e. Should not be\n     * called between update of expanded positions/slide fraction\n     * and layoutChildren.\n     *\n     * @param position \n     * @param top\n     * @param height Height of item at position. If -1, this function\n     * calculates this height.\n     *\n     * @return Shuffle line between position-1 and position (for\n     * the given view of the list; that is, for when top of item at\n     * position has y-coord of given `top`). If\n     * floating View (treated as horizontal line) is dropped\n     * immediately above this line, it lands in position-1. If\n     * dropped immediately below this line, it lands in position.\n     */\n    private int getShuffleEdge(int position, int top) {\n\n        final int numHeaders = getHeaderViewsCount();\n        final int numFooters = getFooterViewsCount();\n\n        // shuffle edges are defined between items that can be\n        // dragged; there are N-1 of them if there are N draggable\n        // items.\n\n        if (position <= numHeaders || (position >= getCount() - numFooters)) {\n            return top;\n        }\n\n        int divHeight = getDividerHeight();\n\n        int edge;\n\n        int maxBlankHeight = mFloatViewHeight - mItemHeightCollapsed;\n        int childHeight = getChildHeight(position);\n        int itemHeight = getItemHeight(position);\n\n        // first calculate top of item given that floating View is\n        // centered over src position\n        int otop = top;\n        if (mSecondExpPos <= mSrcPos) {\n            // items are expanded on and/or above the source position\n\n            if (position == mSecondExpPos && mFirstExpPos != mSecondExpPos) {\n                if (position == mSrcPos) {\n                    otop = top + itemHeight - mFloatViewHeight;\n                } else {\n                    int blankHeight = itemHeight - childHeight;\n                    otop = top + blankHeight - maxBlankHeight;\n                }\n            } else if (position > mSecondExpPos && position <= mSrcPos) {\n                otop = top - maxBlankHeight;\n            }\n\n        } else {\n            // items are expanded on and/or below the source position\n\n            if (position > mSrcPos && position <= mFirstExpPos) {\n                otop = top + maxBlankHeight;\n            } else if (position == mSecondExpPos && mFirstExpPos != mSecondExpPos) {\n                int blankHeight = itemHeight - childHeight;\n                otop = top + blankHeight;\n            }\n        }\n\n        // otop is set\n        if (position <= mSrcPos) {\n            edge = otop + (mFloatViewHeight - divHeight - getChildHeight(position - 1)) / 2;\n        } else {\n            edge = otop + (childHeight - divHeight - mFloatViewHeight) / 2;\n        }\n\n        return edge;\n    }\n\n    private boolean updatePositions() {\n\n        final int first = getFirstVisiblePosition();\n        int startPos = mFirstExpPos;\n        View startView = getChildAt(startPos - first);\n\n        if (startView == null) {\n            startPos = first + getChildCount() / 2;\n            startView = getChildAt(startPos - first);\n        }\n        int startTop = startView.getTop();\n\n        int itemHeight = startView.getHeight();\n\n        int edge = getShuffleEdge(startPos, startTop);\n        int lastEdge = edge;\n\n        int divHeight = getDividerHeight();\n\n        // Log.d(\"mobeta\", \"float mid=\"+mFloatViewMid);\n\n        int itemPos = startPos;\n        int itemTop = startTop;\n        if (mFloatViewMid < edge) {\n            // scanning up for float position\n            // Log.d(\"mobeta\", \"    edge=\"+edge);\n            while (itemPos >= 0) {\n                itemPos--;\n                itemHeight = getItemHeight(itemPos);\n\n                if (itemPos == 0) {\n                    edge = itemTop - divHeight - itemHeight;\n                    break;\n                }\n\n                itemTop -= itemHeight + divHeight;\n                edge = getShuffleEdge(itemPos, itemTop);\n                // Log.d(\"mobeta\", \"    edge=\"+edge);\n\n                if (mFloatViewMid >= edge) {\n                    break;\n                }\n\n                lastEdge = edge;\n            }\n        } else {\n            // scanning down for float position\n            // Log.d(\"mobeta\", \"    edge=\"+edge);\n            final int count = getCount();\n            while (itemPos < count) {\n                if (itemPos == count - 1) {\n                    edge = itemTop + divHeight + itemHeight;\n                    break;\n                }\n\n                itemTop += divHeight + itemHeight;\n                itemHeight = getItemHeight(itemPos + 1);\n                edge = getShuffleEdge(itemPos + 1, itemTop);\n                // Log.d(\"mobeta\", \"    edge=\"+edge);\n\n                // test for hit\n                if (mFloatViewMid < edge) {\n                    break;\n                }\n\n                lastEdge = edge;\n                itemPos++;\n            }\n        }\n\n        final int numHeaders = getHeaderViewsCount();\n        final int numFooters = getFooterViewsCount();\n\n        boolean updated = false;\n\n        int oldFirstExpPos = mFirstExpPos;\n        int oldSecondExpPos = mSecondExpPos;\n        float oldSlideFrac = mSlideFrac;\n\n        if (mAnimate) {\n            int edgeToEdge = Math.abs(edge - lastEdge);\n\n            int edgeTop, edgeBottom;\n            if (mFloatViewMid < edge) {\n                edgeBottom = edge;\n                edgeTop = lastEdge;\n            } else {\n                edgeTop = edge;\n                edgeBottom = lastEdge;\n            }\n            // Log.d(\"mobeta\", \"edgeTop=\"+edgeTop+\" edgeBot=\"+edgeBottom);\n\n            int slideRgnHeight = (int) (0.5f * mSlideRegionFrac * edgeToEdge);\n            float slideRgnHeightF = (float) slideRgnHeight;\n            int slideEdgeTop = edgeTop + slideRgnHeight;\n            int slideEdgeBottom = edgeBottom - slideRgnHeight;\n\n            // Three regions\n            if (mFloatViewMid < slideEdgeTop) {\n                mFirstExpPos = itemPos - 1;\n                mSecondExpPos = itemPos;\n                mSlideFrac = 0.5f * ((float) (slideEdgeTop - mFloatViewMid)) / slideRgnHeightF;\n                // Log.d(\"mobeta\",\n                // \"firstExp=\"+mFirstExpPos+\" secExp=\"+mSecondExpPos+\" slideFrac=\"+mSlideFrac);\n            } else if (mFloatViewMid < slideEdgeBottom) {\n                mFirstExpPos = itemPos;\n                mSecondExpPos = itemPos;\n            } else {\n                mFirstExpPos = itemPos;\n                mSecondExpPos = itemPos + 1;\n                mSlideFrac = 0.5f * (1.0f + ((float) (edgeBottom - mFloatViewMid))\n                        / slideRgnHeightF);\n                // Log.d(\"mobeta\",\n                // \"firstExp=\"+mFirstExpPos+\" secExp=\"+mSecondExpPos+\" slideFrac=\"+mSlideFrac);\n            }\n\n        } else {\n            mFirstExpPos = itemPos;\n            mSecondExpPos = itemPos;\n        }\n\n        // correct for headers and footers\n        if (mFirstExpPos < numHeaders) {\n            itemPos = numHeaders;\n            mFirstExpPos = itemPos;\n            mSecondExpPos = itemPos;\n        } else if (mSecondExpPos >= getCount() - numFooters) {\n            itemPos = getCount() - numFooters - 1;\n            mFirstExpPos = itemPos;\n            mSecondExpPos = itemPos;\n        }\n\n        if (mFirstExpPos != oldFirstExpPos || mSecondExpPos != oldSecondExpPos\n                || mSlideFrac != oldSlideFrac) {\n            updated = true;\n        }\n\n        if (itemPos != mFloatPos) {\n            if (mDragListener != null) {\n                mDragListener.drag(mFloatPos - numHeaders, itemPos - numHeaders);\n            }\n\n            mFloatPos = itemPos;\n            updated = true;\n        }\n\n        return updated;\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n\n        if (mTrackDragSort) {\n            mDragSortTracker.appendState();\n        }\n    }\n\n    private class SmoothAnimator implements Runnable {\n        protected long mStartTime;\n\n        private float mDurationF;\n\n        private float mAlpha;\n        private float mA, mB, mC, mD;\n\n        private boolean mCanceled;\n\n        public SmoothAnimator(float smoothness, int duration) {\n            mAlpha = smoothness;\n            mDurationF = (float) duration;\n            mA = mD = 1f / (2f * mAlpha * (1f - mAlpha));\n            mB = mAlpha / (2f * (mAlpha - 1f));\n            mC = 1f / (1f - mAlpha);\n        }\n\n        public float transform(float frac) {\n            if (frac < mAlpha) {\n                return mA * frac * frac;\n            } else if (frac < 1f - mAlpha) {\n                return mB + mC * frac;\n            } else {\n                return 1f - mD * (frac - 1f) * (frac - 1f);\n            }\n        }\n\n        public void start() {\n            mStartTime = SystemClock.uptimeMillis();\n            mCanceled = false;\n            onStart();\n            post(this);\n        }\n\n        public void cancel() {\n            mCanceled = true;\n        }\n\n        public void onStart() {\n            // stub\n        }\n\n        public void onUpdate(float frac, float smoothFrac) {\n            // stub\n        }\n\n        public void onStop() {\n            // stub\n        }\n\n        @Override\n        public void run() {\n            if (mCanceled) {\n                return;\n            }\n\n            float fraction = ((float) (SystemClock.uptimeMillis() - mStartTime)) / mDurationF;\n\n            if (fraction >= 1f) {\n                onUpdate(1f, 1f);\n                onStop();\n            } else {\n                onUpdate(fraction, transform(fraction));\n                post(this);\n            }\n        }\n    }\n\n    /**\n     * Centers floating View under touch point.\n     */\n    private class LiftAnimator extends SmoothAnimator {\n\n        private float mInitDragDeltaY;\n        private float mFinalDragDeltaY;\n\n        public LiftAnimator(float smoothness, int duration) {\n            super(smoothness, duration);\n        }\n\n        @Override\n        public void onStart() {\n            mInitDragDeltaY = mDragDeltaY;\n            mFinalDragDeltaY = mFloatViewHeightHalf;\n        }\n\n        @Override\n        public void onUpdate(float frac, float smoothFrac) {\n            if (mDragState != DRAGGING) {\n                cancel();\n            } else {\n                mDragDeltaY = (int) (smoothFrac * mFinalDragDeltaY + (1f - smoothFrac)\n                        * mInitDragDeltaY);\n                mFloatLoc.y = mY - mDragDeltaY;\n                doDragFloatView(true);\n            }\n        }\n    }\n\n    /**\n     * Centers floating View over drop slot before destroying.\n     */\n    private class DropAnimator extends SmoothAnimator {\n\n        private int mDropPos;\n        private int srcPos;\n        private float mInitDeltaY;\n        private float mInitDeltaX;\n\n        public DropAnimator(float smoothness, int duration) {\n            super(smoothness, duration);\n        }\n\n        @Override\n        public void onStart() {\n            mDropPos = mFloatPos;\n            srcPos = mSrcPos;\n            mDragState = DROPPING;\n            mInitDeltaY = mFloatLoc.y - getTargetY();\n            mInitDeltaX = mFloatLoc.x - getPaddingLeft();\n        }\n\n        private int getTargetY() {\n            final int first = getFirstVisiblePosition();\n            final int otherAdjust = (mItemHeightCollapsed + getDividerHeight()) / 2;\n            View v = getChildAt(mDropPos - first);\n            int targetY = -1;\n            if (v != null) {\n                if (mDropPos == srcPos) {\n                    targetY = v.getTop();\n                } else if (mDropPos < srcPos) {\n                    // expanded down\n                    targetY = v.getTop() - otherAdjust;\n                } else {\n                    // expanded up\n                    targetY = v.getBottom() + otherAdjust - mFloatViewHeight;\n                }\n            } else {\n                // drop position is not on screen?? no animation\n                cancel();\n            }\n\n            return targetY;\n        }\n\n        @Override\n        public void onUpdate(float frac, float smoothFrac) {\n            final int targetY = getTargetY();\n            final int targetX = getPaddingLeft();\n            final float deltaY = mFloatLoc.y - targetY;\n            final float deltaX = mFloatLoc.x - targetX;\n            final float f = 1f - smoothFrac;\n            if (f < Math.abs(deltaY / mInitDeltaY) || f < Math.abs(deltaX / mInitDeltaX)) {\n                mFloatLoc.y = targetY + (int) (mInitDeltaY * f);\n                mFloatLoc.x = getPaddingLeft() + (int) (mInitDeltaX * f);\n                doDragFloatView(true);\n            }\n        }\n\n        @Override\n        public void onStop() {\n            dropFloatView();\n        }\n\n    }\n\n    /**\n     * Collapses expanded items.\n     */\n    private class RemoveAnimator extends SmoothAnimator {\n\n        private float mFloatLocX;\n        private float mFirstStartBlank;\n        private float mSecondStartBlank;\n\n        private int mFirstChildHeight = -1;\n        private int mSecondChildHeight = -1;\n\n        private int mFirstPos;\n        private int mSecondPos;\n        private int srcPos;\n\n        public RemoveAnimator(float smoothness, int duration) {\n            super(smoothness, duration);\n        }\n\n        @Override\n        public void onStart() {\n            mFirstChildHeight = -1;\n            mSecondChildHeight = -1;\n            mFirstPos = mFirstExpPos;\n            mSecondPos = mSecondExpPos;\n            srcPos = mSrcPos;\n            mDragState = REMOVING;\n\n            mFloatLocX = mFloatLoc.x;\n            if (mUseRemoveVelocity) {\n                float minVelocity = 2f * getWidth();\n                if (mRemoveVelocityX == 0) {\n                    mRemoveVelocityX = (mFloatLocX < 0 ? -1 : 1) * minVelocity;\n                } else {\n                    minVelocity *= 2;\n                    if (mRemoveVelocityX < 0 && mRemoveVelocityX > -minVelocity)\n                        mRemoveVelocityX = -minVelocity;\n                    else if (mRemoveVelocityX > 0 && mRemoveVelocityX < minVelocity)\n                        mRemoveVelocityX = minVelocity;\n                }\n            } else {\n                destroyFloatView();\n            }\n        }\n\n        @Override\n        public void onUpdate(float frac, float smoothFrac) {\n            float f = 1f - smoothFrac;\n\n            final int firstVis = getFirstVisiblePosition();\n            View item = getChildAt(mFirstPos - firstVis);\n            ViewGroup.LayoutParams lp;\n            int blank;\n\n            if (mUseRemoveVelocity) {\n                float dt = (float) (SystemClock.uptimeMillis() - mStartTime) / 1000;\n                if (dt == 0)\n                    return;\n                float dx = mRemoveVelocityX * dt;\n                int w = getWidth();\n                mRemoveVelocityX += (mRemoveVelocityX > 0 ? 1 : -1) * dt * w;\n                mFloatLocX += dx;\n                mFloatLoc.x = (int) mFloatLocX;\n                if (mFloatLocX < w && mFloatLocX > -w) {\n                    mStartTime = SystemClock.uptimeMillis();\n                    doDragFloatView(true);\n                    return;\n                }\n            }\n\n            if (item != null) {\n                if (mFirstChildHeight == -1) {\n                    mFirstChildHeight = getChildHeight(mFirstPos, item, false);\n                    mFirstStartBlank = (float) (item.getHeight() - mFirstChildHeight);\n                }\n                blank = Math.max((int) (f * mFirstStartBlank), 1);\n                lp = item.getLayoutParams();\n                lp.height = mFirstChildHeight + blank;\n                item.setLayoutParams(lp);\n            }\n            if (mSecondPos != mFirstPos) {\n                item = getChildAt(mSecondPos - firstVis);\n                if (item != null) {\n                    if (mSecondChildHeight == -1) {\n                        mSecondChildHeight = getChildHeight(mSecondPos, item, false);\n                        mSecondStartBlank = (float) (item.getHeight() - mSecondChildHeight);\n                    }\n                    blank = Math.max((int) (f * mSecondStartBlank), 1);\n                    lp = item.getLayoutParams();\n                    lp.height = mSecondChildHeight + blank;\n                    item.setLayoutParams(lp);\n                }\n            }\n        }\n\n        @Override\n        public void onStop() {\n            doRemoveItem();\n        }\n    }\n\n    public void removeItem(int which) {\n\n        mUseRemoveVelocity = false;\n        removeItem(which, 0);\n    }\n\n    /**\n     * Removes an item from the list and animates the removal.\n     *\n     * @param which Position to remove (NOTE: headers/footers ignored!\n     * this is a position in your input ListAdapter).\n     * @param velocityX \n     */\n    public void removeItem(int which, float velocityX) {\n        if (mDragState == IDLE || mDragState == DRAGGING) {\n\n            if (mDragState == IDLE) {\n                // called from outside drag-sort\n                mSrcPos = getHeaderViewsCount() + which;\n                mFirstExpPos = mSrcPos;\n                mSecondExpPos = mSrcPos;\n                mFloatPos = mSrcPos;\n                View v = getChildAt(mSrcPos - getFirstVisiblePosition());\n                if (v != null) {\n                    v.setVisibility(View.INVISIBLE);\n                }\n            }\n\n            mDragState = REMOVING;\n            mRemoveVelocityX = velocityX;\n\n            if (mInTouchEvent) {\n                switch (mCancelMethod) {\n                    case ON_TOUCH_EVENT:\n                        super.onTouchEvent(mCancelEvent);\n                        break;\n                    case ON_INTERCEPT_TOUCH_EVENT:\n                        super.onInterceptTouchEvent(mCancelEvent);\n                        break;\n                }\n            }\n\n            if (mRemoveAnimator != null) {\n                mRemoveAnimator.start();\n            } else {\n                doRemoveItem(which);\n            }\n        }\n    }\n\n    /**\n     * Move an item, bypassing the drag-sort process. Simply calls\n     * through to {@link DropListener#drop(int, int)}.\n     * \n     * @param from Position to move (NOTE: headers/footers ignored!\n     * this is a position in your input ListAdapter).\n     * @param to Target position (NOTE: headers/footers ignored!\n     * this is a position in your input ListAdapter).\n     */\n    public void moveItem(int from, int to) {\n        if (mDropListener != null) {\n            final int count = getInputAdapter().getCount();\n            if (from >= 0 && from < count && to >= 0 && to < count) {\n                mDropListener.drop(from, to);\n            }\n        }\n    }\n\n    /**\n     * Cancel a drag. Calls {@link #stopDrag(boolean, boolean)} with\n     * <code>true</code> as the first argument.\n     */\n    public void cancelDrag() {\n        if (mDragState == DRAGGING) {\n            mDragScroller.stopScrolling(true);\n            destroyFloatView();\n            clearPositions();\n            adjustAllItems();\n\n            if (mInTouchEvent) {\n                mDragState = STOPPED;\n            } else {\n                mDragState = IDLE;\n            }\n        }\n    }\n\n    private void clearPositions() {\n        mSrcPos = -1;\n        mFirstExpPos = -1;\n        mSecondExpPos = -1;\n        mFloatPos = -1;\n    }\n\n    private void dropFloatView() {\n        // must set to avoid cancelDrag being called from the\n        // DataSetObserver\n        mDragState = DROPPING;\n\n        if (mDropListener != null && mFloatPos >= 0 && mFloatPos < getCount()) {\n            final int numHeaders = getHeaderViewsCount();\n            mDropListener.drop(mSrcPos - numHeaders, mFloatPos - numHeaders);\n        }\n\n        destroyFloatView();\n\n        adjustOnReorder();\n        clearPositions();\n        adjustAllItems();\n\n        // now the drag is done\n        if (mInTouchEvent) {\n            mDragState = STOPPED;\n        } else {\n            mDragState = IDLE;\n        }\n    }\n\n    private void doRemoveItem() {\n        doRemoveItem(mSrcPos - getHeaderViewsCount());\n    }\n\n    /**\n     * Removes dragged item from the list. Calls RemoveListener.\n     */\n    private void doRemoveItem(int which) {\n        // must set to avoid cancelDrag being called from the\n        // DataSetObserver\n        mDragState = REMOVING;\n\n        // end it\n        if (mRemoveListener != null) {\n            mRemoveListener.remove(which);\n        }\n\n        destroyFloatView();\n\n        adjustOnReorder();\n        clearPositions();\n\n        // now the drag is done\n        if (mInTouchEvent) {\n            mDragState = STOPPED;\n        } else {\n            mDragState = IDLE;\n        }\n    }\n\n    private void adjustOnReorder() {\n        final int firstPos = getFirstVisiblePosition();\n        // Log.d(\"mobeta\", \"first=\"+firstPos+\" src=\"+mSrcPos);\n        if (mSrcPos < firstPos) {\n            // collapsed src item is off screen;\n            // adjust the scroll after item heights have been fixed\n            View v = getChildAt(0);\n            int top = 0;\n            if (v != null) {\n                top = v.getTop();\n            }\n            // Log.d(\"mobeta\", \"top=\"+top+\" fvh=\"+mFloatViewHeight);\n            setSelectionFromTop(firstPos - 1, top - getPaddingTop());\n        }\n    }\n\n    /**\n     * Stop a drag in progress. Pass <code>true</code> if you would\n     * like to remove the dragged item from the list.\n     *\n     * @param remove Remove the dragged item from the list. Calls\n     * a registered RemoveListener, if one exists. Otherwise, calls\n     * the DropListener, if one exists.\n     *\n     * @return True if the stop was successful. False if there is\n     * no floating View.\n     */\n    public boolean stopDrag(boolean remove) {\n        mUseRemoveVelocity = false;\n        return stopDrag(remove, 0);\n    }\n\n    public boolean stopDragWithVelocity(boolean remove, float velocityX) {\n\n        mUseRemoveVelocity = true;\n        return stopDrag(remove, velocityX);\n    }\n\n    public boolean stopDrag(boolean remove, float velocityX) {\n        if (mFloatView != null) {\n            mDragScroller.stopScrolling(true);\n\n            if (remove) {\n                removeItem(mSrcPos - getHeaderViewsCount(), velocityX);\n            } else {\n                if (mDropAnimator != null) {\n                    mDropAnimator.start();\n                } else {\n                    dropFloatView();\n                }\n            }\n\n            if (mTrackDragSort) {\n                mDragSortTracker.stopTracking();\n            }\n\n            return true;\n        } else {\n            // stop failed\n            return false;\n        }\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent ev) {\n        if (mIgnoreTouchEvent) {\n            mIgnoreTouchEvent = false;\n            return false;\n        }\n\n        if (!mDragEnabled) {\n            return super.onTouchEvent(ev);\n        }\n\n        boolean more = false;\n\n        boolean lastCallWasIntercept = mLastCallWasIntercept;\n        mLastCallWasIntercept = false;\n\n        if (!lastCallWasIntercept) {\n            saveTouchCoords(ev);\n        }\n\n        // if (mFloatView != null) {\n        if (mDragState == DRAGGING) {\n            onDragTouchEvent(ev);\n            more = true; // give us more!\n        } else {\n            // what if float view is null b/c we dropped in middle\n            // of drag touch event?\n\n            // if (mDragState != STOPPED) {\n            if (mDragState == IDLE) {\n                if (super.onTouchEvent(ev)) {\n                    more = true;\n                }\n            }\n\n            int action = ev.getAction() & MotionEvent.ACTION_MASK;\n\n            switch (action) {\n                case MotionEvent.ACTION_CANCEL:\n                case MotionEvent.ACTION_UP:\n                    doActionUpOrCancel();\n                    break;\n                default:\n                    if (more) {\n                        mCancelMethod = ON_TOUCH_EVENT;\n                    }\n            }\n        }\n\n        return more;\n    }\n\n    private void doActionUpOrCancel() {\n        mCancelMethod = NO_CANCEL;\n        mInTouchEvent = false;\n        if (mDragState == STOPPED) {\n            mDragState = IDLE;\n        }\n        mCurrFloatAlpha = mFloatAlpha;\n        mListViewIntercepted = false;\n        mChildHeightCache.clear();\n    }\n\n    private void saveTouchCoords(MotionEvent ev) {\n        int action = ev.getAction() & MotionEvent.ACTION_MASK;\n        if (action != MotionEvent.ACTION_DOWN) {\n            mLastX = mX;\n            mLastY = mY;\n        }\n        mX = (int) ev.getX();\n        mY = (int) ev.getY();\n        if (action == MotionEvent.ACTION_DOWN) {\n            mLastX = mX;\n            mLastY = mY;\n        }\n        mOffsetX = (int) ev.getRawX() - mX;\n        mOffsetY = (int) ev.getRawY() - mY;\n    }\n\n    public boolean listViewIntercepted() {\n        return mListViewIntercepted;\n    }\n\n    private boolean mListViewIntercepted = false;\n\n    @Override\n    public boolean onInterceptTouchEvent(MotionEvent ev) {\n        if (!mDragEnabled) {\n            return super.onInterceptTouchEvent(ev);\n        }\n\n        saveTouchCoords(ev);\n        mLastCallWasIntercept = true;\n\n        int action = ev.getAction() & MotionEvent.ACTION_MASK;\n\n        if (action == MotionEvent.ACTION_DOWN) {\n            if (mDragState != IDLE) {\n                // intercept and ignore\n                mIgnoreTouchEvent = true;\n                return true;\n            }\n            mInTouchEvent = true;\n        }\n\n        boolean intercept = false;\n\n        // the following deals with calls to super.onInterceptTouchEvent\n        if (mFloatView != null) {\n            // super's touch event canceled in startDrag\n            intercept = true;\n        } else {\n            if (super.onInterceptTouchEvent(ev)) {\n                mListViewIntercepted = true;\n                intercept = true;\n            }\n\n            switch (action) {\n                case MotionEvent.ACTION_CANCEL:\n                case MotionEvent.ACTION_UP:\n                    doActionUpOrCancel();\n                    break;\n                default:\n                    if (intercept) {\n                        mCancelMethod = ON_TOUCH_EVENT;\n                    } else {\n                        mCancelMethod = ON_INTERCEPT_TOUCH_EVENT;\n                    }\n            }\n        }\n\n        if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {\n            mInTouchEvent = false;\n        }\n\n        return intercept;\n    }\n\n    /**\n     * Set the width of each drag scroll region by specifying\n     * a fraction of the ListView height.\n     *\n     * @param heightFraction Fraction of ListView height. Capped at\n     * 0.5f.\n     * \n     */\n    public void setDragScrollStart(float heightFraction) {\n        setDragScrollStarts(heightFraction, heightFraction);\n    }\n\n    /**\n     * Set the width of each drag scroll region by specifying\n     * a fraction of the ListView height.\n     *\n     * @param upperFrac Fraction of ListView height for up-scroll bound.\n     * Capped at 0.5f.\n     * @param lowerFrac Fraction of ListView height for down-scroll bound.\n     * Capped at 0.5f.\n     * \n     */\n    public void setDragScrollStarts(float upperFrac, float lowerFrac) {\n        if (lowerFrac > 0.5f) {\n            mDragDownScrollStartFrac = 0.5f;\n        } else {\n            mDragDownScrollStartFrac = lowerFrac;\n        }\n\n        if (upperFrac > 0.5f) {\n            mDragUpScrollStartFrac = 0.5f;\n        } else {\n            mDragUpScrollStartFrac = upperFrac;\n        }\n\n        if (getHeight() != 0) {\n            updateScrollStarts();\n        }\n    }\n\n    private void continueDrag(int x, int y) {\n\n        // proposed position\n        mFloatLoc.x = x - mDragDeltaX;\n        mFloatLoc.y = y - mDragDeltaY;\n\n        doDragFloatView(true);\n\n        int minY = Math.min(y, mFloatViewMid + mFloatViewHeightHalf);\n        int maxY = Math.max(y, mFloatViewMid - mFloatViewHeightHalf);\n\n        // get the current scroll direction\n        int currentScrollDir = mDragScroller.getScrollDir();\n\n        if (minY > mLastY && minY > mDownScrollStartY && currentScrollDir != DragScroller.DOWN) {\n            // dragged down, it is below the down scroll start and it is not\n            // scrolling up\n\n            if (currentScrollDir != DragScroller.STOP) {\n                // moved directly from up scroll to down scroll\n                mDragScroller.stopScrolling(true);\n            }\n\n            // start scrolling down\n            mDragScroller.startScrolling(DragScroller.DOWN);\n        } else if (maxY < mLastY && maxY < mUpScrollStartY && currentScrollDir != DragScroller.UP) {\n            // dragged up, it is above the up scroll start and it is not\n            // scrolling up\n\n            if (currentScrollDir != DragScroller.STOP) {\n                // moved directly from down scroll to up scroll\n                mDragScroller.stopScrolling(true);\n            }\n\n            // start scrolling up\n            mDragScroller.startScrolling(DragScroller.UP);\n        }\n        else if (maxY >= mUpScrollStartY && minY <= mDownScrollStartY\n                && mDragScroller.isScrolling()) {\n            // not in the upper nor in the lower drag-scroll regions but it is\n            // still scrolling\n\n            mDragScroller.stopScrolling(true);\n        }\n    }\n\n    private void updateScrollStarts() {\n        final int padTop = getPaddingTop();\n        final int listHeight = getHeight() - padTop - getPaddingBottom();\n        float heightF = (float) listHeight;\n\n        mUpScrollStartYF = padTop + mDragUpScrollStartFrac * heightF;\n        mDownScrollStartYF = padTop + (1.0f - mDragDownScrollStartFrac) * heightF;\n\n        mUpScrollStartY = (int) mUpScrollStartYF;\n        mDownScrollStartY = (int) mDownScrollStartYF;\n\n        mDragUpScrollHeight = mUpScrollStartYF - padTop;\n        mDragDownScrollHeight = padTop + listHeight - mDownScrollStartYF;\n    }\n\n    @Override\n    protected void onSizeChanged(int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n        updateScrollStarts();\n    }\n\n    private void adjustAllItems() {\n        final int first = getFirstVisiblePosition();\n        final int last = getLastVisiblePosition();\n\n        int begin = Math.max(0, getHeaderViewsCount() - first);\n        int end = Math.min(last - first, getCount() - 1 - getFooterViewsCount() - first);\n\n        for (int i = begin; i <= end; ++i) {\n            View v = getChildAt(i);\n            if (v != null) {\n                adjustItem(first + i, v, false);\n            }\n        }\n    }\n\n    private void adjustItem(int position) {\n        View v = getChildAt(position - getFirstVisiblePosition());\n\n        if (v != null) {\n            adjustItem(position, v, false);\n        }\n    }\n\n    /**\n     * Sets layout param height, gravity, and visibility  on\n     * wrapped item.\n     */\n    private void adjustItem(int position, View v, boolean invalidChildHeight) {\n\n        // Adjust item height\n        ViewGroup.LayoutParams lp = v.getLayoutParams();\n        int height;\n        if (position != mSrcPos && position != mFirstExpPos && position != mSecondExpPos) {\n            height = ViewGroup.LayoutParams.WRAP_CONTENT;\n        } else {\n            height = calcItemHeight(position, v, invalidChildHeight);\n        }\n\n        if (height != lp.height) {\n            lp.height = height;\n            v.setLayoutParams(lp);\n        }\n\n        // Adjust item gravity\n        if (position == mFirstExpPos || position == mSecondExpPos) {\n            if (position < mSrcPos) {\n                ((DragSortItemView) v).setGravity(Gravity.BOTTOM);\n            } else if (position > mSrcPos) {\n                ((DragSortItemView) v).setGravity(Gravity.TOP);\n            }\n        }\n\n        // Finally adjust item visibility\n\n        int oldVis = v.getVisibility();\n        int vis = View.VISIBLE;\n\n        if (position == mSrcPos && mFloatView != null) {\n            vis = View.INVISIBLE;\n        }\n\n        if (vis != oldVis) {\n            v.setVisibility(vis);\n        }\n    }\n\n    private int getChildHeight(int position) {\n        if (position == mSrcPos) {\n            return 0;\n        }\n\n        View v = getChildAt(position - getFirstVisiblePosition());\n\n        if (v != null) {\n            // item is onscreen, therefore child height is valid,\n            // hence the \"true\"\n            return getChildHeight(position, v, false);\n        } else {\n            // item is offscreen\n            // first check cache for child height at this position\n            int childHeight = mChildHeightCache.get(position);\n            if (childHeight != -1) {\n                // Log.d(\"mobeta\", \"found child height in cache!\");\n                return childHeight;\n            }\n\n            final ListAdapter adapter = getAdapter();\n            int type = adapter.getItemViewType(position);\n\n            // There might be a better place for checking for the following\n            final int typeCount = adapter.getViewTypeCount();\n            if (typeCount != mSampleViewTypes.length) {\n                mSampleViewTypes = new View[typeCount];\n            }\n\n            if (type >= 0) {\n                if (mSampleViewTypes[type] == null) {\n                    v = adapter.getView(position, null, this);\n                    mSampleViewTypes[type] = v;\n                } else {\n                    v = adapter.getView(position, mSampleViewTypes[type], this);\n                }\n            } else {\n                // type is HEADER_OR_FOOTER or IGNORE\n                v = adapter.getView(position, null, this);\n            }\n\n            // current child height is invalid, hence \"true\" below\n            childHeight = getChildHeight(position, v, true);\n\n            // cache it because this could have been expensive\n            mChildHeightCache.add(position, childHeight);\n\n            return childHeight;\n        }\n    }\n\n    private int getChildHeight(int position, View item, boolean invalidChildHeight) {\n        if (position == mSrcPos) {\n            return 0;\n        }\n\n        View child;\n        if (position < getHeaderViewsCount() || position >= getCount() - getFooterViewsCount()) {\n            child = item;\n        } else {\n            child = ((ViewGroup) item).getChildAt(0);\n        }\n\n        ViewGroup.LayoutParams lp = child.getLayoutParams();\n\n        if (lp != null) {\n            if (lp.height > 0) {\n                return lp.height;\n            }\n        }\n\n        int childHeight = child.getHeight();\n\n        if (childHeight == 0 || invalidChildHeight) {\n            measureItem(child);\n            childHeight = child.getMeasuredHeight();\n        }\n\n        return childHeight;\n    }\n\n    private int calcItemHeight(int position, View item, boolean invalidChildHeight) {\n        return calcItemHeight(position, getChildHeight(position, item, invalidChildHeight));\n    }\n\n    private int calcItemHeight(int position, int childHeight) {\n\n        int divHeight = getDividerHeight();\n\n        boolean isSliding = mAnimate && mFirstExpPos != mSecondExpPos;\n        int maxNonSrcBlankHeight = mFloatViewHeight - mItemHeightCollapsed;\n        int slideHeight = (int) (mSlideFrac * maxNonSrcBlankHeight);\n\n        int height;\n\n        if (position == mSrcPos) {\n            if (mSrcPos == mFirstExpPos) {\n                if (isSliding) {\n                    height = slideHeight + mItemHeightCollapsed;\n                } else {\n                    height = mFloatViewHeight;\n                }\n            } else if (mSrcPos == mSecondExpPos) {\n                // if gets here, we know an item is sliding\n                height = mFloatViewHeight - slideHeight;\n            } else {\n                height = mItemHeightCollapsed;\n            }\n        } else if (position == mFirstExpPos) {\n            if (isSliding) {\n                height = childHeight + slideHeight;\n            } else {\n                height = childHeight + maxNonSrcBlankHeight;\n            }\n        } else if (position == mSecondExpPos) {\n            // we know an item is sliding (b/c 2ndPos != 1stPos)\n            height = childHeight + maxNonSrcBlankHeight - slideHeight;\n        } else {\n            height = childHeight;\n        }\n\n        return height;\n    }\n\n    @Override\n    public void requestLayout() {\n        if (!mBlockLayoutRequests) {\n            super.requestLayout();\n        }\n    }\n\n    private int adjustScroll(int movePos, View moveItem, int oldFirstExpPos, int oldSecondExpPos) {\n        int adjust = 0;\n\n        final int childHeight = getChildHeight(movePos);\n\n        int moveHeightBefore = moveItem.getHeight();\n        int moveHeightAfter = calcItemHeight(movePos, childHeight);\n\n        int moveBlankBefore = moveHeightBefore;\n        int moveBlankAfter = moveHeightAfter;\n        if (movePos != mSrcPos) {\n            moveBlankBefore -= childHeight;\n            moveBlankAfter -= childHeight;\n        }\n\n        int maxBlank = mFloatViewHeight;\n        if (mSrcPos != mFirstExpPos && mSrcPos != mSecondExpPos) {\n            maxBlank -= mItemHeightCollapsed;\n        }\n\n        if (movePos <= oldFirstExpPos) {\n            if (movePos > mFirstExpPos) {\n                adjust += maxBlank - moveBlankAfter;\n            }\n        } else if (movePos == oldSecondExpPos) {\n            if (movePos <= mFirstExpPos) {\n                adjust += moveBlankBefore - maxBlank;\n            } else if (movePos == mSecondExpPos) {\n                adjust += moveHeightBefore - moveHeightAfter;\n            } else {\n                adjust += moveBlankBefore;\n            }\n        } else {\n            if (movePos <= mFirstExpPos) {\n                adjust -= maxBlank;\n            } else if (movePos == mSecondExpPos) {\n                adjust -= moveBlankAfter;\n            }\n        }\n\n        return adjust;\n    }\n\n    private void measureItem(View item) {\n        ViewGroup.LayoutParams lp = item.getLayoutParams();\n        if (lp == null) {\n            lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);\n            item.setLayoutParams(lp);\n        }\n        int wspec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec, getListPaddingLeft()\n                + getListPaddingRight(), lp.width);\n        int hspec;\n        if (lp.height > 0) {\n            hspec = MeasureSpec.makeMeasureSpec(lp.height, MeasureSpec.EXACTLY);\n        } else {\n            hspec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);\n        }\n        item.measure(wspec, hspec);\n    }\n\n    private void measureFloatView() {\n        if (mFloatView != null) {\n            measureItem(mFloatView);\n            mFloatViewHeight = mFloatView.getMeasuredHeight();\n            mFloatViewHeightHalf = mFloatViewHeight / 2;\n        }\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec);\n        // Log.d(\"mobeta\", \"onMeasure called\");\n        if (mFloatView != null) {\n            if (mFloatView.isLayoutRequested()) {\n                measureFloatView();\n            }\n            mFloatViewOnMeasured = true; // set to false after layout\n        }\n        mWidthMeasureSpec = widthMeasureSpec;\n    }\n\n    @Override\n    protected void layoutChildren() {\n        super.layoutChildren();\n\n        if (mFloatView != null) {\n            if (mFloatView.isLayoutRequested() && !mFloatViewOnMeasured) {\n                // Have to measure here when usual android measure\n                // pass is skipped. This happens during a drag-sort\n                // when layoutChildren is called directly.\n                measureFloatView();\n            }\n            mFloatView.layout(0, 0, mFloatView.getMeasuredWidth(), mFloatView.getMeasuredHeight());\n            mFloatViewOnMeasured = false;\n        }\n    }\n\n    protected boolean onDragTouchEvent(MotionEvent ev) {\n        // we are in a drag\n        int action = ev.getAction() & MotionEvent.ACTION_MASK;\n\n        switch (ev.getAction() & MotionEvent.ACTION_MASK) {\n            case MotionEvent.ACTION_CANCEL:\n                if (mDragState == DRAGGING) {\n                    cancelDrag();\n                }\n                doActionUpOrCancel();\n                break;\n            case MotionEvent.ACTION_UP:\n                // Log.d(\"mobeta\", \"calling stopDrag from onDragTouchEvent\");\n                if (mDragState == DRAGGING) {\n                    stopDrag(false);\n                }\n                doActionUpOrCancel();\n                break;\n            case MotionEvent.ACTION_MOVE:\n                continueDrag((int) ev.getX(), (int) ev.getY());\n                break;\n        }\n\n        return true;\n    }\n\n    private boolean mFloatViewInvalidated = false;\n\n    private void invalidateFloatView() {\n        mFloatViewInvalidated = true;\n    }\n\n    /**\n     * Start a drag of item at <code>position</code> using the\n     * registered FloatViewManager. Calls through\n     * to {@link #startDrag(int,View,int,int,int)} after obtaining\n     * the floating View from the FloatViewManager.\n     *\n     * @param position Item to drag.\n     * @param dragFlags Flags that restrict some movements of the\n     * floating View. For example, set <code>dragFlags |= \n     * ~{@link #DRAG_NEG_X}</code> to allow dragging the floating\n     * View in all directions except off the screen to the left.\n     * @param deltaX Offset in x of the touch coordinate from the\n     * left edge of the floating View (i.e. touch-x minus float View\n     * left).\n     * @param deltaY Offset in y of the touch coordinate from the\n     * top edge of the floating View (i.e. touch-y minus float View\n     * top).\n     *\n     * @return True if the drag was started, false otherwise. This\n     * <code>startDrag</code> will fail if we are not currently in\n     * a touch event, there is no registered FloatViewManager,\n     * or the FloatViewManager returns a null View.\n     */\n    public boolean startDrag(int position, int dragFlags, int deltaX, int deltaY) {\n        if (!mInTouchEvent || mFloatViewManager == null) {\n            return false;\n        }\n\n        View v = mFloatViewManager.onCreateFloatView(position);\n\n        if (v == null) {\n            return false;\n        } else {\n            return startDrag(position, v, dragFlags, deltaX, deltaY);\n        }\n\n    }\n\n    /**\n     * Start a drag of item at <code>position</code> without using\n     * a FloatViewManager.\n     *\n     * @param position Item to drag.\n     * @param floatView Floating View.\n     * @param dragFlags Flags that restrict some movements of the\n     * floating View. For example, set <code>dragFlags |= \n     * ~{@link #DRAG_NEG_X}</code> to allow dragging the floating\n     * View in all directions except off the screen to the left.\n     * @param deltaX Offset in x of the touch coordinate from the\n     * left edge of the floating View (i.e. touch-x minus float View\n     * left).\n     * @param deltaY Offset in y of the touch coordinate from the\n     * top edge of the floating View (i.e. touch-y minus float View\n     * top).\n     *\n     * @return True if the drag was started, false otherwise. This\n     * <code>startDrag</code> will fail if we are not currently in\n     * a touch event, <code>floatView</code> is null, or there is\n     * a drag in progress.\n     */\n    public boolean startDrag(int position, View floatView, int dragFlags, int deltaX, int deltaY) {\n        if (mDragState != IDLE || !mInTouchEvent || mFloatView != null || floatView == null\n                || !mDragEnabled) {\n            return false;\n        }\n\n        if (getParent() != null) {\n            getParent().requestDisallowInterceptTouchEvent(true);\n        }\n\n        int pos = position + getHeaderViewsCount();\n        mFirstExpPos = pos;\n        mSecondExpPos = pos;\n        mSrcPos = pos;\n        mFloatPos = pos;\n\n        // mDragState = dragType;\n        mDragState = DRAGGING;\n        mDragFlags = 0;\n        mDragFlags |= dragFlags;\n\n        mFloatView = floatView;\n        measureFloatView(); // sets mFloatViewHeight\n\n        mDragDeltaX = deltaX;\n        mDragDeltaY = deltaY;\n        mDragStartY = mY;\n\n        // updateFloatView(mX - mDragDeltaX, mY - mDragDeltaY);\n        mFloatLoc.x = mX - mDragDeltaX;\n        mFloatLoc.y = mY - mDragDeltaY;\n\n        // set src item invisible\n        final View srcItem = getChildAt(mSrcPos - getFirstVisiblePosition());\n\n        if (srcItem != null) {\n            srcItem.setVisibility(View.INVISIBLE);\n        }\n\n        if (mTrackDragSort) {\n            mDragSortTracker.startTracking();\n        }\n\n        // once float view is created, events are no longer passed\n        // to ListView\n        switch (mCancelMethod) {\n            case ON_TOUCH_EVENT:\n                super.onTouchEvent(mCancelEvent);\n                break;\n            case ON_INTERCEPT_TOUCH_EVENT:\n                super.onInterceptTouchEvent(mCancelEvent);\n                break;\n        }\n\n        requestLayout();\n\n        if (mLiftAnimator != null) {\n            mLiftAnimator.start();\n        }\n\n        return true;\n    }\n\n    private void doDragFloatView(boolean forceInvalidate) {\n        int movePos = getFirstVisiblePosition() + getChildCount() / 2;\n        View moveItem = getChildAt(getChildCount() / 2);\n\n        if (moveItem == null) {\n            return;\n        }\n\n        doDragFloatView(movePos, moveItem, forceInvalidate);\n    }\n\n    private void doDragFloatView(int movePos, View moveItem, boolean forceInvalidate) {\n        mBlockLayoutRequests = true;\n\n        updateFloatView();\n\n        int oldFirstExpPos = mFirstExpPos;\n        int oldSecondExpPos = mSecondExpPos;\n\n        boolean updated = updatePositions();\n\n        if (updated) {\n            adjustAllItems();\n            int scroll = adjustScroll(movePos, moveItem, oldFirstExpPos, oldSecondExpPos);\n            // Log.d(\"mobeta\", \"  adjust scroll=\"+scroll);\n\n            setSelectionFromTop(movePos, moveItem.getTop() + scroll - getPaddingTop());\n            layoutChildren();\n        }\n\n        if (updated || forceInvalidate) {\n            invalidate();\n        }\n\n        mBlockLayoutRequests = false;\n    }\n\n    /**\n     * Sets float View location based on suggested values and\n     * constraints set in mDragFlags.\n     */\n    private void updateFloatView() {\n\n        if (mFloatViewManager != null) {\n            mTouchLoc.set(mX, mY);\n            mFloatViewManager.onDragFloatView(mFloatView, mFloatLoc, mTouchLoc);\n        }\n\n        final int floatX = mFloatLoc.x;\n        final int floatY = mFloatLoc.y;\n\n        // restrict x motion\n        int padLeft = getPaddingLeft();\n        if ((mDragFlags & DRAG_POS_X) == 0 && floatX > padLeft) {\n            mFloatLoc.x = padLeft;\n        } else if ((mDragFlags & DRAG_NEG_X) == 0 && floatX < padLeft) {\n            mFloatLoc.x = padLeft;\n        }\n\n        // keep floating view from going past bottom of last header view\n        final int numHeaders = getHeaderViewsCount();\n        final int numFooters = getFooterViewsCount();\n        final int firstPos = getFirstVisiblePosition();\n        final int lastPos = getLastVisiblePosition();\n\n        // Log.d(\"mobeta\",\n        // \"nHead=\"+numHeaders+\" nFoot=\"+numFooters+\" first=\"+firstPos+\" last=\"+lastPos);\n        int topLimit = getPaddingTop();\n        if (firstPos < numHeaders) {\n            topLimit = getChildAt(numHeaders - firstPos - 1).getBottom();\n        }\n        if ((mDragFlags & DRAG_NEG_Y) == 0) {\n            if (firstPos <= mSrcPos) {\n                topLimit = Math.max(getChildAt(mSrcPos - firstPos).getTop(), topLimit);\n            }\n        }\n        // bottom limit is top of first footer View or\n        // bottom of last item in list\n        int bottomLimit = getHeight() - getPaddingBottom();\n        if (lastPos >= getCount() - numFooters - 1) {\n            bottomLimit = getChildAt(getCount() - numFooters - 1 - firstPos).getBottom();\n        }\n        if ((mDragFlags & DRAG_POS_Y) == 0) {\n            if (lastPos >= mSrcPos) {\n                bottomLimit = Math.min(getChildAt(mSrcPos - firstPos).getBottom(), bottomLimit);\n            }\n        }\n\n        // Log.d(\"mobeta\", \"dragView top=\" + (y - mDragDeltaY));\n        // Log.d(\"mobeta\", \"limit=\" + limit);\n        // Log.d(\"mobeta\", \"mDragDeltaY=\" + mDragDeltaY);\n\n        if (floatY < topLimit) {\n            mFloatLoc.y = topLimit;\n        } else if (floatY + mFloatViewHeight > bottomLimit) {\n            mFloatLoc.y = bottomLimit - mFloatViewHeight;\n        }\n\n        // get y-midpoint of floating view (constrained to ListView bounds)\n        mFloatViewMid = mFloatLoc.y + mFloatViewHeightHalf;\n    }\n\n    private void destroyFloatView() {\n        if (mFloatView != null) {\n            mFloatView.setVisibility(GONE);\n            if (mFloatViewManager != null) {\n                mFloatViewManager.onDestroyFloatView(mFloatView);\n            }\n            mFloatView = null;\n            invalidate();\n        }\n    }\n\n    /**\n     * Interface for customization of the floating View appearance\n     * and dragging behavior. Implement\n     * your own and pass it to {@link #setFloatViewManager}. If\n     * your own is not passed, the default {@link SimpleFloatViewManager}\n     * implementation is used.\n     */\n    public interface FloatViewManager {\n        /**\n         * Return the floating View for item at <code>position</code>.\n         * DragSortListView will measure and layout this View for you,\n         * so feel free to just inflate it. You can help DSLV by\n         * setting some {@link ViewGroup.LayoutParams} on this View;\n         * otherwise it will set some for you (with a width of FILL_PARENT\n         * and a height of WRAP_CONTENT).\n         *\n         * @param position Position of item to drag (NOTE:\n         * <code>position</code> excludes header Views; thus, if you\n         * want to call {@link ListView#getChildAt(int)}, you will need\n         * to add {@link ListView#getHeaderViewsCount()} to the index).\n         *\n         * @return The View you wish to display as the floating View.\n         */\n        public View onCreateFloatView(int position);\n\n        /**\n         * Called whenever the floating View is dragged. Float View\n         * properties can be changed here. Also, the upcoming location\n         * of the float View can be altered by setting\n         * <code>location.x</code> and <code>location.y</code>.\n         *\n         * @param floatView The floating View.\n         * @param location The location (top-left; relative to DSLV\n         * top-left) at which the float\n         * View would like to appear, given the current touch location\n         * and the offset provided in {@link DragSortListView#startDrag}.\n         * @param touch The current touch location (relative to DSLV\n         * top-left).\n         * @param pendingScroll \n         */\n        public void onDragFloatView(View floatView, Point location, Point touch);\n\n        /**\n         * Called when the float View is dropped; lets you perform\n         * any necessary cleanup. The internal DSLV floating View\n         * reference is set to null immediately after this is called.\n         *\n         * @param floatView The floating View passed to\n         * {@link #onCreateFloatView(int)}.\n         */\n        public void onDestroyFloatView(View floatView);\n    }\n\n    public void setFloatViewManager(FloatViewManager manager) {\n        mFloatViewManager = manager;\n    }\n\n    public void setDragListener(DragListener l) {\n        mDragListener = l;\n    }\n\n    /**\n     * Allows for easy toggling between a DragSortListView\n     * and a regular old ListView. If enabled, items are\n     * draggable, where the drag init mode determines how\n     * items are lifted (see {@link setDragInitMode(int)}).\n     * If disabled, items cannot be dragged.\n     *\n     * @param enabled Set <code>true</code> to enable list\n     * item dragging\n     */\n    public void setDragEnabled(boolean enabled) {\n        mDragEnabled = enabled;\n    }\n\n    public boolean isDragEnabled() {\n        return mDragEnabled;\n    }\n\n    /**\n     * This better reorder your ListAdapter! DragSortListView does not do this\n     * for you; doesn't make sense to. Make sure\n     * {@link BaseAdapter#notifyDataSetChanged()} or something like it is called\n     * in your implementation. Furthermore, if you have a choiceMode other than\n     * none and the ListAdapter does not return true for\n     * {@link ListAdapter#hasStableIds()}, you will need to call\n     * {@link #moveCheckState(int, int)} to move the check boxes along with the\n     * list items.\n     * \n     * @param l\n     */\n    public void setDropListener(DropListener l) {\n        mDropListener = l;\n    }\n\n    /**\n     * Probably a no-brainer, but make sure that your remove listener\n     * calls {@link BaseAdapter#notifyDataSetChanged()} or something like it.\n     * When an item removal occurs, DragSortListView\n     * relies on a redraw of all the items to recover invisible views\n     * and such. Strictly speaking, if you remove something, your dataset\n     * has changed...\n     * \n     * @param l\n     */\n    public void setRemoveListener(RemoveListener l) {\n        mRemoveListener = l;\n    }\n\n    public interface DragListener {\n        public void drag(int from, int to);\n    }\n\n    /**\n     * Your implementation of this has to reorder your ListAdapter! \n     * Make sure to call\n     * {@link BaseAdapter#notifyDataSetChanged()} or something like it\n     * in your implementation.\n     * \n     * @author heycosmo\n     *\n     */\n    public interface DropListener {\n        public void drop(int from, int to);\n    }\n\n    /**\n     * Make sure to call\n     * {@link BaseAdapter#notifyDataSetChanged()} or something like it\n     * in your implementation.\n     * \n     * @author heycosmo\n     *\n     */\n    public interface RemoveListener {\n        public void remove(int which);\n    }\n\n    public interface DragSortListener extends DropListener, DragListener, RemoveListener {\n    }\n\n    public void setDragSortListener(DragSortListener l) {\n        setDropListener(l);\n        setDragListener(l);\n        setRemoveListener(l);\n    }\n\n    /**\n     * Completely custom scroll speed profile. Default increases linearly\n     * with position and is constant in time. Create your own by implementing\n     * {@link DragSortListView.DragScrollProfile}.\n     * \n     * @param ssp\n     */\n    public void setDragScrollProfile(DragScrollProfile ssp) {\n        if (ssp != null) {\n            mScrollProfile = ssp;\n        }\n    }\n\n    /**\n     * Use this to move the check state of an item from one position to another\n     * in a drop operation. If you have a choiceMode which is not none, this\n     * method must be called when the order of items changes in an underlying\n     * adapter which does not have stable IDs (see\n     * {@link ListAdapter#hasStableIds()}). This is because without IDs, the\n     * ListView has no way of knowing which items have moved where, and cannot\n     * update the check state accordingly.\n     * <p>\n     * A word of warning about a \"feature\" in Android that you may run into when\n     * dealing with movable list items: for an adapter that <em>does</em> have\n     * stable IDs, ListView will attempt to locate each item based on its ID and\n     * move the check state from the item's old position to the new position —\n     * which is all fine and good (and removes the need for calling this\n     * function), except for the half-baked approach. Apparently to save time in\n     * the naive algorithm used, ListView will only search for an ID in the\n     * close neighborhood of the old position. If the user moves an item too far\n     * (specifically, more than 20 rows away), ListView will give up and just\n     * force the item to be unchecked. So if there is a reasonable chance that\n     * the user will move items more than 20 rows away from the original\n     * position, you may wish to use an adapter with unstable IDs and call this\n     * method manually instead.\n     * \n     * @param from\n     * @param to\n     */\n    public void moveCheckState(int from, int to) {\n        // This method runs in O(n log n) time (n being the number of list\n        // items). The bottleneck is the call to AbsListView.setItemChecked,\n        // which is O(log n) because of the binary search involved in calling\n        // SparseBooleanArray.put().\n        //\n        // To improve on the average time, we minimize the number of calls to\n        // setItemChecked by only calling it for items that actually have a\n        // changed state. This is achieved by building a list containing the\n        // start and end of the \"runs\" of checked items, and then moving the\n        // runs. Note that moving an item from A to B is essentially a rotation\n        // of the range of items in [A, B]. Let's say we have\n        // . . U V X Y Z . .\n        // and move U after Z. This is equivalent to a rotation one step to the\n        // left within the range you are moving across:\n        // . . V X Y Z U . .\n        //\n        // So, to perform the move we enumerate all the runs within the move\n        // range, then rotate each run one step to the left or right (depending\n        // on move direction). For example, in the list:\n        // X X . X X X . X\n        // we have two runs. One begins at the last item of the list and wraps\n        // around to the beginning, ending at position 1. The second begins at\n        // position 3 and ends at position 5. To rotate a run, regardless of\n        // length, we only need to set a check mark at one end of the run, and\n        // clear a check mark at the other end:\n        // X . X X X . X X\n        SparseBooleanArray cip = getCheckedItemPositions();\n        int rangeStart = from;\n        int rangeEnd = to;\n        if (to < from) {\n            rangeStart = to;\n            rangeEnd = from;\n        }\n        rangeEnd += 1;\n\n        int[] runStart = new int[cip.size()];\n        int[] runEnd = new int[cip.size()];\n        int runCount = buildRunList(cip, rangeStart, rangeEnd, runStart, runEnd);\n        if (runCount == 1 && (runStart[0] == runEnd[0])) {\n            // Special case where all items are checked, we can never set any\n            // item to false like we do below.\n            return;\n        }\n\n        if (from < to) {\n            for (int i = 0; i != runCount; i++) {\n                setItemChecked(rotate(runStart[i], -1, rangeStart, rangeEnd), true);\n                setItemChecked(rotate(runEnd[i], -1, rangeStart, rangeEnd), false);\n            }\n\n        } else {\n            for (int i = 0; i != runCount; i++) {\n                setItemChecked(runStart[i], false);\n                setItemChecked(runEnd[i], true);\n            }\n        }\n    }\n\n    /**\n     * Use this when an item has been deleted, to move the check state of all\n     * following items up one step. If you have a choiceMode which is not none,\n     * this method must be called when the order of items changes in an\n     * underlying adapter which does not have stable IDs (see\n     * {@link ListAdapter#hasStableIds()}). This is because without IDs, the\n     * ListView has no way of knowing which items have moved where, and cannot\n     * update the check state accordingly.\n     * \n     * See also further comments on {@link #moveCheckState(int, int)}.\n     * \n     * @param position\n     */\n    public void removeCheckState(int position) {\n        SparseBooleanArray cip = getCheckedItemPositions();\n\n        if (cip.size() == 0)\n            return;\n        int[] runStart = new int[cip.size()];\n        int[] runEnd = new int[cip.size()];\n        int rangeStart = position;\n        int rangeEnd = cip.keyAt(cip.size() - 1) + 1;\n        int runCount = buildRunList(cip, rangeStart, rangeEnd, runStart, runEnd);\n        for (int i = 0; i != runCount; i++) {\n            if (!(runStart[i] == position || (runEnd[i] < runStart[i] && runEnd[i] > position))) {\n                // Only set a new check mark in front of this run if it does\n                // not contain the deleted position. If it does, we only need\n                // to make it one check mark shorter at the end.\n                setItemChecked(rotate(runStart[i], -1, rangeStart, rangeEnd), true);\n            }\n            setItemChecked(rotate(runEnd[i], -1, rangeStart, rangeEnd), false);\n        }\n    }\n\n    private static int buildRunList(SparseBooleanArray cip, int rangeStart,\n            int rangeEnd, int[] runStart, int[] runEnd) {\n        int runCount = 0;\n\n        int i = findFirstSetIndex(cip, rangeStart, rangeEnd);\n        if (i == -1)\n            return 0;\n\n        int position = cip.keyAt(i);\n        int currentRunStart = position;\n        int currentRunEnd = currentRunStart + 1;\n        for (i++; i < cip.size() && (position = cip.keyAt(i)) < rangeEnd; i++) {\n            if (!cip.valueAt(i)) // not checked => not interesting\n                continue;\n            if (position == currentRunEnd) {\n                currentRunEnd++;\n            } else {\n                runStart[runCount] = currentRunStart;\n                runEnd[runCount] = currentRunEnd;\n                runCount++;\n                currentRunStart = position;\n                currentRunEnd = position + 1;\n            }\n        }\n\n        if (currentRunEnd == rangeEnd) {\n            // rangeStart and rangeEnd are equivalent positions so to be\n            // consistent we translate them to the same integer value. That way\n            // we can check whether a run covers the entire range by just\n            // checking if the start equals the end position.\n            currentRunEnd = rangeStart;\n        }\n        runStart[runCount] = currentRunStart;\n        runEnd[runCount] = currentRunEnd;\n        runCount++;\n\n        if (runCount > 1) {\n            if (runStart[0] == rangeStart && runEnd[runCount - 1] == rangeStart) {\n                // The last run ends at the end of the range, and the first run\n                // starts at the beginning of the range. So they are actually\n                // part of the same run, except they wrap around the end of the\n                // range. To avoid adjacent runs, we need to merge them.\n                runStart[0] = runStart[runCount - 1];\n                runCount--;\n            }\n        }\n        return runCount;\n    }\n\n    private static int rotate(int value, int offset, int lowerBound, int upperBound) {\n        int windowSize = upperBound - lowerBound;\n\n        value += offset;\n        if (value < lowerBound) {\n            value += windowSize;\n        } else if (value >= upperBound) {\n            value -= windowSize;\n        }\n        return value;\n    }\n\n    private static int findFirstSetIndex(SparseBooleanArray sba, int rangeStart, int rangeEnd) {\n        int size = sba.size();\n        int i = insertionIndexForKey(sba, rangeStart);\n        while (i < size && sba.keyAt(i) < rangeEnd && !sba.valueAt(i))\n            i++;\n        if (i == size || sba.keyAt(i) >= rangeEnd)\n            return -1;\n        return i;\n    }\n\n    private static int insertionIndexForKey(SparseBooleanArray sba, int key) {\n        int low = 0;\n        int high = sba.size();\n        while (high - low > 0) {\n            int middle = (low + high) >> 1;\n            if (sba.keyAt(middle) < key)\n                low = middle + 1;\n            else\n                high = middle;\n        }\n        return low;\n    }\n\n    /**\n     * Interface for controlling\n     * scroll speed as a function of touch position and time. Use\n     * {@link DragSortListView#setDragScrollProfile(DragScrollProfile)} to\n     * set custom profile.\n     * \n     * @author heycosmo\n     *\n     */\n    public interface DragScrollProfile {\n        /**\n         * Return a scroll speed in pixels/millisecond. Always return a\n         * positive number.\n         * \n         * @param w Normalized position in scroll region (i.e. w \\in [0,1]).\n         * Small w typically means slow scrolling.\n         * @param t Time (in milliseconds) since start of scroll (handy if you\n         * want scroll acceleration).\n         * @return Scroll speed at position w and time t in pixels/ms.\n         */\n        float getSpeed(float w, long t);\n    }\n\n    private class DragScroller implements Runnable {\n\n        private boolean mAbort;\n\n        private long mPrevTime;\n        private long mCurrTime;\n\n        private int dy;\n        private float dt;\n        private long tStart;\n        private int scrollDir;\n\n        public final static int STOP = -1;\n        public final static int UP = 0;\n        public final static int DOWN = 1;\n\n        private float mScrollSpeed; // pixels per ms\n\n        private boolean mScrolling = false;\n\n        private int mLastHeader;\n        private int mFirstFooter;\n\n        public boolean isScrolling() {\n            return mScrolling;\n        }\n\n        public int getScrollDir() {\n            return mScrolling ? scrollDir : STOP;\n        }\n\n        public DragScroller() {\n        }\n\n        public void startScrolling(int dir) {\n            if (!mScrolling) {\n                // Debug.startMethodTracing(\"dslv-scroll\");\n                mAbort = false;\n                mScrolling = true;\n                tStart = SystemClock.uptimeMillis();\n                mPrevTime = tStart;\n                scrollDir = dir;\n                post(this);\n            }\n        }\n\n        public void stopScrolling(boolean now) {\n            if (now) {\n                DragSortListView.this.removeCallbacks(this);\n                mScrolling = false;\n            } else {\n                mAbort = true;\n            }\n\n            // Debug.stopMethodTracing();\n        }\n\n        @Override\n        public void run() {\n            if (mAbort) {\n                mScrolling = false;\n                return;\n            }\n\n            // Log.d(\"mobeta\", \"scroll\");\n\n            final int first = getFirstVisiblePosition();\n            final int last = getLastVisiblePosition();\n            final int count = getCount();\n            final int padTop = getPaddingTop();\n            final int listHeight = getHeight() - padTop - getPaddingBottom();\n\n            int minY = Math.min(mY, mFloatViewMid + mFloatViewHeightHalf);\n            int maxY = Math.max(mY, mFloatViewMid - mFloatViewHeightHalf);\n\n            if (scrollDir == UP) {\n                View v = getChildAt(0);\n                // Log.d(\"mobeta\", \"vtop=\"+v.getTop()+\" padtop=\"+padTop);\n                if (v == null) {\n                    mScrolling = false;\n                    return;\n                } else {\n                    if (first == 0 && v.getTop() == padTop) {\n                        mScrolling = false;\n                        return;\n                    }\n                }\n                mScrollSpeed = mScrollProfile.getSpeed((mUpScrollStartYF - maxY)\n                        / mDragUpScrollHeight, mPrevTime);\n            } else {\n                View v = getChildAt(last - first);\n                if (v == null) {\n                    mScrolling = false;\n                    return;\n                } else {\n                    if (last == count - 1 && v.getBottom() <= listHeight + padTop) {\n                        mScrolling = false;\n                        return;\n                    }\n                }\n                mScrollSpeed = -mScrollProfile.getSpeed((minY - mDownScrollStartYF)\n                        / mDragDownScrollHeight, mPrevTime);\n            }\n\n            mCurrTime = SystemClock.uptimeMillis();\n            dt = (float) (mCurrTime - mPrevTime);\n\n            // dy is change in View position of a list item; i.e. positive dy\n            // means user is scrolling up (list item moves down the screen,\n            // remember\n            // y=0 is at top of View).\n            dy = (int) Math.round(mScrollSpeed * dt);\n\n            int movePos;\n            if (dy >= 0) {\n                dy = Math.min(listHeight, dy);\n                movePos = first;\n            } else {\n                dy = Math.max(-listHeight, dy);\n                movePos = last;\n            }\n\n            final View moveItem = getChildAt(movePos - first);\n            int top = moveItem.getTop() + dy;\n\n            if (movePos == 0 && top > padTop) {\n                top = padTop;\n            }\n\n            // always do scroll\n            mBlockLayoutRequests = true;\n\n            setSelectionFromTop(movePos, top - padTop);\n            DragSortListView.this.layoutChildren();\n            invalidate();\n\n            mBlockLayoutRequests = false;\n\n            // scroll means relative float View movement\n            doDragFloatView(movePos, moveItem, false);\n\n            mPrevTime = mCurrTime;\n            // Log.d(\"mobeta\", \"  updated prevTime=\"+mPrevTime);\n\n            post(this);\n        }\n    }\n\n    private class DragSortTracker {\n        StringBuilder mBuilder = new StringBuilder();\n\n        File mFile;\n\n        private int mNumInBuffer = 0;\n        private int mNumFlushes = 0;\n\n        private boolean mTracking = false;\n\n        public DragSortTracker() {\n            File root = Environment.getExternalStorageDirectory();\n            mFile = new File(root, \"dslv_state.txt\");\n\n            if (!mFile.exists()) {\n                try {\n                    mFile.createNewFile();\n                    Log.d(\"mobeta\", \"file created\");\n                } catch (IOException e) {\n                    Log.w(\"mobeta\", \"Could not create dslv_state.txt\");\n                    Log.d(\"mobeta\", e.getMessage());\n                }\n            }\n\n        }\n\n        public void startTracking() {\n            mBuilder.append(\"<DSLVStates>\\n\");\n            mNumFlushes = 0;\n            mTracking = true;\n        }\n\n        public void appendState() {\n            if (!mTracking) {\n                return;\n            }\n\n            mBuilder.append(\"<DSLVState>\\n\");\n            final int children = getChildCount();\n            final int first = getFirstVisiblePosition();\n            mBuilder.append(\"    <Positions>\");\n            for (int i = 0; i < children; ++i) {\n                mBuilder.append(first + i).append(\",\");\n            }\n            mBuilder.append(\"</Positions>\\n\");\n\n            mBuilder.append(\"    <Tops>\");\n            for (int i = 0; i < children; ++i) {\n                mBuilder.append(getChildAt(i).getTop()).append(\",\");\n            }\n            mBuilder.append(\"</Tops>\\n\");\n            mBuilder.append(\"    <Bottoms>\");\n            for (int i = 0; i < children; ++i) {\n                mBuilder.append(getChildAt(i).getBottom()).append(\",\");\n            }\n            mBuilder.append(\"</Bottoms>\\n\");\n\n            mBuilder.append(\"    <FirstExpPos>\").append(mFirstExpPos).append(\"</FirstExpPos>\\n\");\n            mBuilder.append(\"    <FirstExpBlankHeight>\")\n                    .append(getItemHeight(mFirstExpPos) - getChildHeight(mFirstExpPos))\n                    .append(\"</FirstExpBlankHeight>\\n\");\n            mBuilder.append(\"    <SecondExpPos>\").append(mSecondExpPos).append(\"</SecondExpPos>\\n\");\n            mBuilder.append(\"    <SecondExpBlankHeight>\")\n                    .append(getItemHeight(mSecondExpPos) - getChildHeight(mSecondExpPos))\n                    .append(\"</SecondExpBlankHeight>\\n\");\n            mBuilder.append(\"    <SrcPos>\").append(mSrcPos).append(\"</SrcPos>\\n\");\n            mBuilder.append(\"    <SrcHeight>\").append(mFloatViewHeight + getDividerHeight())\n                    .append(\"</SrcHeight>\\n\");\n            mBuilder.append(\"    <ViewHeight>\").append(getHeight()).append(\"</ViewHeight>\\n\");\n            mBuilder.append(\"    <LastY>\").append(mLastY).append(\"</LastY>\\n\");\n            mBuilder.append(\"    <FloatY>\").append(mFloatViewMid).append(\"</FloatY>\\n\");\n            mBuilder.append(\"    <ShuffleEdges>\");\n            for (int i = 0; i < children; ++i) {\n                mBuilder.append(getShuffleEdge(first + i, getChildAt(i).getTop())).append(\",\");\n            }\n            mBuilder.append(\"</ShuffleEdges>\\n\");\n\n            mBuilder.append(\"</DSLVState>\\n\");\n            mNumInBuffer++;\n\n            if (mNumInBuffer > 1000) {\n                flush();\n                mNumInBuffer = 0;\n            }\n        }\n\n        public void flush() {\n            if (!mTracking) {\n                return;\n            }\n\n            // save to file on sdcard\n            try {\n                boolean append = true;\n                if (mNumFlushes == 0) {\n                    append = false;\n                }\n                FileWriter writer = new FileWriter(mFile, append);\n\n                writer.write(mBuilder.toString());\n                mBuilder.delete(0, mBuilder.length());\n\n                writer.flush();\n                writer.close();\n\n                mNumFlushes++;\n            } catch (IOException e) {\n                // do nothing\n            }\n        }\n\n        public void stopTracking() {\n            if (mTracking) {\n                mBuilder.append(\"</DSLVStates>\\n\");\n                flush();\n                mTracking = false;\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/mobeta/android/dslv/ResourceDragSortCursorAdapter.java",
    "content": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.mobeta.android.dslv;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.LayoutInflater;\n\n// taken from v4 rev. 10 ResourceCursorAdapter.java\n\n/**\n * Static library support version of the framework's {@link android.widget.ResourceCursorAdapter}.\n * Used to write apps that run on platforms prior to Android 3.0.  When running\n * on Android 3.0 or above, this implementation is still used; it does not try\n * to switch to the framework's implementation.  See the framework SDK\n * documentation for a class overview.\n */\npublic abstract class ResourceDragSortCursorAdapter extends DragSortCursorAdapter {\n    private int mLayout;\n\n    private int mDropDownLayout;\n    \n    private LayoutInflater mInflater;\n    \n    /**\n     * Constructor the enables auto-requery.\n     *\n     * @deprecated This option is discouraged, as it results in Cursor queries\n     * being performed on the application's UI thread and thus can cause poor\n     * responsiveness or even Application Not Responding errors.  As an alternative,\n     * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.\n     *\n     * @param context The context where the ListView associated with this adapter is running\n     * @param layout resource identifier of a layout file that defines the views\n     *            for this list item.  Unless you override them later, this will\n     *            define both the item views and the drop down views.\n     */\n    @Deprecated\n    public ResourceDragSortCursorAdapter(Context context, int layout, Cursor c) {\n        super(context, c);\n        mLayout = mDropDownLayout = layout;\n        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n    }\n    \n    /**\n     * Constructor with default behavior as per\n     * {@link CursorAdapter#CursorAdapter(Context, Cursor, boolean)}; it is recommended\n     * you not use this, but instead {@link #ResourceCursorAdapter(Context, int, Cursor, int)}.\n     * When using this constructor, {@link #FLAG_REGISTER_CONTENT_OBSERVER}\n     * will always be set.\n     *\n     * @param context The context where the ListView associated with this adapter is running\n     * @param layout resource identifier of a layout file that defines the views\n     *            for this list item.  Unless you override them later, this will\n     *            define both the item views and the drop down views.\n     * @param c The cursor from which to get the data.\n     * @param autoRequery If true the adapter will call requery() on the\n     *                    cursor whenever it changes so the most recent\n     *                    data is always displayed.  Using true here is discouraged.\n     */\n    public ResourceDragSortCursorAdapter(Context context, int layout, Cursor c, boolean autoRequery) {\n        super(context, c, autoRequery);\n        mLayout = mDropDownLayout = layout;\n        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n    }\n\n    /**\n     * Standard constructor.\n     *\n     * @param context The context where the ListView associated with this adapter is running\n     * @param layout Resource identifier of a layout file that defines the views\n     *            for this list item.  Unless you override them later, this will\n     *            define both the item views and the drop down views.\n     * @param c The cursor from which to get the data.\n     * @param flags Flags used to determine the behavior of the adapter,\n     * as per {@link CursorAdapter#CursorAdapter(Context, Cursor, int)}.\n     */\n    public ResourceDragSortCursorAdapter(Context context, int layout, Cursor c, int flags) {\n        super(context, c, flags);\n        mLayout = mDropDownLayout = layout;\n        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n    }\n\n    /**\n     * Inflates view(s) from the specified XML file.\n     * \n     * @see android.widget.CursorAdapter#newView(android.content.Context,\n     *      android.database.Cursor, ViewGroup)\n     */\n    @Override\n    public View newView(Context context, Cursor cursor, ViewGroup parent) {\n        return mInflater.inflate(mLayout, parent, false);\n    }\n\n    @Override\n    public View newDropDownView(Context context, Cursor cursor, ViewGroup parent) {\n        return mInflater.inflate(mDropDownLayout, parent, false);\n    }\n\n    /**\n     * <p>Sets the layout resource of the item views.</p>\n     *\n     * @param layout the layout resources used to create item views\n     */\n    public void setViewResource(int layout) {\n        mLayout = layout;\n    }\n    \n    /**\n     * <p>Sets the layout resource of the drop down views.</p>\n     *\n     * @param dropDownLayout the layout resources used to create drop down views\n     */\n    public void setDropDownViewResource(int dropDownLayout) {\n        mDropDownLayout = dropDownLayout;\n    }\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/mobeta/android/dslv/SimpleDragSortCursorAdapter.java",
    "content": "/*\n * Copyright (C) 2006 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.mobeta.android.dslv;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.view.View;\nimport android.widget.TextView;\nimport android.widget.ImageView;\n\n// taken from sdk/sources/android-16/android/widget/SimpleCursorAdapter.java\n\n/**\n * An easy adapter to map columns from a cursor to TextViews or ImageViews\n * defined in an XML file. You can specify which columns you want, which\n * views you want to display the columns, and the XML file that defines\n * the appearance of these views.\n *\n * Binding occurs in two phases. First, if a\n * {@link android.widget.SimpleCursorAdapter.ViewBinder} is available,\n * {@link ViewBinder#setViewValue(android.view.View, android.database.Cursor, int)}\n * is invoked. If the returned value is true, binding has occured. If the\n * returned value is false and the view to bind is a TextView,\n * {@link #setViewText(TextView, String)} is invoked. If the returned value\n * is false and the view to bind is an ImageView,\n * {@link #setViewImage(ImageView, String)} is invoked. If no appropriate\n * binding can be found, an {@link IllegalStateException} is thrown.\n *\n * If this adapter is used with filtering, for instance in an\n * {@link android.widget.AutoCompleteTextView}, you can use the\n * {@link android.widget.SimpleCursorAdapter.CursorToStringConverter} and the\n * {@link android.widget.FilterQueryProvider} interfaces\n * to get control over the filtering process. You can refer to\n * {@link #convertToString(android.database.Cursor)} and\n * {@link #runQueryOnBackgroundThread(CharSequence)} for more information.\n */\npublic class SimpleDragSortCursorAdapter extends ResourceDragSortCursorAdapter {\n    /**\n     * A list of columns containing the data to bind to the UI.\n     * This field should be made private, so it is hidden from the SDK.\n     * {@hide}\n     */\n    protected int[] mFrom;\n    /**\n     * A list of View ids representing the views to which the data must be bound.\n     * This field should be made private, so it is hidden from the SDK.\n     * {@hide}\n     */\n    protected int[] mTo;\n\n    private int mStringConversionColumn = -1;\n    private CursorToStringConverter mCursorToStringConverter;\n    private ViewBinder mViewBinder;\n\n    String[] mOriginalFrom;\n\n    /**\n     * Constructor the enables auto-requery.\n     *\n     * @deprecated This option is discouraged, as it results in Cursor queries\n     * being performed on the application's UI thread and thus can cause poor\n     * responsiveness or even Application Not Responding errors.  As an alternative,\n     * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.\n     */\n    @Deprecated\n    public SimpleDragSortCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {\n        super(context, layout, c);\n        mTo = to;\n        mOriginalFrom = from;\n        findColumns(c, from);\n    }\n\n    /**\n     * Standard constructor.\n     * \n     * @param context The context where the ListView associated with this\n     *            SimpleListItemFactory is running\n     * @param layout resource identifier of a layout file that defines the views\n     *            for this list item. The layout file should include at least\n     *            those named views defined in \"to\"\n     * @param c The database cursor.  Can be null if the cursor is not available yet.\n     * @param from A list of column names representing the data to bind to the UI.  Can be null \n     *            if the cursor is not available yet.\n     * @param to The views that should display column in the \"from\" parameter.\n     *            These should all be TextViews. The first N views in this list\n     *            are given the values of the first N columns in the from\n     *            parameter.  Can be null if the cursor is not available yet.\n     * @param flags Flags used to determine the behavior of the adapter,\n     * as per {@link CursorAdapter#CursorAdapter(Context, Cursor, int)}.\n     */\n    public SimpleDragSortCursorAdapter(Context context, int layout,\n            Cursor c, String[] from, int[] to, int flags) {\n        super(context, layout, c, flags);\n        mTo = to;\n        mOriginalFrom = from;\n        findColumns(c, from);\n    }\n\n    /**\n     * Binds all of the field names passed into the \"to\" parameter of the\n     * constructor with their corresponding cursor columns as specified in the\n     * \"from\" parameter.\n     *\n     * Binding occurs in two phases. First, if a\n     * {@link android.widget.SimpleCursorAdapter.ViewBinder} is available,\n     * {@link ViewBinder#setViewValue(android.view.View, android.database.Cursor, int)}\n     * is invoked. If the returned value is true, binding has occured. If the\n     * returned value is false and the view to bind is a TextView,\n     * {@link #setViewText(TextView, String)} is invoked. If the returned value is\n     * false and the view to bind is an ImageView,\n     * {@link #setViewImage(ImageView, String)} is invoked. If no appropriate\n     * binding can be found, an {@link IllegalStateException} is thrown.\n     *\n     * @throws IllegalStateException if binding cannot occur\n     * \n     * @see android.widget.CursorAdapter#bindView(android.view.View,\n     *      android.content.Context, android.database.Cursor)\n     * @see #getViewBinder()\n     * @see #setViewBinder(android.widget.SimpleCursorAdapter.ViewBinder)\n     * @see #setViewImage(ImageView, String)\n     * @see #setViewText(TextView, String)\n     */\n    @Override\n    public void bindView(View view, Context context, Cursor cursor) {\n        final ViewBinder binder = mViewBinder;\n        final int count = mTo.length;\n        final int[] from = mFrom;\n        final int[] to = mTo;\n\n        for (int i = 0; i < count; i++) {\n            final View v = view.findViewById(to[i]);\n            if (v != null) {\n                boolean bound = false;\n                if (binder != null) {\n                    bound = binder.setViewValue(v, cursor, from[i]);\n                }\n\n                if (!bound) {\n                    String text = cursor.getString(from[i]);\n                    if (text == null) {\n                        text = \"\";\n                    }\n\n                    if (v instanceof TextView) {\n                        setViewText((TextView) v, text);\n                    } else if (v instanceof ImageView) {\n                        setViewImage((ImageView) v, text);\n                    } else {\n                        throw new IllegalStateException(v.getClass().getName() + \" is not a \" +\n                                \" view that can be bounds by this SimpleCursorAdapter\");\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Returns the {@link ViewBinder} used to bind data to views.\n     *\n     * @return a ViewBinder or null if the binder does not exist\n     *\n     * @see #bindView(android.view.View, android.content.Context, android.database.Cursor)\n     * @see #setViewBinder(android.widget.SimpleCursorAdapter.ViewBinder)\n     */\n    public ViewBinder getViewBinder() {\n        return mViewBinder;\n    }\n\n    /**\n     * Sets the binder used to bind data to views.\n     *\n     * @param viewBinder the binder used to bind data to views, can be null to\n     *        remove the existing binder\n     *\n     * @see #bindView(android.view.View, android.content.Context, android.database.Cursor)\n     * @see #getViewBinder()\n     */\n    public void setViewBinder(ViewBinder viewBinder) {\n        mViewBinder = viewBinder;\n    }\n\n    /**\n     * Called by bindView() to set the image for an ImageView but only if\n     * there is no existing ViewBinder or if the existing ViewBinder cannot\n     * handle binding to an ImageView.\n     *\n     * By default, the value will be treated as an image resource. If the\n     * value cannot be used as an image resource, the value is used as an\n     * image Uri.\n     *\n     * Intended to be overridden by Adapters that need to filter strings\n     * retrieved from the database.\n     *\n     * @param v ImageView to receive an image\n     * @param value the value retrieved from the cursor\n     */\n    public void setViewImage(ImageView v, String value) {\n        try {\n            v.setImageResource(Integer.parseInt(value));\n        } catch (NumberFormatException nfe) {\n            v.setImageURI(Uri.parse(value));\n        }\n    }\n\n    /**\n     * Called by bindView() to set the text for a TextView but only if\n     * there is no existing ViewBinder or if the existing ViewBinder cannot\n     * handle binding to a TextView.\n     *\n     * Intended to be overridden by Adapters that need to filter strings\n     * retrieved from the database.\n     * \n     * @param v TextView to receive text\n     * @param text the text to be set for the TextView\n     */    \n    public void setViewText(TextView v, String text) {\n        v.setText(text);\n    }\n\n    /**\n     * Return the index of the column used to get a String representation\n     * of the Cursor.\n     *\n     * @return a valid index in the current Cursor or -1\n     *\n     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)\n     * @see #setStringConversionColumn(int) \n     * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)\n     * @see #getCursorToStringConverter()\n     */\n    public int getStringConversionColumn() {\n        return mStringConversionColumn;\n    }\n\n    /**\n     * Defines the index of the column in the Cursor used to get a String\n     * representation of that Cursor. The column is used to convert the\n     * Cursor to a String only when the current CursorToStringConverter\n     * is null.\n     *\n     * @param stringConversionColumn a valid index in the current Cursor or -1 to use the default\n     *        conversion mechanism\n     *\n     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)\n     * @see #getStringConversionColumn()\n     * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)\n     * @see #getCursorToStringConverter()\n     */\n    public void setStringConversionColumn(int stringConversionColumn) {\n        mStringConversionColumn = stringConversionColumn;\n    }\n\n    /**\n     * Returns the converter used to convert the filtering Cursor\n     * into a String.\n     *\n     * @return null if the converter does not exist or an instance of\n     *         {@link android.widget.SimpleCursorAdapter.CursorToStringConverter}\n     *\n     * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)\n     * @see #getStringConversionColumn()\n     * @see #setStringConversionColumn(int)\n     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)\n     */\n    public CursorToStringConverter getCursorToStringConverter() {\n        return mCursorToStringConverter;\n    }\n\n    /**\n     * Sets the converter  used to convert the filtering Cursor\n     * into a String.\n     *\n     * @param cursorToStringConverter the Cursor to String converter, or\n     *        null to remove the converter\n     *\n     * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter) \n     * @see #getStringConversionColumn()\n     * @see #setStringConversionColumn(int)\n     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)\n     */\n    public void setCursorToStringConverter(CursorToStringConverter cursorToStringConverter) {\n        mCursorToStringConverter = cursorToStringConverter;\n    }\n\n    /**\n     * Returns a CharSequence representation of the specified Cursor as defined\n     * by the current CursorToStringConverter. If no CursorToStringConverter\n     * has been set, the String conversion column is used instead. If the\n     * conversion column is -1, the returned String is empty if the cursor\n     * is null or Cursor.toString().\n     *\n     * @param cursor the Cursor to convert to a CharSequence\n     *\n     * @return a non-null CharSequence representing the cursor\n     */\n    @Override\n    public CharSequence convertToString(Cursor cursor) {\n        if (mCursorToStringConverter != null) {\n            return mCursorToStringConverter.convertToString(cursor);\n        } else if (mStringConversionColumn > -1) {\n            return cursor.getString(mStringConversionColumn);\n        }\n\n        return super.convertToString(cursor);\n    }\n\n    /**\n     * Create a map from an array of strings to an array of column-id integers in cursor c.\n     * If c is null, the array will be discarded.\n     *\n     * @param c the cursor to find the columns from\n     * @param from the Strings naming the columns of interest\n     */\n    private void findColumns(Cursor c, String[] from) {\n        if (c != null) {\n            int i;\n            int count = from.length;\n            if (mFrom == null || mFrom.length != count) {\n                mFrom = new int[count];\n            }\n            for (i = 0; i < count; i++) {\n                mFrom[i] = c.getColumnIndexOrThrow(from[i]);\n            }\n        } else {\n            mFrom = null;\n        }\n    }\n\n    @Override\n    public Cursor swapCursor(Cursor c) {\n        // super.swapCursor() will notify observers before we have\n        // a valid mapping, make sure we have a mapping before this\n        // happens\n        findColumns(c, mOriginalFrom);\n        return super.swapCursor(c);\n    }\n    \n    /**\n     * Change the cursor and change the column-to-view mappings at the same time.\n     *  \n     * @param c The database cursor.  Can be null if the cursor is not available yet.\n     * @param from A list of column names representing the data to bind to the UI.  Can be null \n     *            if the cursor is not available yet.\n     * @param to The views that should display column in the \"from\" parameter.\n     *            These should all be TextViews. The first N views in this list\n     *            are given the values of the first N columns in the from\n     *            parameter.  Can be null if the cursor is not available yet.\n     */\n    public void changeCursorAndColumns(Cursor c, String[] from, int[] to) {\n        mOriginalFrom = from;\n        mTo = to;\n        // super.changeCursor() will notify observers before we have\n        // a valid mapping, make sure we have a mapping before this\n        // happens\n        findColumns(c, mOriginalFrom);\n        super.changeCursor(c);\n    }\n\n    /**\n     * This class can be used by external clients of SimpleCursorAdapter\n     * to bind values fom the Cursor to views.\n     *\n     * You should use this class to bind values from the Cursor to views\n     * that are not directly supported by SimpleCursorAdapter or to\n     * change the way binding occurs for views supported by\n     * SimpleCursorAdapter.\n     *\n     * @see SimpleCursorAdapter#bindView(android.view.View, android.content.Context, android.database.Cursor)\n     * @see SimpleCursorAdapter#setViewImage(ImageView, String) \n     * @see SimpleCursorAdapter#setViewText(TextView, String)\n     */\n    public static interface ViewBinder {\n        /**\n         * Binds the Cursor column defined by the specified index to the specified view.\n         *\n         * When binding is handled by this ViewBinder, this method must return true.\n         * If this method returns false, SimpleCursorAdapter will attempts to handle\n         * the binding on its own.\n         *\n         * @param view the view to bind the data to\n         * @param cursor the cursor to get the data from\n         * @param columnIndex the column at which the data can be found in the cursor\n         *\n         * @return true if the data was bound to the view, false otherwise\n         */\n        boolean setViewValue(View view, Cursor cursor, int columnIndex);\n    }\n\n    /**\n     * This class can be used by external clients of SimpleCursorAdapter\n     * to define how the Cursor should be converted to a String.\n     *\n     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)\n     */\n    public static interface CursorToStringConverter {\n        /**\n         * Returns a CharSequence representing the specified Cursor.\n         *\n         * @param cursor the cursor for which a CharSequence representation\n         *        is requested\n         *\n         * @return a non-null CharSequence representing the cursor\n         */\n        CharSequence convertToString(Cursor cursor);\n    }\n\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-Android/src/com/mobeta/android/dslv/SimpleFloatViewManager.java",
    "content": "package com.mobeta.android.dslv;\n\nimport android.graphics.Bitmap;\nimport android.graphics.Point;\nimport android.graphics.Color;\nimport android.widget.ListView;\nimport android.widget.ImageView;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.util.Log;\n\n/**\n * Simple implementation of the FloatViewManager class. Uses list\n * items as they appear in the ListView to create the floating View.\n */\npublic class SimpleFloatViewManager implements DragSortListView.FloatViewManager {\n\n    private Bitmap mFloatBitmap;\n\n    private ImageView mImageView;\n\n    private int mFloatBGColor = Color.BLACK;\n\n    private ListView mListView;\n\n    public SimpleFloatViewManager(ListView lv) {\n        mListView = lv;\n    }\n\n    public void setBackgroundColor(int color) {\n        mFloatBGColor = color;\n    }\n\n    /**\n     * This simple implementation creates a Bitmap copy of the\n     * list item currently shown at ListView <code>position</code>.\n     */\n    @Override\n    public View onCreateFloatView(int position) {\n        // Guaranteed that this will not be null? I think so. Nope, got\n        // a NullPointerException once...\n        View v = mListView.getChildAt(position + mListView.getHeaderViewsCount() - mListView.getFirstVisiblePosition());\n\n        if (v == null) {\n            return null;\n        }\n\n        v.setPressed(false);\n\n        // Create a copy of the drawing cache so that it does not get\n        // recycled by the framework when the list tries to clean up memory\n        //v.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);\n        v.setDrawingCacheEnabled(true);\n        mFloatBitmap = Bitmap.createBitmap(v.getDrawingCache());\n        v.setDrawingCacheEnabled(false);\n\n        if (mImageView == null) {\n            mImageView = new ImageView(mListView.getContext());\n        }\n        mImageView.setBackgroundColor(mFloatBGColor);\n        mImageView.setPadding(0, 0, 0, 0);\n        mImageView.setImageBitmap(mFloatBitmap);\n        mImageView.setLayoutParams(new ViewGroup.LayoutParams(v.getWidth(), v.getHeight()));\n\n        return mImageView;\n    }\n\n    /**\n     * This does nothing\n     */\n    @Override\n    public void onDragFloatView(View floatView, Point position, Point touch) {\n        // do nothing\n    }\n\n    /**\n     * Removes the Bitmap from the ImageView created in\n     * onCreateFloatView() and tells the system to recycle it.\n     */\n    @Override\n    public void onDestroyFloatView(View floatView) {\n        ((ImageView) floatView).setImageDrawable(null);\n\n        mFloatBitmap.recycle();\n        mFloatBitmap = null;\n    }\n\n}\n\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Podfile",
    "content": "pod \"PebbleKit\""
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/NSDictionary+Pebble.h",
    "content": "//\n//  NSDictionary+Pebble.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSDictionary (Pebble)\n\n/**\n *  Serializes the receiver into a Pebble dict.\n *  @note The receiver dictionary must comply to the following constraints:\n *  * The keys must be instances of NSNumber. Their -unsignedLongValue return value will be used as final key.\n *  * The values must be instances of either NSString, NSData or NSNumber. Use the NSNumber (stdint) category\n *  to specify the signedness and width of NSNumbers.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryUnsupportedKeyClass,\n *  PBErrorCodeDictionaryUnsupportedValueClass or PBErrorCodeDictionaryUnsupportedValueClass.\n *  @see -dictionaryFromPebbleDictionaryDataWithError:\n */\n- (NSData*)pebbleDictionaryData:(NSError * __autoreleasing *)error;\n\n@end\n\n@interface NSData (Pebble)\n\n/**\n *  Interprets the receiver as Pebble dict data and deserializes it into an NSDictionary.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryInternalConsistency.\n *  @see -pebbleDictionaryData:\n */\n- (NSDictionary*)dictionaryFromPebbleDictionaryDataWithError:(NSError * __autoreleasing *)error;\n\n@end"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/NSNumber+stdint.h",
    "content": "//\n//  NSNumber+stdint.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/**\n *  This category exposes the capabilities the underlying CFNumber to explicitely\n *  store the signedness and the width of the storage.\n */\n\n@interface NSNumber (stdint)\n\n/**\n *  Interprets the receiver as a 32-bits wide, unsigned integer.\n */\n- (uint32_t)uint32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, unsigned integer.\n */\n- (uint16_t)uint16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, unsigned integer.\n */\n- (uint8_t)uint8Value;\n\n/**\n *  Interprets the receiver as a 32-bits wide, signed integer.\n */\n- (int32_t)int32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, signed integer.\n */\n- (int16_t)int16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, signed integer.\n */\n- (int8_t)int8Value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint32:(uint32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint16:(uint16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint8:(uint8_t)value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt32:(int32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt16:(int16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt8:(int8_t)value;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a floating pointer number or not.\n */\n- (BOOL)isFloat;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a signed integer or not.\n */\n- (BOOL)isSigned;\n\n/**\n *  Gets the width in bytes of the integer that is stored by the receiver.\n */\n- (uint8_t)width;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBBitmap.h",
    "content": "//\n//  PBBitmap.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIImage.h>\n#import <PebbleKit/gtypes.h>\n\n/**\n *  Helper class to convert a UIImage to Pebble bitmap pixel data and GBitmap metadata.\n *  Refer to the documentation of Pebble's native watch app SDK on the GBitmap format.\n */\n\n@interface PBBitmap : NSObject\n\n/**\n *  The pixel data of the bitmap.\n *  This corresponds to the data as pointed to by GBitmap's `addr` field.\n */\n@property (nonatomic, readonly, strong) NSData *pixelData;\n\n/**\n *  The number of bytes per row.\n *  Always a multiple of 4 bytes.\n */\n@property (nonatomic, readonly, assign) uint16_t rowSizeBytes;\n\n/**\n *  Bitfield of metadata flags.\n *  This corresponds to GBitmap's `info_flags` field.\n */\n@property (nonatomic, readonly, assign) uint16_t infoFlags;\n\n/**\n *  The box of bits inside `pixelData`, that contains\n *  the actual image data to use.\n *  This corresponds to GBitmap's `bounds` field.\n */\n@property (nonatomic, readonly, assign) GRect bounds;\n\n/**\n *  Factory method to create a PBBitmap from a UIImage instance.\n *  @param image The UIImage from which to create the PBBitmap\n */\n+ (PBBitmap*)pebbleBitmapWithUIImage:(UIImage*)image;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBDataLoggingService.h",
    "content": "//\n//  PBDataLoggingService.h\n//  PebbleKit\n//\n//  Created by Martijn The on 7/19/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  Data logging datatypes.\n */\nenum {\n  //! Array of bytes\n  PBDataLoggingTypeByteArray = 0,\n  //! unsigned integer\n  PBDataLoggingTypeUInt = 2,\n  //! signed integer\n  PBDataLoggingTypeInt = 3,\n};\ntypedef UInt8 PBDataLoggingType;\n\n/**\n *  The metadata of a data logging session. Used to identify a session.\n */\n@interface PBDataLoggingSessionMetadata : NSObject <NSSecureCoding, NSCopying>\n\n/**\n *  A tag associated with the session.\n */\n@property (nonatomic, readonly) UInt32 tag;\n\n/**\n *  The timestamp of the moment the session was created by the watchapp.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The type of data stored in this session.\n */\n@property (nonatomic, readonly) PBDataLoggingType type;\n\n/**\n *  The size of a data item.\n */\n@property (nonatomic, readonly) UInt16 itemSize;\n\n/**\n *  The serial number of the watch that created the sessions.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  Creates a new data logging session metadata object, given all its property values.\n *  This method is provided to create a metadata object that can be used to\n *  compare it with a metadata object that is passed into one of the\n *  PBDataLoggingServiceDelegate methods.\n *  @param tag The tag associated with the session\n *  @param timestamp The timestamp of the creation of the session\n *  @param type The type of data stored in the session\n *  @param itemSize The size of a data item\n *  @param serialNumber The serial number of the watch that created the session\n *  @return A session metadata object with the specified information\n */\n+ (id)metadataWithTag:(UInt32)tag\n            timestamp:(UInt32)timestamp\n                 type:(PBDataLoggingType)type\n             itemSize:(UInt16)itemSize\n         serialNumber:(NSString *)serialNumber;\n\n/**\n *  Tests the equality of two data logging session metadata objects.\n *  This method can be used to compare two session metadata objects\n *  to check whether they are referring to the same session or not.\n *  @param sessionMetadata\n *  @return YES if all the property values of receiver are equal to the property\n *  values of the given session.\n *  @note Equivalent to -[PBDataLoggingSessionMetadata isEqual:]\n */\n- (BOOL)isEqualToDataLoggingSessionMetadata:(PBDataLoggingSessionMetadata *)sessionMetadata;\n@end\n\n/**\n *  Data logging delegate protocol. The object that implements this protocol\n *  is responsible for handling incoming data.\n */\n@protocol PBDataLoggingServiceDelegate <NSObject>\n@optional\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param bytes Pointer to the array of bytes.\n *  The array contains (numberOfItems * session.itemSize) bytes.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasByteArrays:(const UInt8 * const)bytes numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt8s:(const UInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt16s:(const UInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt32s:(const UInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt8s:(const SInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt16s:(const SInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt32s:(const SInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time a session is finished.\n *  This is guaranteed to be called only after all data has been received and\n *  consumed by the application.\n *  @param service The data logging service.\n *  @param session The metadata of the session.\n */\n- (void)dataLoggingService:(PBDataLoggingService *)service sessionDidFinish:(PBDataLoggingSessionMetadata *)session;\n\n@end\n\n/**\n *  The data logging service. Assign a delegate object in order to receive\n *  data from your watchapp.\n */\n@interface PBDataLoggingService : NSObject\n\n/**\n *  The delegate that has the responsility of handling callbacks from the\n *  data logging service.\n */\n@property (atomic, readwrite, weak) id<PBDataLoggingServiceDelegate> delegate;\n\n/**\n *  Sets the queue on which delegate methods will be executed.\n *  Callbacks are intended to be processed in the order as they come in, so it\n *  you must use a serial queue. If set to nil (default) the main queue is used.\n *  @param delegateQueue The queue on which the delegate methods will be executed.\n */\n- (void)setDelegateQueue:(dispatch_queue_t)delegateQueue;\n\n/**\n * Query the watch for data logging data.\n */\n- (void)pollForData;\n  \n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBErrors.h",
    "content": "//\n//  PBErrors.h\n//  PebbleSDK\n//\n//  Created by Martijn The on 7/26/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nextern NSString *PBErrorDomain;\n\n/**\n *  PebbleKit Error codes.\n *  Inspect the localizedDescription of any NSError objects for a description.\n */\n\ntypedef enum {\n  PBErrorCodeNoSupportedProtocolsInInfoPlist,\n  PBErrorCodeErrorCreatingSession,\n  PBErrorCodeOutputStreamError,\n  PBErrorCodeInputStreamError,\n  PBErrorCodeSendMessageTimeout,\n  PBErrorCodeEndpointDisallowed,\n  PBErrorCodeVersionInfoTimeout,\n  PBErrorCodeCannotCreateSessionWhileClosing,\n  PBErrorCodeNoAppUUID,\n  PBErrorCodeAppMessageRejected,\n  PBErrorCodeAppMessageAckTimeout,\n  PBErrorCodeDictionaryUnsupportedKeyClass,\n  PBErrorCodeDictionaryUnsupportedValueClass,\n  PBErrorCodeDictionaryInternalConsistency,\n  PBErrorCodeInvalidArguments,\n  PBErrorCodePebbleAppUnreachable,\n  PBErrorCodePebbleAppRequestTimeout,\n  PBErrorCodePebbleAppEmptyResponse,\n  PBErrorCodePebbleAppUnexpectedResponse,\n  PBErrorCodeServerNotAvailable,\n  PBErrorCodeDownloadFailed,\n  PBErrorCodePebbleNotConnected\n} PBErrorCode;\n\n@interface NSError (Pebble)\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode and with an underlying NSError object.\n *  @param code The error code for which to create the error\n *  @param error The underlying error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code underLyingError:(NSError*)error;\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode.\n *  @param code The error code for which to create the error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code;\n\n@end"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBLog.h",
    "content": "//\n//  PBLog.h\n//  PebbleApp\n//\n//  Created by Martijn The on 11/29/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import \"DDLog.h\"\n\n#ifndef PBWSLOG_CONTEXT\n#define PBWSLOG_CONTEXT 1\n#endif\n\nextern int PBLogLevel;\n\n#define LogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define WSLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n\n#define LogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBPebbleCentral.h",
    "content": "//\n//  PBPebbleCentral.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class PBWatch;\n@class PBDataLoggingService;\n@protocol PBPebbleCentralDelegate;\n\n/**\n PebbleCentral plays the central role for client iOS apps (e.g. RunKeeper).\n */\n@interface PBPebbleCentral : NSObject\n\n/**\n @returns The default central singleton instance.\n */\n+ (PBPebbleCentral*)defaultCentral;\n\n/**\n *  Enables debug logs. The logs will be routed to the system log (ASL) and\n *  console. It is advised to call this before making any other calls to PebbleKit.\n */\n+ (void)setDebugLogsEnabled:(BOOL)logsEnabled;\n\n/**\n The watches that are currently connected. Do not cache the array because it can change over time.\n */\n@property (nonatomic, readonly, strong) NSArray *connectedWatches;\n\n/**\n The watches that are stored in the user preferences of the application.\n */\n@property (nonatomic, readonly, strong) NSArray *registeredWatches;\n\n/**\n The central's delegate.\n */\n@property (nonatomic, readwrite, weak) id<PBPebbleCentralDelegate> delegate;\n\n/**\n *  The UUID is used as the identifier of the watch application and is used\n *  to make sure that appMessage and dataLogging communications arrives at its companion app\n *  on the other device (and not in another app).\n *  For most app message methods there is are two variants: one that does not take a UUID parameter and one that does take\n *  a UUID parameter (for example, -appMessagesAddReceiveUpdateHandler: vs appMessagesAddReceiveUpdateHandler:withUUID:).\n *  The methods that do not take a UUID, will use the UUID as set prior to this property.\n *  @param uuid The 16 byte UUID of your app.\n *  @note The UUID needs to be set before using either app message or data logging.\n */\n@property (nonatomic, strong, readwrite) NSData *appUUID;\n\n/**\n *  Verifies the currently set application UUID.\n *  @return YES if the currently set UUID is valid, NO if it is not.\n *  @see -setAppUuid:\n */\n- (BOOL)hasValidAppUUID;\n\n/**\n @returns YES if the Pebble iOS app is installed, NO if it is not installed.\n */\n- (BOOL)isMobileAppInstalled;\n\n/**\n Redirects to Pebble in the App Store, so the user can install the app.\n */\n- (void)installMobileApp;\n\n/**\n Wipes out the data associated with the registered watches, that is stored on the phone.\n */\n- (void)unregisterAllWatches;\n\n/**\n Returns the most recently connected watch from the -registeredWatches array.\n */\n- (PBWatch*)lastConnectedWatch;\n\n@property (nonatomic, readonly) PBDataLoggingService *dataLoggingService;\n\n@end\n\n\n@protocol PBPebbleCentralDelegate <NSObject>\n@optional\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was connected.\n @param isNew YES if the watch has been connected for the first time since the app has been installed or NO if not.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidConnect:(PBWatch*)watch isNew:(BOOL)isNew;\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was disconnected.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidDisconnect:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+AppMessages.h",
    "content": "//\n//  PBWatch+AppMessages.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\ntypedef NS_ENUM(UInt8, PBAppState) {\n  PBAppStateNotRunning = 0x00,\n  PBAppStateRunning = 0x01,\n};\n\n@interface PBWatch (AppMessages)\n\n/**\n *  Queries the watch whether AppMessages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isAppMessagesSupported YES if AppMessages are supported, NO if not.\n */\n- (void)appMessagesGetIsSupported:(void(^)(PBWatch *watch, BOOL isAppMessagesSupported))fetchedBlock;\n\n/**\n *  Pushes an update to the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Pushes an update to the watch application with the specified UUID.\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watchapp to which the update should be sent.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary withUUID:(NSData*)uuid onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with the specified UUID.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @param uuid The UUID of the watchapp for which sent messages should be handled by the onReceive block.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive withUUID:(NSData*)uuid;\n\n/**\n *  Add a handler for lifecycle events of watch applications.\n *  @param onLifecycleUpdate This block will be called when an application starts and\n *  stops running.\n *  @param watch The watch that has sent the event.\n *  @param uuid The uuid of the application that caused the event.\n *  @param newAppState The new state of the app (either PBAppStateNotRunning or PBAppStateRunning).\n */\n- (id)appMessagesAddAppLifecycleUpdateHandler:(void(^)(PBWatch *watch, NSUUID *uuid,\n                                                       PBAppState newAppState))onLifecycleUpdate;\n\n\n// INTERNAL USE ONLY\n- (id)appMessagesAddReceiveAllUpdatesHandler:(BOOL(^)(PBWatch *watch, NSUUID *uuid, NSDictionary *update))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -appMessagesAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -appMessagesAddReceiveUpdateHandler:\n *  @see -appMessagesAddReceiveUpdateHandler:\n */\n- (void)appMessagesRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Fetches the run state of the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]. You can use this method to determine whether the watch\n *  application is running or not.\n *  TODO: Ask Francois how this API works.\n *  @param onSent The block that will be called after the fetch state command has been\n *  sent to the watch.\n */\n- (void)appMessagesFetchAppState:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with the specified UUID.\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n/**\n *  Sends a command to kill the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to kill the watch application with the specified UUID.\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+Golf.h",
    "content": "//\n//  PBWatch+Golf.h\n//  PebbleKit\n//\n//  Created by Martijn The on 4/4/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n@interface PBWatch (Golf)\n\n/**\n *  The UUID of the Golf watch app.\n */\nextern NSData *PBGolfUUID;\n\n/**\n *  The key of the \"Front\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfFrontKey;\n\n/**\n *  The key of the \"Mid\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfMidKey;\n\n/**\n *  The key of the \"Back\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfBackKey;\n\n/**\n *  The key of the \"Hole\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfHoleKey;\n\n/**\n *  The key of the \"Par\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfParKey;\n\n/**\n *  The command IDs that can be sent back by the Golf watch app.\n *  @see -golfAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  GolfAppCommandPrevious = 0x01,\n  GolfAppCommandNext = 0x02,\n  GolfAppCommandSelect = 0x03,\n} GolfAppCommand;\n\n/**\n *  Queries the watch whether Golf Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isGolfSupported YES if Golf Messages are supported, NO if not.\n */\n- (void)golfGetIsSupported:(void(^)(PBWatch *watch, BOOL isGolfSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends an update to the golf app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey, PBGolfParKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n *  @see PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey and PBGolfParKey\n */\n- (void)golfAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Golf updates that are send by the Golf watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param command The command as sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -golfAppRemoveUpdateHandler:\n *  @see GolfAppCommand\n *  @see -golfAppRemoveUpdateHandler:\n */\n- (id)golfAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, GolfAppCommand command))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -golfAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -golfAppAddReceiveUpdateHandler:\n *  @see -golfAppAddReceiveUpdateHandler:\n */\n- (void)golfAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the golf app on the watch.\n *  @discussion It is recommended to perform this as the first call after -golfGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+Ping.h",
    "content": "//\n//  PBWatch+Ping.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/14/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n@interface PBWatch (Ping)\n\n/**\n * Sends a ping to the watch.\n * @param cookie A number identifying the ping.\n * @param onPong The block handler that will be called when the \"pong\" reply from the watch has been received.\n * @param watch The watch that sent the \"pong\" reply, which is \"self\". It is passed in to avoid retain loops.\n * @param cookie The cookie that was initially passed when calling this method.\n * @param onTimeout The block handler that will be called when the watch failed to reply in time.\n */\n- (void)pingWithCookie:(UInt32)cookie onPong:(void(^)(PBWatch *watch, UInt32 cookie))onPong onTimeout:(void(^)(PBWatch *watch, UInt32 cookie))onTimeout;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+PollServices.h",
    "content": "//\n//  PBWatch+PollServices.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n * PollServiceType\n */ \n\n\nenum {\n  PBPollRemoteServiceMail = 0,\n  PBPollRemoteServiceDataLogging = 1,\n  PBNumPollRemoteServices\n};\ntypedef UInt8 PBPollRemoteServiceType;\n\n@interface PBWatch (PollServices)\n// Call this upon connect with the watch to add handlers:\n- (id)addPollServicesHandler:(void(^)(PBWatch *))handler forService:(PBPollRemoteServiceType)service interval:(UInt8)interval;\n- (void)sendPollRequestForService:(PBPollRemoteServiceType)service;\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+Sports.h",
    "content": "//\n//  PBWatch+Sports.h\n//  PebbleKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n/**\n *  The UUID of the Sports watch app.\n */\nextern NSData *PBSportsUUID;\n\n/**\n *  The key of the \"Time\" field.\n *  The accompanying value must be an NSString (max. ~8 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsTimeKey;\n\n/**\n *  The key of the \"Distance\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDistanceKey;\n\n/**\n *  The key of the general purpose \"Data\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDataKey;\n\n/**\n *  The key of the \"Activity State\".\n *  The value must be an NSNumber created using +[NSNumber numberWithUint8:].\n *  @see SportsAppActivityState for valid values to use\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsActivityStateKey;\n\n/**\n *  Instances of this convenience class represent an update of the current time, distance and pace,\n *  and has a method to convert the values into a dictionary that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n@interface PBSportsUpdate : NSObject\n\n/**\n *  The current time in seconds. The possible range is currently limited from -7140. to 7140., inclusive. (±1h 59min 59sec).\n */\n@property (nonatomic, readwrite, assign) NSTimeInterval time;\n\n/**\n *  The current distance in km or mi. The possible range is currently limited from -99.9 to 99.9, inclusive.\n *  The unit of distance is dependent on the current unit setting.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float distance;\n\n/**\n *  General purpose data variable. The possible range is currently limited from -99.99 to 99.99, inclusive.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float data;\n\n/**\n *  Convenience method to create an update object.\n */\n+ (PBSportsUpdate*)updateWithTime:(NSTimeInterval)time distance:(float)distance data:(float)data;\n\n/**\n *  Creates an update dictionary from the receiver, that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n- (NSDictionary*)dictionary;\n\n/**\n *  Creates a formatted time string with from a total seconds value, formatted as \"h:mm:ss\".\n *  For example, supplying the value 3930.0f seconds will return @\"1:05:30\"\n *  @param seconds The number of seconds from which to create the time string.\n *  @return Formatted time as \"h:mm:ss\"\n */\n+ (NSString*)timeStringFromFloat:(float)seconds;\n\n@end\n\n@interface PBWatch (Sports)\n\n/**\n *  The state of the Sports activity.\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  SportsAppActivityStateInit = 0x00,\n  SportsAppActivityStateRunning = 0x01,\n  SportsAppActivityStatePaused = 0x02,\n  SportsAppActivityStateEnd = 0x03,\n} SportsAppActivityState;\n\n/**\n *  Queries the watch whether Sports Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isSportsSupported YES if Sports Messages are supported, NO if not.\n */\n- (void)sportsGetIsSupported:(void(^)(PBWatch *watch, BOOL isSportsSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the preferred\n *  unit system, either metric or imperial.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetMetric:(BOOL)isMetric onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents,\n *  to set the preferred  data label (either PACE or SPEED) and corresponding units.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetLabel:(BOOL)isPace onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the state of the\n *  sports activity. Currently only SportsAppActivityStateRunning and SportsAppActivityStatePaused are\n *  supported.\n *  @param state The new sports activity state\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetActivityState:(SportsAppActivityState)state onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends the update to the sports app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBSportsTimeKey, PBSportsPaceKey, PBSportsDistanceKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Sports updates that are send by the Sports watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param state The new sports activity state as set by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -sportsAppRemoveUpdateHandler:\n *  @see SportsAppActivityState\n *  @see -sportsAppRemoveUpdateHandler:\n */\n- (id)sportsAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, SportsAppActivityState state))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -sportsAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -sportsAppAddReceiveUpdateHandler:\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\n- (void)sportsAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the sports app on the watch.\n *  @discussion It is recommended to perform this as the first call after -sportsGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch+Version.h",
    "content": "//\n//  PBWatch+Version.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/17/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  PBFirmwareVersion is a helper class that is able to parse the versionTag string\n *  into its components (os, major, minor, suffix) and facilitate comparisons\n *  between versions.\n *  Valid versions follow the following format:\n *  `vOS(.MAJOR(.MINOR(-SUFFIX)))`\n *  Where the fields OS, MAJOR, MINOR are positive, decimal integer numbers and SUFFIX\n *  an arbitrary string. MAJOR, MINOR and SUFFIX are optional (nested optionality).\n *  Examples of valid versions:\n *  `v1`\n *  `v2.1234.99-alpha-beta-gamma`\n */\n@interface PBFirmwareVersion : NSObject\n/**\n *  The OS version component.\n */\n@property (nonatomic, readonly) NSInteger os;\n\n/**\n *  The major version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger major;\n\n/**\n *  The minor version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger minor;\n\n/**\n *  The release suffix, which is the part following the dash '-'.\n *  @note If a version tag string does not contain a suffix, it will be set to an empty string.\n *  @discussion The release suffix is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *suffix;\n\n/**\n *  The version timestamp.\n *  @note The timestamp is in the final comparison equation, in the -compare: method, after evaluating\n *  os, major and minor components.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The version's git commit hash.\n *  @discussion The commit hash is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *commitHash;\n\n/**\n *  The version's git tag.\n */\n@property (nonatomic, readonly, copy) NSString *tag;\n\n/**\n *  Creates a PBFirmwareVersion object given a tag string and timestamp.\n */\n+ (PBFirmwareVersion*)firmwareVersionWithTag:(NSString*)tag commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Creates a PBFirmwareVersion object given its components.\n *  @discussion The tag string will be set to the canonical format vOS.MINOR.MAJOR(-SUFFIX).\n */\n+ (PBFirmwareVersion*)firmwareVersionWithOS:(NSInteger)os major:(NSInteger)major minor:(NSInteger)minor suffix:(NSString*)suffix commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Compares the receiver to another version object.\n *  @param aVersion The version to compare with the receiver.\n *  @return NSOrderedAscending if the value of aVersion is greater than the receiver’s,\n *  NSOrderedSame if they’re equal, and NSOrderedDescending if the value of aVersion is less than the receiver’s.\n */\n- (NSComparisonResult)compare:(PBFirmwareVersion *)aVersion;\n\n/**\n *  Convenience wrappers around -compare:\n */\n- (BOOL)isEqualOrNewer:(PBFirmwareVersion *)other;\n- (BOOL)isNewer:(PBFirmwareVersion *)other;\n- (BOOL)isEqualVersionOnly:(PBFirmwareVersion *)other;\n\n@end\n\n\n\n/**\n *  Values specifying the Pebble hardware platform variant.\n */\ntypedef enum {\n  FirmwareMetadataPlatformUnknown = 0,\n  FirmwareMetadataPlatformPebbleOneEV1 = 1,\n  FirmwareMetadataPlatformPebbleOneEV2 = 2,\n  FirmwareMetadataPlatformPebbleOneEV2_3 = 3,\n  FirmwareMetadataPlatformPebbleOneEV2_4 = 4,\n  FirmwareMetadataPlatformPebbleOnePointFive = 5,\n  FirmwareMetadataPlatformPebbleTwoPointZero = 6,\n  FirmwareMetadataPlatformPebbleOneBigboard = 0xff,\n  FirmwareMetadataPlatformPebbleOneBigboard2 = 0xfe,\n} FirmwareMetadataPlatform;\n\n/**\n *  Instances of PBFirmwareMetadata describe a firmware in terms of\n *  its version, whether it is a recovery firmware and its intended hardware\n *  platform.\n *  @see PBVersionInfo\n */\n\n@interface PBFirmwareMetadata : NSObject\n\n/**\n *  The version of the firmware.\n *  @see PBFirmwareVersion\n */\n@property (nonatomic, readonly) PBFirmwareVersion *version;\n\n/**\n *  YES if the firmware is a recovery firmware, NO if it is a regular firmware.\n */\n@property (nonatomic, readonly) BOOL isRecoveryFirmware;\n\n/**\n *  The hardware platform variant with which the firmware is compatible.\n */\n@property (nonatomic, readonly) FirmwareMetadataPlatform hardwarePlatform;\n\n/**\n *  Converts a <FirmwareMetadataPlatform> value to a string.\n *  @param hardwarePlatform The hardware platform value to convert\n *  @return A string of the hardware platform\n */\n+ (NSString*)hardwarePlatformToString:(FirmwareMetadataPlatform)hardwarePlatform;\n\n/**\n *  Converts an NSString hardware platform string to the corresponding\n *  FirmwareMetadataPlatform value.\n *  @param hardwarePlatformString The string representing the hardware platform.\n *  @return The hardware platform enum value\n */\n+ (FirmwareMetadataPlatform)stringToHardwarePlatform:(NSString *)hardwarePlatformString;\n\n@end\n\n/**\n *  Instances of PBResourceMetadata describe (system) resources.\n *  @see PBVersionInfo\n */\n\n@interface PBResourceMetadata : NSObject\n\n/**\n *  The version of the resources as the Epoch timestamp of the Git commit.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The checksum of the resources.\n */\n@property (nonatomic, readonly) UInt32 crc;\n\n/**\n *  The human-friendly string version of the resources.\n */\n@property (nonatomic, readonly, strong) NSString *friendlyVersion;\n\n/**\n *  YES if the metadata represents valid resources, NO if it does not.\n */\n- (BOOL)isValid;\n\n@end\n\n/**\n *  An instance of PBVersionInfo describes all the different system software (Pebble OS)\n *  on a Pebble watch and other auxiliary information.\n *  @see PBWatch\n */\n\n@interface PBVersionInfo : NSObject\n\n/**\n *  The metadata of the firmware that is running.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *runningFirmwareMetadata;\n\n/**\n *  The metadata of the recovery firmware that is in storage.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *recoveryFirmwareMetadata;\n\n/**\n *  The metadata of the system resources.\n */\n@property (nonatomic, readonly, strong) PBResourceMetadata *systemResources;\n\n/**\n *  The version of the bootloader.\n */\n@property (nonatomic, readonly) UInt32 bootloaderVersion;\n\n/**\n *  The version of the hardware.\n */\n@property (nonatomic, readonly, strong) NSString *hardwareVersion;\n\n/**\n *  The serial number.\n */\n@property (nonatomic, readonly, strong) NSString *serialNumber;\n\n/**\n *  The current Bluetooth device address.\n */\n@property (nonatomic, readonly, strong) NSData *deviceAddress;\n\n/**\n *  YES if valid recovery firmware is installed, NO if not.\n */\n- (BOOL)hasRecoveryFirmware;\n\n/**\n *  YES if valid system resources are installed, NO if not.\n */\n- (BOOL)hasSystemResources;\n\n@end\n\n@interface PBWatch (Version)\n\n/**\n *  Requests the version info from the receiver.\n *  @param handler The handler that will be called when the version info response has been received.\n *  @param onTimeout The handler that will be called if the watch did not respond within 5 seconds.\n *  @param watch The watch for which the version info was requested.\n *  @param versionInfo The version info response.\n *  @discussion The <PBVersionInfo> response will be cached. The latest version info can be\n *  accessed through the <versionInfo> property of <PBWatch>.\n */\n- (void)getVersionInfo:(void (^)(PBWatch *watch, PBVersionInfo *versionInfo))handler onTimeout:(void (^)(PBWatch *watch))onTimeout;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PBWatch.h",
    "content": "//\n//  PBWatch.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@protocol PBWatchDelegate;\n@class PBVersionInfo;\n@class PBDataLoggingService;\n\n/**\n *  Represents a Pebble watch.\n *\n *  On iOS, there is the notion of a \"communication session\" between an app and\n *  the Pebble watch. You can imagine this as a \"data pipe\" directly from the\n *  watch to your app. However, there is only one session for 3rd party apps.\n *  This one session has to be shared among all 3rd party apps that want to\n *  communicate with Pebble (excluding the official Pebble iOS app).\n *\n *  Unfortunately, the session can only be opened from the phone app. This means\n *  that the iOS app has to start talking to the watch first to open the\n *  communications channel; the other way around is not possible.\n *  Most methods in the PBWatch categories (Ping), (Version), (Sports), (Golf)\n *  and (AppMessages) all implicitly open the shared communication session.\n *\n *  Lastly, iOS provides no good way to manage how the one shared session is\n *  accessed or used. Simply, the last iOS app to try to open it, wins and gets\n *  to use it. Therefore, it is important that your iOS app does **not** try\n *  communicate when a Pebble is connected.\n *\n *  When the user has stopped using your app (e.g. when going to the background\n *  or when explicitely stopping a certain activity in the app) your iOS app\n *  should close the communication session using the -closeSession: method.\n */\n@interface PBWatch : NSObject\n\n/**\n *  YES if the receiver is connected and NO if the receiver is disconnected.\n *  @discussion This property is KVO-compliant.\n */\n@property (nonatomic, readonly, getter=isConnected) BOOL connected;\n\n/**\n *  The human-friendly name of the receiver.\n *  This is the same name as the user will see in the iOS Bluetooth Settings.\n */\n@property (nonatomic, readonly) NSString *name;\n\n/**\n *  The serial number of the receiver.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  The versionInfo of the receiver.\n *  @see PBVersionInfo\n */\n@property (nonatomic, readonly) PBVersionInfo *versionInfo;\n\n/**\n *  The delegate of the watch that will be notified of disconnections and errors.\n *  @see PBWatchDelegate\n */\n@property (nonatomic, readwrite, weak) id<PBWatchDelegate> delegate;\n\n/**\n *  The userInfo property can be used to associate application specific data\n *  with the watch. Note that the application itself is responsible for persisting\n *  the information if neccessary.\n */\n@property (nonatomic, readwrite, strong) id userInfo;\n\n/**\n *  The date when the watch was last known to be connected.\n *  This date will be updated automatically when the watch connects and\n *  disconnects. While the watch is being connected, this date will not be updated.\n */\n@property (nonatomic, readonly) NSDate *lastConnectedDate;\n\n/**\n *  Developer-friendly debugging description of the watch.\n *  @return localized, user-friendly summary of the receiver, including\n *  software and hardware version information, if available.\n */\n- (NSString*)friendlyDescription;\n\n/**\n *  Closes the communication session with the watch.\n *  Since there is only one, shared session for all 3rd party iOS apps,\n *  an app should close the session after the user is done using the app/watch-integration,\n *  so it can be used by other apps.\n *  The communication session is implicitely opened automatically when needed.\n *  @param onDone Callback block that will be called after the closing of the session\n *  has completed. If there is no open session, the onDone block will (also) be executed\n *  asynchronously on the calling queue.\n */\n- (void)closeSession:(void(^)(void))onDone;\n\n@end\n\n@protocol PBWatchDelegate <NSObject>\n@optional\n\n/**\n *  Called when the watch got disconnected.\n */\n- (void)watchDidDisconnect:(PBWatch*)watch;\n\n/**\n *  Called when the watch caught an error.\n */\n- (void)watch:(PBWatch*)watch handleError:(NSError*)error;\n\n/**\n *  Called when the internal EASession is about to be reset.\n */\n- (void)watchWillResetSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is opened\n */\n- (void)watchDidOpenSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is closed\n */\n- (void)watchDidCloseSession:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/PebbleKit.h",
    "content": "//\n//  PebbleSDK.h\n//  PebbleSDK\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#import <PebbleKit/PBWatch.h>\n#import <PebbleKit/PBPebbleCentral.h>\n#import <PebbleKit/PBWatch+Ping.h>\n#import <PebbleKit/PBWatch+Version.h>\n#import <PebbleKit/PBErrors.h>\n#import <PebbleKit/PBWatch+AppMessages.h>\n#import <PebbleKit/NSNumber+stdint.h>\n#import <PebbleKit/PBWatch+Sports.h>\n#import <PebbleKit/PBWatch+Golf.h>\n#import <PebbleKit/PBBitmap.h>\n#import <PebbleKit/PBDataLoggingService.h>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Headers/gtypes.h",
    "content": "//\n//  gtypes.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#ifndef PebbleKit_gtypes_h\n#define PebbleKit_gtypes_h\n\ntypedef struct GSize {\n  int16_t w;\n  int16_t h;\n} GSize;\n\ntypedef struct GPoint {\n  int16_t x;\n  int16_t y;\n} GPoint;\n\ntypedef struct GRect {\n  GPoint origin;\n  GSize size;\n} GRect;\n\n#endif\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/NSDictionary+Pebble.h",
    "content": "//\n//  NSDictionary+Pebble.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSDictionary (Pebble)\n\n/**\n *  Serializes the receiver into a Pebble dict.\n *  @note The receiver dictionary must comply to the following constraints:\n *  * The keys must be instances of NSNumber. Their -unsignedLongValue return value will be used as final key.\n *  * The values must be instances of either NSString, NSData or NSNumber. Use the NSNumber (stdint) category\n *  to specify the signedness and width of NSNumbers.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryUnsupportedKeyClass,\n *  PBErrorCodeDictionaryUnsupportedValueClass or PBErrorCodeDictionaryUnsupportedValueClass.\n *  @see -dictionaryFromPebbleDictionaryDataWithError:\n */\n- (NSData*)pebbleDictionaryData:(NSError * __autoreleasing *)error;\n\n@end\n\n@interface NSData (Pebble)\n\n/**\n *  Interprets the receiver as Pebble dict data and deserializes it into an NSDictionary.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryInternalConsistency.\n *  @see -pebbleDictionaryData:\n */\n- (NSDictionary*)dictionaryFromPebbleDictionaryDataWithError:(NSError * __autoreleasing *)error;\n\n@end"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/NSNumber+stdint.h",
    "content": "//\n//  NSNumber+stdint.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/**\n *  This category exposes the capabilities the underlying CFNumber to explicitely\n *  store the signedness and the width of the storage.\n */\n\n@interface NSNumber (stdint)\n\n/**\n *  Interprets the receiver as a 32-bits wide, unsigned integer.\n */\n- (uint32_t)uint32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, unsigned integer.\n */\n- (uint16_t)uint16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, unsigned integer.\n */\n- (uint8_t)uint8Value;\n\n/**\n *  Interprets the receiver as a 32-bits wide, signed integer.\n */\n- (int32_t)int32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, signed integer.\n */\n- (int16_t)int16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, signed integer.\n */\n- (int8_t)int8Value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint32:(uint32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint16:(uint16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint8:(uint8_t)value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt32:(int32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt16:(int16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt8:(int8_t)value;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a floating pointer number or not.\n */\n- (BOOL)isFloat;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a signed integer or not.\n */\n- (BOOL)isSigned;\n\n/**\n *  Gets the width in bytes of the integer that is stored by the receiver.\n */\n- (uint8_t)width;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBBitmap.h",
    "content": "//\n//  PBBitmap.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIImage.h>\n#import <PebbleKit/gtypes.h>\n\n/**\n *  Helper class to convert a UIImage to Pebble bitmap pixel data and GBitmap metadata.\n *  Refer to the documentation of Pebble's native watch app SDK on the GBitmap format.\n */\n\n@interface PBBitmap : NSObject\n\n/**\n *  The pixel data of the bitmap.\n *  This corresponds to the data as pointed to by GBitmap's `addr` field.\n */\n@property (nonatomic, readonly, strong) NSData *pixelData;\n\n/**\n *  The number of bytes per row.\n *  Always a multiple of 4 bytes.\n */\n@property (nonatomic, readonly, assign) uint16_t rowSizeBytes;\n\n/**\n *  Bitfield of metadata flags.\n *  This corresponds to GBitmap's `info_flags` field.\n */\n@property (nonatomic, readonly, assign) uint16_t infoFlags;\n\n/**\n *  The box of bits inside `pixelData`, that contains\n *  the actual image data to use.\n *  This corresponds to GBitmap's `bounds` field.\n */\n@property (nonatomic, readonly, assign) GRect bounds;\n\n/**\n *  Factory method to create a PBBitmap from a UIImage instance.\n *  @param image The UIImage from which to create the PBBitmap\n */\n+ (PBBitmap*)pebbleBitmapWithUIImage:(UIImage*)image;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBDataLoggingService.h",
    "content": "//\n//  PBDataLoggingService.h\n//  PebbleKit\n//\n//  Created by Martijn The on 7/19/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  Data logging datatypes.\n */\nenum {\n  //! Array of bytes\n  PBDataLoggingTypeByteArray = 0,\n  //! unsigned integer\n  PBDataLoggingTypeUInt = 2,\n  //! signed integer\n  PBDataLoggingTypeInt = 3,\n};\ntypedef UInt8 PBDataLoggingType;\n\n/**\n *  The metadata of a data logging session. Used to identify a session.\n */\n@interface PBDataLoggingSessionMetadata : NSObject <NSSecureCoding, NSCopying>\n\n/**\n *  A tag associated with the session.\n */\n@property (nonatomic, readonly) UInt32 tag;\n\n/**\n *  The timestamp of the moment the session was created by the watchapp.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The type of data stored in this session.\n */\n@property (nonatomic, readonly) PBDataLoggingType type;\n\n/**\n *  The size of a data item.\n */\n@property (nonatomic, readonly) UInt16 itemSize;\n\n/**\n *  The serial number of the watch that created the sessions.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  Creates a new data logging session metadata object, given all its property values.\n *  This method is provided to create a metadata object that can be used to\n *  compare it with a metadata object that is passed into one of the\n *  PBDataLoggingServiceDelegate methods.\n *  @param tag The tag associated with the session\n *  @param timestamp The timestamp of the creation of the session\n *  @param type The type of data stored in the session\n *  @param itemSize The size of a data item\n *  @param serialNumber The serial number of the watch that created the session\n *  @return A session metadata object with the specified information\n */\n+ (id)metadataWithTag:(UInt32)tag\n            timestamp:(UInt32)timestamp\n                 type:(PBDataLoggingType)type\n             itemSize:(UInt16)itemSize\n         serialNumber:(NSString *)serialNumber;\n\n/**\n *  Tests the equality of two data logging session metadata objects.\n *  This method can be used to compare two session metadata objects\n *  to check whether they are referring to the same session or not.\n *  @param sessionMetadata\n *  @return YES if all the property values of receiver are equal to the property\n *  values of the given session.\n *  @note Equivalent to -[PBDataLoggingSessionMetadata isEqual:]\n */\n- (BOOL)isEqualToDataLoggingSessionMetadata:(PBDataLoggingSessionMetadata *)sessionMetadata;\n@end\n\n/**\n *  Data logging delegate protocol. The object that implements this protocol\n *  is responsible for handling incoming data.\n */\n@protocol PBDataLoggingServiceDelegate <NSObject>\n@optional\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param bytes Pointer to the array of bytes.\n *  The array contains (numberOfItems * session.itemSize) bytes.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasByteArrays:(const UInt8 * const)bytes numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt8s:(const UInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt16s:(const UInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt32s:(const UInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt8s:(const SInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt16s:(const SInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt32s:(const SInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time a session is finished.\n *  This is guaranteed to be called only after all data has been received and\n *  consumed by the application.\n *  @param service The data logging service.\n *  @param session The metadata of the session.\n */\n- (void)dataLoggingService:(PBDataLoggingService *)service sessionDidFinish:(PBDataLoggingSessionMetadata *)session;\n\n@end\n\n/**\n *  The data logging service. Assign a delegate object in order to receive\n *  data from your watchapp.\n */\n@interface PBDataLoggingService : NSObject\n\n/**\n *  The delegate that has the responsility of handling callbacks from the\n *  data logging service.\n */\n@property (atomic, readwrite, weak) id<PBDataLoggingServiceDelegate> delegate;\n\n/**\n *  Sets the queue on which delegate methods will be executed.\n *  Callbacks are intended to be processed in the order as they come in, so it\n *  you must use a serial queue. If set to nil (default) the main queue is used.\n *  @param delegateQueue The queue on which the delegate methods will be executed.\n */\n- (void)setDelegateQueue:(dispatch_queue_t)delegateQueue;\n\n/**\n * Query the watch for data logging data.\n */\n- (void)pollForData;\n  \n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBErrors.h",
    "content": "//\n//  PBErrors.h\n//  PebbleSDK\n//\n//  Created by Martijn The on 7/26/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nextern NSString *PBErrorDomain;\n\n/**\n *  PebbleKit Error codes.\n *  Inspect the localizedDescription of any NSError objects for a description.\n */\n\ntypedef enum {\n  PBErrorCodeNoSupportedProtocolsInInfoPlist,\n  PBErrorCodeErrorCreatingSession,\n  PBErrorCodeOutputStreamError,\n  PBErrorCodeInputStreamError,\n  PBErrorCodeSendMessageTimeout,\n  PBErrorCodeEndpointDisallowed,\n  PBErrorCodeVersionInfoTimeout,\n  PBErrorCodeCannotCreateSessionWhileClosing,\n  PBErrorCodeNoAppUUID,\n  PBErrorCodeAppMessageRejected,\n  PBErrorCodeAppMessageAckTimeout,\n  PBErrorCodeDictionaryUnsupportedKeyClass,\n  PBErrorCodeDictionaryUnsupportedValueClass,\n  PBErrorCodeDictionaryInternalConsistency,\n  PBErrorCodeInvalidArguments,\n  PBErrorCodePebbleAppUnreachable,\n  PBErrorCodePebbleAppRequestTimeout,\n  PBErrorCodePebbleAppEmptyResponse,\n  PBErrorCodePebbleAppUnexpectedResponse,\n  PBErrorCodeServerNotAvailable,\n  PBErrorCodeDownloadFailed,\n  PBErrorCodePebbleNotConnected\n} PBErrorCode;\n\n@interface NSError (Pebble)\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode and with an underlying NSError object.\n *  @param code The error code for which to create the error\n *  @param error The underlying error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code underLyingError:(NSError*)error;\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode.\n *  @param code The error code for which to create the error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code;\n\n@end"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBLog.h",
    "content": "//\n//  PBLog.h\n//  PebbleApp\n//\n//  Created by Martijn The on 11/29/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import \"DDLog.h\"\n\n#ifndef PBWSLOG_CONTEXT\n#define PBWSLOG_CONTEXT 1\n#endif\n\nextern int PBLogLevel;\n\n#define LogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define WSLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n\n#define LogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBPebbleCentral.h",
    "content": "//\n//  PBPebbleCentral.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class PBWatch;\n@class PBDataLoggingService;\n@protocol PBPebbleCentralDelegate;\n\n/**\n PebbleCentral plays the central role for client iOS apps (e.g. RunKeeper).\n */\n@interface PBPebbleCentral : NSObject\n\n/**\n @returns The default central singleton instance.\n */\n+ (PBPebbleCentral*)defaultCentral;\n\n/**\n *  Enables debug logs. The logs will be routed to the system log (ASL) and\n *  console. It is advised to call this before making any other calls to PebbleKit.\n */\n+ (void)setDebugLogsEnabled:(BOOL)logsEnabled;\n\n/**\n The watches that are currently connected. Do not cache the array because it can change over time.\n */\n@property (nonatomic, readonly, strong) NSArray *connectedWatches;\n\n/**\n The watches that are stored in the user preferences of the application.\n */\n@property (nonatomic, readonly, strong) NSArray *registeredWatches;\n\n/**\n The central's delegate.\n */\n@property (nonatomic, readwrite, weak) id<PBPebbleCentralDelegate> delegate;\n\n/**\n *  The UUID is used as the identifier of the watch application and is used\n *  to make sure that appMessage and dataLogging communications arrives at its companion app\n *  on the other device (and not in another app).\n *  For most app message methods there is are two variants: one that does not take a UUID parameter and one that does take\n *  a UUID parameter (for example, -appMessagesAddReceiveUpdateHandler: vs appMessagesAddReceiveUpdateHandler:withUUID:).\n *  The methods that do not take a UUID, will use the UUID as set prior to this property.\n *  @param uuid The 16 byte UUID of your app.\n *  @note The UUID needs to be set before using either app message or data logging.\n */\n@property (nonatomic, strong, readwrite) NSData *appUUID;\n\n/**\n *  Verifies the currently set application UUID.\n *  @return YES if the currently set UUID is valid, NO if it is not.\n *  @see -setAppUuid:\n */\n- (BOOL)hasValidAppUUID;\n\n/**\n @returns YES if the Pebble iOS app is installed, NO if it is not installed.\n */\n- (BOOL)isMobileAppInstalled;\n\n/**\n Redirects to Pebble in the App Store, so the user can install the app.\n */\n- (void)installMobileApp;\n\n/**\n Wipes out the data associated with the registered watches, that is stored on the phone.\n */\n- (void)unregisterAllWatches;\n\n/**\n Returns the most recently connected watch from the -registeredWatches array.\n */\n- (PBWatch*)lastConnectedWatch;\n\n@property (nonatomic, readonly) PBDataLoggingService *dataLoggingService;\n\n@end\n\n\n@protocol PBPebbleCentralDelegate <NSObject>\n@optional\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was connected.\n @param isNew YES if the watch has been connected for the first time since the app has been installed or NO if not.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidConnect:(PBWatch*)watch isNew:(BOOL)isNew;\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was disconnected.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidDisconnect:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+AppMessages.h",
    "content": "//\n//  PBWatch+AppMessages.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\ntypedef NS_ENUM(UInt8, PBAppState) {\n  PBAppStateNotRunning = 0x00,\n  PBAppStateRunning = 0x01,\n};\n\n@interface PBWatch (AppMessages)\n\n/**\n *  Queries the watch whether AppMessages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isAppMessagesSupported YES if AppMessages are supported, NO if not.\n */\n- (void)appMessagesGetIsSupported:(void(^)(PBWatch *watch, BOOL isAppMessagesSupported))fetchedBlock;\n\n/**\n *  Pushes an update to the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Pushes an update to the watch application with the specified UUID.\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watchapp to which the update should be sent.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary withUUID:(NSData*)uuid onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with the specified UUID.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @param uuid The UUID of the watchapp for which sent messages should be handled by the onReceive block.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive withUUID:(NSData*)uuid;\n\n/**\n *  Add a handler for lifecycle events of watch applications.\n *  @param onLifecycleUpdate This block will be called when an application starts and\n *  stops running.\n *  @param watch The watch that has sent the event.\n *  @param uuid The uuid of the application that caused the event.\n *  @param newAppState The new state of the app (either PBAppStateNotRunning or PBAppStateRunning).\n */\n- (id)appMessagesAddAppLifecycleUpdateHandler:(void(^)(PBWatch *watch, NSUUID *uuid,\n                                                       PBAppState newAppState))onLifecycleUpdate;\n\n\n// INTERNAL USE ONLY\n- (id)appMessagesAddReceiveAllUpdatesHandler:(BOOL(^)(PBWatch *watch, NSUUID *uuid, NSDictionary *update))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -appMessagesAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -appMessagesAddReceiveUpdateHandler:\n *  @see -appMessagesAddReceiveUpdateHandler:\n */\n- (void)appMessagesRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Fetches the run state of the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]. You can use this method to determine whether the watch\n *  application is running or not.\n *  TODO: Ask Francois how this API works.\n *  @param onSent The block that will be called after the fetch state command has been\n *  sent to the watch.\n */\n- (void)appMessagesFetchAppState:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with the specified UUID.\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n/**\n *  Sends a command to kill the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to kill the watch application with the specified UUID.\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+Golf.h",
    "content": "//\n//  PBWatch+Golf.h\n//  PebbleKit\n//\n//  Created by Martijn The on 4/4/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n@interface PBWatch (Golf)\n\n/**\n *  The UUID of the Golf watch app.\n */\nextern NSData *PBGolfUUID;\n\n/**\n *  The key of the \"Front\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfFrontKey;\n\n/**\n *  The key of the \"Mid\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfMidKey;\n\n/**\n *  The key of the \"Back\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfBackKey;\n\n/**\n *  The key of the \"Hole\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfHoleKey;\n\n/**\n *  The key of the \"Par\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfParKey;\n\n/**\n *  The command IDs that can be sent back by the Golf watch app.\n *  @see -golfAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  GolfAppCommandPrevious = 0x01,\n  GolfAppCommandNext = 0x02,\n  GolfAppCommandSelect = 0x03,\n} GolfAppCommand;\n\n/**\n *  Queries the watch whether Golf Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isGolfSupported YES if Golf Messages are supported, NO if not.\n */\n- (void)golfGetIsSupported:(void(^)(PBWatch *watch, BOOL isGolfSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends an update to the golf app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey, PBGolfParKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n *  @see PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey and PBGolfParKey\n */\n- (void)golfAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Golf updates that are send by the Golf watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param command The command as sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -golfAppRemoveUpdateHandler:\n *  @see GolfAppCommand\n *  @see -golfAppRemoveUpdateHandler:\n */\n- (id)golfAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, GolfAppCommand command))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -golfAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -golfAppAddReceiveUpdateHandler:\n *  @see -golfAppAddReceiveUpdateHandler:\n */\n- (void)golfAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the golf app on the watch.\n *  @discussion It is recommended to perform this as the first call after -golfGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+Ping.h",
    "content": "//\n//  PBWatch+Ping.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/14/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n@interface PBWatch (Ping)\n\n/**\n * Sends a ping to the watch.\n * @param cookie A number identifying the ping.\n * @param onPong The block handler that will be called when the \"pong\" reply from the watch has been received.\n * @param watch The watch that sent the \"pong\" reply, which is \"self\". It is passed in to avoid retain loops.\n * @param cookie The cookie that was initially passed when calling this method.\n * @param onTimeout The block handler that will be called when the watch failed to reply in time.\n */\n- (void)pingWithCookie:(UInt32)cookie onPong:(void(^)(PBWatch *watch, UInt32 cookie))onPong onTimeout:(void(^)(PBWatch *watch, UInt32 cookie))onTimeout;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+PollServices.h",
    "content": "//\n//  PBWatch+PollServices.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n * PollServiceType\n */ \n\n\nenum {\n  PBPollRemoteServiceMail = 0,\n  PBPollRemoteServiceDataLogging = 1,\n  PBNumPollRemoteServices\n};\ntypedef UInt8 PBPollRemoteServiceType;\n\n@interface PBWatch (PollServices)\n// Call this upon connect with the watch to add handlers:\n- (id)addPollServicesHandler:(void(^)(PBWatch *))handler forService:(PBPollRemoteServiceType)service interval:(UInt8)interval;\n- (void)sendPollRequestForService:(PBPollRemoteServiceType)service;\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+Sports.h",
    "content": "//\n//  PBWatch+Sports.h\n//  PebbleKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n/**\n *  The UUID of the Sports watch app.\n */\nextern NSData *PBSportsUUID;\n\n/**\n *  The key of the \"Time\" field.\n *  The accompanying value must be an NSString (max. ~8 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsTimeKey;\n\n/**\n *  The key of the \"Distance\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDistanceKey;\n\n/**\n *  The key of the general purpose \"Data\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDataKey;\n\n/**\n *  The key of the \"Activity State\".\n *  The value must be an NSNumber created using +[NSNumber numberWithUint8:].\n *  @see SportsAppActivityState for valid values to use\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsActivityStateKey;\n\n/**\n *  Instances of this convenience class represent an update of the current time, distance and pace,\n *  and has a method to convert the values into a dictionary that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n@interface PBSportsUpdate : NSObject\n\n/**\n *  The current time in seconds. The possible range is currently limited from -7140. to 7140., inclusive. (±1h 59min 59sec).\n */\n@property (nonatomic, readwrite, assign) NSTimeInterval time;\n\n/**\n *  The current distance in km or mi. The possible range is currently limited from -99.9 to 99.9, inclusive.\n *  The unit of distance is dependent on the current unit setting.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float distance;\n\n/**\n *  General purpose data variable. The possible range is currently limited from -99.99 to 99.99, inclusive.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float data;\n\n/**\n *  Convenience method to create an update object.\n */\n+ (PBSportsUpdate*)updateWithTime:(NSTimeInterval)time distance:(float)distance data:(float)data;\n\n/**\n *  Creates an update dictionary from the receiver, that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n- (NSDictionary*)dictionary;\n\n/**\n *  Creates a formatted time string with from a total seconds value, formatted as \"h:mm:ss\".\n *  For example, supplying the value 3930.0f seconds will return @\"1:05:30\"\n *  @param seconds The number of seconds from which to create the time string.\n *  @return Formatted time as \"h:mm:ss\"\n */\n+ (NSString*)timeStringFromFloat:(float)seconds;\n\n@end\n\n@interface PBWatch (Sports)\n\n/**\n *  The state of the Sports activity.\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  SportsAppActivityStateInit = 0x00,\n  SportsAppActivityStateRunning = 0x01,\n  SportsAppActivityStatePaused = 0x02,\n  SportsAppActivityStateEnd = 0x03,\n} SportsAppActivityState;\n\n/**\n *  Queries the watch whether Sports Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isSportsSupported YES if Sports Messages are supported, NO if not.\n */\n- (void)sportsGetIsSupported:(void(^)(PBWatch *watch, BOOL isSportsSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the preferred\n *  unit system, either metric or imperial.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetMetric:(BOOL)isMetric onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents,\n *  to set the preferred  data label (either PACE or SPEED) and corresponding units.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetLabel:(BOOL)isPace onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the state of the\n *  sports activity. Currently only SportsAppActivityStateRunning and SportsAppActivityStatePaused are\n *  supported.\n *  @param state The new sports activity state\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetActivityState:(SportsAppActivityState)state onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends the update to the sports app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBSportsTimeKey, PBSportsPaceKey, PBSportsDistanceKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Sports updates that are send by the Sports watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param state The new sports activity state as set by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -sportsAppRemoveUpdateHandler:\n *  @see SportsAppActivityState\n *  @see -sportsAppRemoveUpdateHandler:\n */\n- (id)sportsAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, SportsAppActivityState state))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -sportsAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -sportsAppAddReceiveUpdateHandler:\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\n- (void)sportsAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the sports app on the watch.\n *  @discussion It is recommended to perform this as the first call after -sportsGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch+Version.h",
    "content": "//\n//  PBWatch+Version.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/17/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  PBFirmwareVersion is a helper class that is able to parse the versionTag string\n *  into its components (os, major, minor, suffix) and facilitate comparisons\n *  between versions.\n *  Valid versions follow the following format:\n *  `vOS(.MAJOR(.MINOR(-SUFFIX)))`\n *  Where the fields OS, MAJOR, MINOR are positive, decimal integer numbers and SUFFIX\n *  an arbitrary string. MAJOR, MINOR and SUFFIX are optional (nested optionality).\n *  Examples of valid versions:\n *  `v1`\n *  `v2.1234.99-alpha-beta-gamma`\n */\n@interface PBFirmwareVersion : NSObject\n/**\n *  The OS version component.\n */\n@property (nonatomic, readonly) NSInteger os;\n\n/**\n *  The major version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger major;\n\n/**\n *  The minor version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger minor;\n\n/**\n *  The release suffix, which is the part following the dash '-'.\n *  @note If a version tag string does not contain a suffix, it will be set to an empty string.\n *  @discussion The release suffix is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *suffix;\n\n/**\n *  The version timestamp.\n *  @note The timestamp is in the final comparison equation, in the -compare: method, after evaluating\n *  os, major and minor components.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The version's git commit hash.\n *  @discussion The commit hash is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *commitHash;\n\n/**\n *  The version's git tag.\n */\n@property (nonatomic, readonly, copy) NSString *tag;\n\n/**\n *  Creates a PBFirmwareVersion object given a tag string and timestamp.\n */\n+ (PBFirmwareVersion*)firmwareVersionWithTag:(NSString*)tag commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Creates a PBFirmwareVersion object given its components.\n *  @discussion The tag string will be set to the canonical format vOS.MINOR.MAJOR(-SUFFIX).\n */\n+ (PBFirmwareVersion*)firmwareVersionWithOS:(NSInteger)os major:(NSInteger)major minor:(NSInteger)minor suffix:(NSString*)suffix commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Compares the receiver to another version object.\n *  @param aVersion The version to compare with the receiver.\n *  @return NSOrderedAscending if the value of aVersion is greater than the receiver’s,\n *  NSOrderedSame if they’re equal, and NSOrderedDescending if the value of aVersion is less than the receiver’s.\n */\n- (NSComparisonResult)compare:(PBFirmwareVersion *)aVersion;\n\n/**\n *  Convenience wrappers around -compare:\n */\n- (BOOL)isEqualOrNewer:(PBFirmwareVersion *)other;\n- (BOOL)isNewer:(PBFirmwareVersion *)other;\n- (BOOL)isEqualVersionOnly:(PBFirmwareVersion *)other;\n\n@end\n\n\n\n/**\n *  Values specifying the Pebble hardware platform variant.\n */\ntypedef enum {\n  FirmwareMetadataPlatformUnknown = 0,\n  FirmwareMetadataPlatformPebbleOneEV1 = 1,\n  FirmwareMetadataPlatformPebbleOneEV2 = 2,\n  FirmwareMetadataPlatformPebbleOneEV2_3 = 3,\n  FirmwareMetadataPlatformPebbleOneEV2_4 = 4,\n  FirmwareMetadataPlatformPebbleOnePointFive = 5,\n  FirmwareMetadataPlatformPebbleTwoPointZero = 6,\n  FirmwareMetadataPlatformPebbleOneBigboard = 0xff,\n  FirmwareMetadataPlatformPebbleOneBigboard2 = 0xfe,\n} FirmwareMetadataPlatform;\n\n/**\n *  Instances of PBFirmwareMetadata describe a firmware in terms of\n *  its version, whether it is a recovery firmware and its intended hardware\n *  platform.\n *  @see PBVersionInfo\n */\n\n@interface PBFirmwareMetadata : NSObject\n\n/**\n *  The version of the firmware.\n *  @see PBFirmwareVersion\n */\n@property (nonatomic, readonly) PBFirmwareVersion *version;\n\n/**\n *  YES if the firmware is a recovery firmware, NO if it is a regular firmware.\n */\n@property (nonatomic, readonly) BOOL isRecoveryFirmware;\n\n/**\n *  The hardware platform variant with which the firmware is compatible.\n */\n@property (nonatomic, readonly) FirmwareMetadataPlatform hardwarePlatform;\n\n/**\n *  Converts a <FirmwareMetadataPlatform> value to a string.\n *  @param hardwarePlatform The hardware platform value to convert\n *  @return A string of the hardware platform\n */\n+ (NSString*)hardwarePlatformToString:(FirmwareMetadataPlatform)hardwarePlatform;\n\n/**\n *  Converts an NSString hardware platform string to the corresponding\n *  FirmwareMetadataPlatform value.\n *  @param hardwarePlatformString The string representing the hardware platform.\n *  @return The hardware platform enum value\n */\n+ (FirmwareMetadataPlatform)stringToHardwarePlatform:(NSString *)hardwarePlatformString;\n\n@end\n\n/**\n *  Instances of PBResourceMetadata describe (system) resources.\n *  @see PBVersionInfo\n */\n\n@interface PBResourceMetadata : NSObject\n\n/**\n *  The version of the resources as the Epoch timestamp of the Git commit.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The checksum of the resources.\n */\n@property (nonatomic, readonly) UInt32 crc;\n\n/**\n *  The human-friendly string version of the resources.\n */\n@property (nonatomic, readonly, strong) NSString *friendlyVersion;\n\n/**\n *  YES if the metadata represents valid resources, NO if it does not.\n */\n- (BOOL)isValid;\n\n@end\n\n/**\n *  An instance of PBVersionInfo describes all the different system software (Pebble OS)\n *  on a Pebble watch and other auxiliary information.\n *  @see PBWatch\n */\n\n@interface PBVersionInfo : NSObject\n\n/**\n *  The metadata of the firmware that is running.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *runningFirmwareMetadata;\n\n/**\n *  The metadata of the recovery firmware that is in storage.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *recoveryFirmwareMetadata;\n\n/**\n *  The metadata of the system resources.\n */\n@property (nonatomic, readonly, strong) PBResourceMetadata *systemResources;\n\n/**\n *  The version of the bootloader.\n */\n@property (nonatomic, readonly) UInt32 bootloaderVersion;\n\n/**\n *  The version of the hardware.\n */\n@property (nonatomic, readonly, strong) NSString *hardwareVersion;\n\n/**\n *  The serial number.\n */\n@property (nonatomic, readonly, strong) NSString *serialNumber;\n\n/**\n *  The current Bluetooth device address.\n */\n@property (nonatomic, readonly, strong) NSData *deviceAddress;\n\n/**\n *  YES if valid recovery firmware is installed, NO if not.\n */\n- (BOOL)hasRecoveryFirmware;\n\n/**\n *  YES if valid system resources are installed, NO if not.\n */\n- (BOOL)hasSystemResources;\n\n@end\n\n@interface PBWatch (Version)\n\n/**\n *  Requests the version info from the receiver.\n *  @param handler The handler that will be called when the version info response has been received.\n *  @param onTimeout The handler that will be called if the watch did not respond within 5 seconds.\n *  @param watch The watch for which the version info was requested.\n *  @param versionInfo The version info response.\n *  @discussion The <PBVersionInfo> response will be cached. The latest version info can be\n *  accessed through the <versionInfo> property of <PBWatch>.\n */\n- (void)getVersionInfo:(void (^)(PBWatch *watch, PBVersionInfo *versionInfo))handler onTimeout:(void (^)(PBWatch *watch))onTimeout;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PBWatch.h",
    "content": "//\n//  PBWatch.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@protocol PBWatchDelegate;\n@class PBVersionInfo;\n@class PBDataLoggingService;\n\n/**\n *  Represents a Pebble watch.\n *\n *  On iOS, there is the notion of a \"communication session\" between an app and\n *  the Pebble watch. You can imagine this as a \"data pipe\" directly from the\n *  watch to your app. However, there is only one session for 3rd party apps.\n *  This one session has to be shared among all 3rd party apps that want to\n *  communicate with Pebble (excluding the official Pebble iOS app).\n *\n *  Unfortunately, the session can only be opened from the phone app. This means\n *  that the iOS app has to start talking to the watch first to open the\n *  communications channel; the other way around is not possible.\n *  Most methods in the PBWatch categories (Ping), (Version), (Sports), (Golf)\n *  and (AppMessages) all implicitly open the shared communication session.\n *\n *  Lastly, iOS provides no good way to manage how the one shared session is\n *  accessed or used. Simply, the last iOS app to try to open it, wins and gets\n *  to use it. Therefore, it is important that your iOS app does **not** try\n *  communicate when a Pebble is connected.\n *\n *  When the user has stopped using your app (e.g. when going to the background\n *  or when explicitely stopping a certain activity in the app) your iOS app\n *  should close the communication session using the -closeSession: method.\n */\n@interface PBWatch : NSObject\n\n/**\n *  YES if the receiver is connected and NO if the receiver is disconnected.\n *  @discussion This property is KVO-compliant.\n */\n@property (nonatomic, readonly, getter=isConnected) BOOL connected;\n\n/**\n *  The human-friendly name of the receiver.\n *  This is the same name as the user will see in the iOS Bluetooth Settings.\n */\n@property (nonatomic, readonly) NSString *name;\n\n/**\n *  The serial number of the receiver.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  The versionInfo of the receiver.\n *  @see PBVersionInfo\n */\n@property (nonatomic, readonly) PBVersionInfo *versionInfo;\n\n/**\n *  The delegate of the watch that will be notified of disconnections and errors.\n *  @see PBWatchDelegate\n */\n@property (nonatomic, readwrite, weak) id<PBWatchDelegate> delegate;\n\n/**\n *  The userInfo property can be used to associate application specific data\n *  with the watch. Note that the application itself is responsible for persisting\n *  the information if neccessary.\n */\n@property (nonatomic, readwrite, strong) id userInfo;\n\n/**\n *  The date when the watch was last known to be connected.\n *  This date will be updated automatically when the watch connects and\n *  disconnects. While the watch is being connected, this date will not be updated.\n */\n@property (nonatomic, readonly) NSDate *lastConnectedDate;\n\n/**\n *  Developer-friendly debugging description of the watch.\n *  @return localized, user-friendly summary of the receiver, including\n *  software and hardware version information, if available.\n */\n- (NSString*)friendlyDescription;\n\n/**\n *  Closes the communication session with the watch.\n *  Since there is only one, shared session for all 3rd party iOS apps,\n *  an app should close the session after the user is done using the app/watch-integration,\n *  so it can be used by other apps.\n *  The communication session is implicitely opened automatically when needed.\n *  @param onDone Callback block that will be called after the closing of the session\n *  has completed. If there is no open session, the onDone block will (also) be executed\n *  asynchronously on the calling queue.\n */\n- (void)closeSession:(void(^)(void))onDone;\n\n@end\n\n@protocol PBWatchDelegate <NSObject>\n@optional\n\n/**\n *  Called when the watch got disconnected.\n */\n- (void)watchDidDisconnect:(PBWatch*)watch;\n\n/**\n *  Called when the watch caught an error.\n */\n- (void)watch:(PBWatch*)watch handleError:(NSError*)error;\n\n/**\n *  Called when the internal EASession is about to be reset.\n */\n- (void)watchWillResetSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is opened\n */\n- (void)watchDidOpenSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is closed\n */\n- (void)watchDidCloseSession:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/PebbleKit.h",
    "content": "//\n//  PebbleSDK.h\n//  PebbleSDK\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#import <PebbleKit/PBWatch.h>\n#import <PebbleKit/PBPebbleCentral.h>\n#import <PebbleKit/PBWatch+Ping.h>\n#import <PebbleKit/PBWatch+Version.h>\n#import <PebbleKit/PBErrors.h>\n#import <PebbleKit/PBWatch+AppMessages.h>\n#import <PebbleKit/NSNumber+stdint.h>\n#import <PebbleKit/PBWatch+Sports.h>\n#import <PebbleKit/PBWatch+Golf.h>\n#import <PebbleKit/PBBitmap.h>\n#import <PebbleKit/PBDataLoggingService.h>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/A/Headers/gtypes.h",
    "content": "//\n//  gtypes.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#ifndef PebbleKit_gtypes_h\n#define PebbleKit_gtypes_h\n\ntypedef struct GSize {\n  int16_t w;\n  int16_t h;\n} GSize;\n\ntypedef struct GPoint {\n  int16_t x;\n  int16_t y;\n} GPoint;\n\ntypedef struct GRect {\n  GPoint origin;\n  GSize size;\n} GRect;\n\n#endif\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/NSDictionary+Pebble.h",
    "content": "//\n//  NSDictionary+Pebble.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSDictionary (Pebble)\n\n/**\n *  Serializes the receiver into a Pebble dict.\n *  @note The receiver dictionary must comply to the following constraints:\n *  * The keys must be instances of NSNumber. Their -unsignedLongValue return value will be used as final key.\n *  * The values must be instances of either NSString, NSData or NSNumber. Use the NSNumber (stdint) category\n *  to specify the signedness and width of NSNumbers.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryUnsupportedKeyClass,\n *  PBErrorCodeDictionaryUnsupportedValueClass or PBErrorCodeDictionaryUnsupportedValueClass.\n *  @see -dictionaryFromPebbleDictionaryDataWithError:\n */\n- (NSData*)pebbleDictionaryData:(NSError * __autoreleasing *)error;\n\n@end\n\n@interface NSData (Pebble)\n\n/**\n *  Interprets the receiver as Pebble dict data and deserializes it into an NSDictionary.\n *  @param error[out] Pointer to an NSError that will be set after the method has returned\n *  in case there was an error. Possible error codes: PBErrorCodeDictionaryInternalConsistency.\n *  @see -pebbleDictionaryData:\n */\n- (NSDictionary*)dictionaryFromPebbleDictionaryDataWithError:(NSError * __autoreleasing *)error;\n\n@end"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/NSNumber+stdint.h",
    "content": "//\n//  NSNumber+stdint.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/**\n *  This category exposes the capabilities the underlying CFNumber to explicitely\n *  store the signedness and the width of the storage.\n */\n\n@interface NSNumber (stdint)\n\n/**\n *  Interprets the receiver as a 32-bits wide, unsigned integer.\n */\n- (uint32_t)uint32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, unsigned integer.\n */\n- (uint16_t)uint16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, unsigned integer.\n */\n- (uint8_t)uint8Value;\n\n/**\n *  Interprets the receiver as a 32-bits wide, signed integer.\n */\n- (int32_t)int32Value;\n\n/**\n *  Interprets the receiver as a 16-bits wide, signed integer.\n */\n- (int16_t)int16Value;\n\n/**\n *  Interprets the receiver as a 8-bits wide, signed integer.\n */\n- (int8_t)int8Value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint32:(uint32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint16:(uint16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, unsigned integer.\n */\n+ (NSNumber *)numberWithUint8:(uint8_t)value;\n\n/**\n *  Creates an NSNumber with a 32-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt32:(int32_t)value;\n\n/**\n *  Creates an NSNumber with a 16-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt16:(int16_t)value;\n\n/**\n *  Creates an NSNumber with a 8-bits wide, signed integer.\n */\n+ (NSNumber *)numberWithInt8:(int8_t)value;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a floating pointer number or not.\n */\n- (BOOL)isFloat;\n\n/**\n *  Gets whether the number that is stored by the receiver should be interpreted\n *  as a signed integer or not.\n */\n- (BOOL)isSigned;\n\n/**\n *  Gets the width in bytes of the integer that is stored by the receiver.\n */\n- (uint8_t)width;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBBitmap.h",
    "content": "//\n//  PBBitmap.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIImage.h>\n#import <PebbleKit/gtypes.h>\n\n/**\n *  Helper class to convert a UIImage to Pebble bitmap pixel data and GBitmap metadata.\n *  Refer to the documentation of Pebble's native watch app SDK on the GBitmap format.\n */\n\n@interface PBBitmap : NSObject\n\n/**\n *  The pixel data of the bitmap.\n *  This corresponds to the data as pointed to by GBitmap's `addr` field.\n */\n@property (nonatomic, readonly, strong) NSData *pixelData;\n\n/**\n *  The number of bytes per row.\n *  Always a multiple of 4 bytes.\n */\n@property (nonatomic, readonly, assign) uint16_t rowSizeBytes;\n\n/**\n *  Bitfield of metadata flags.\n *  This corresponds to GBitmap's `info_flags` field.\n */\n@property (nonatomic, readonly, assign) uint16_t infoFlags;\n\n/**\n *  The box of bits inside `pixelData`, that contains\n *  the actual image data to use.\n *  This corresponds to GBitmap's `bounds` field.\n */\n@property (nonatomic, readonly, assign) GRect bounds;\n\n/**\n *  Factory method to create a PBBitmap from a UIImage instance.\n *  @param image The UIImage from which to create the PBBitmap\n */\n+ (PBBitmap*)pebbleBitmapWithUIImage:(UIImage*)image;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBDataLoggingService.h",
    "content": "//\n//  PBDataLoggingService.h\n//  PebbleKit\n//\n//  Created by Martijn The on 7/19/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  Data logging datatypes.\n */\nenum {\n  //! Array of bytes\n  PBDataLoggingTypeByteArray = 0,\n  //! unsigned integer\n  PBDataLoggingTypeUInt = 2,\n  //! signed integer\n  PBDataLoggingTypeInt = 3,\n};\ntypedef UInt8 PBDataLoggingType;\n\n/**\n *  The metadata of a data logging session. Used to identify a session.\n */\n@interface PBDataLoggingSessionMetadata : NSObject <NSSecureCoding, NSCopying>\n\n/**\n *  A tag associated with the session.\n */\n@property (nonatomic, readonly) UInt32 tag;\n\n/**\n *  The timestamp of the moment the session was created by the watchapp.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The type of data stored in this session.\n */\n@property (nonatomic, readonly) PBDataLoggingType type;\n\n/**\n *  The size of a data item.\n */\n@property (nonatomic, readonly) UInt16 itemSize;\n\n/**\n *  The serial number of the watch that created the sessions.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  Creates a new data logging session metadata object, given all its property values.\n *  This method is provided to create a metadata object that can be used to\n *  compare it with a metadata object that is passed into one of the\n *  PBDataLoggingServiceDelegate methods.\n *  @param tag The tag associated with the session\n *  @param timestamp The timestamp of the creation of the session\n *  @param type The type of data stored in the session\n *  @param itemSize The size of a data item\n *  @param serialNumber The serial number of the watch that created the session\n *  @return A session metadata object with the specified information\n */\n+ (id)metadataWithTag:(UInt32)tag\n            timestamp:(UInt32)timestamp\n                 type:(PBDataLoggingType)type\n             itemSize:(UInt16)itemSize\n         serialNumber:(NSString *)serialNumber;\n\n/**\n *  Tests the equality of two data logging session metadata objects.\n *  This method can be used to compare two session metadata objects\n *  to check whether they are referring to the same session or not.\n *  @param sessionMetadata\n *  @return YES if all the property values of receiver are equal to the property\n *  values of the given session.\n *  @note Equivalent to -[PBDataLoggingSessionMetadata isEqual:]\n */\n- (BOOL)isEqualToDataLoggingSessionMetadata:(PBDataLoggingSessionMetadata *)sessionMetadata;\n@end\n\n/**\n *  Data logging delegate protocol. The object that implements this protocol\n *  is responsible for handling incoming data.\n */\n@protocol PBDataLoggingServiceDelegate <NSObject>\n@optional\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param bytes Pointer to the array of bytes.\n *  The array contains (numberOfItems * session.itemSize) bytes.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasByteArrays:(const UInt8 * const)bytes numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt8s:(const UInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt16s:(const UInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of UInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasUInt32s:(const UInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt8`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt8s:(const SInt8[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt16`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt16s:(const SInt16[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time there is data available that has not been\n *  consumed yet.\n *  @param service The data logging service.\n *  @param data Pointer to the array of SInt32`s.\n *  @param numberOfItems The number of items that the array contains.\n *  @param session The metadata of the session.\n *  @return YES if the data was consumed and the service can discard the data.\n *  Return NO if the data was not be consumed after the method returned.\n *  If NO is returned, the next time this callback is invoked for the session, the\n *  data argument will (also) contain the data of the items of the previous\n *  invocation of the callback.\n */\n- (BOOL)dataLoggingService:(PBDataLoggingService *)service hasSInt32s:(const SInt32[])data numberOfItems:(UInt16)numberOfItems forDataLoggingSession:(PBDataLoggingSessionMetadata *)session;\n\n/**\n *  Called by the service every time a session is finished.\n *  This is guaranteed to be called only after all data has been received and\n *  consumed by the application.\n *  @param service The data logging service.\n *  @param session The metadata of the session.\n */\n- (void)dataLoggingService:(PBDataLoggingService *)service sessionDidFinish:(PBDataLoggingSessionMetadata *)session;\n\n@end\n\n/**\n *  The data logging service. Assign a delegate object in order to receive\n *  data from your watchapp.\n */\n@interface PBDataLoggingService : NSObject\n\n/**\n *  The delegate that has the responsility of handling callbacks from the\n *  data logging service.\n */\n@property (atomic, readwrite, weak) id<PBDataLoggingServiceDelegate> delegate;\n\n/**\n *  Sets the queue on which delegate methods will be executed.\n *  Callbacks are intended to be processed in the order as they come in, so it\n *  you must use a serial queue. If set to nil (default) the main queue is used.\n *  @param delegateQueue The queue on which the delegate methods will be executed.\n */\n- (void)setDelegateQueue:(dispatch_queue_t)delegateQueue;\n\n/**\n * Query the watch for data logging data.\n */\n- (void)pollForData;\n  \n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBErrors.h",
    "content": "//\n//  PBErrors.h\n//  PebbleSDK\n//\n//  Created by Martijn The on 7/26/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nextern NSString *PBErrorDomain;\n\n/**\n *  PebbleKit Error codes.\n *  Inspect the localizedDescription of any NSError objects for a description.\n */\n\ntypedef enum {\n  PBErrorCodeNoSupportedProtocolsInInfoPlist,\n  PBErrorCodeErrorCreatingSession,\n  PBErrorCodeOutputStreamError,\n  PBErrorCodeInputStreamError,\n  PBErrorCodeSendMessageTimeout,\n  PBErrorCodeEndpointDisallowed,\n  PBErrorCodeVersionInfoTimeout,\n  PBErrorCodeCannotCreateSessionWhileClosing,\n  PBErrorCodeNoAppUUID,\n  PBErrorCodeAppMessageRejected,\n  PBErrorCodeAppMessageAckTimeout,\n  PBErrorCodeDictionaryUnsupportedKeyClass,\n  PBErrorCodeDictionaryUnsupportedValueClass,\n  PBErrorCodeDictionaryInternalConsistency,\n  PBErrorCodeInvalidArguments,\n  PBErrorCodePebbleAppUnreachable,\n  PBErrorCodePebbleAppRequestTimeout,\n  PBErrorCodePebbleAppEmptyResponse,\n  PBErrorCodePebbleAppUnexpectedResponse,\n  PBErrorCodeServerNotAvailable,\n  PBErrorCodeDownloadFailed,\n  PBErrorCodePebbleNotConnected\n} PBErrorCode;\n\n@interface NSError (Pebble)\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode and with an underlying NSError object.\n *  @param code The error code for which to create the error\n *  @param error The underlying error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code underLyingError:(NSError*)error;\n\n/**\n *  Convenience method to create an NSError object with <PBErrorDomain> error domain\n *  and a given PBErrorCode.\n *  @param code The error code for which to create the error\n */\n+ (NSError*)pebbleErrorWithCode:(PBErrorCode)code;\n\n@end"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBLog.h",
    "content": "//\n//  PBLog.h\n//  PebbleApp\n//\n//  Created by Martijn The on 11/29/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import \"DDLog.h\"\n\n#ifndef PBWSLOG_CONTEXT\n#define PBWSLOG_CONTEXT 1\n#endif\n\nextern int PBLogLevel;\n\n#define LogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define WSLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n#define WSLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, PBWSLOG_CONTEXT, frmt, ##__VA_ARGS__)\n\n#define LogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   PBLogLevel, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define LogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    PBLogLevel, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define LogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    PBLogLevel, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define LogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, PBLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBPebbleCentral.h",
    "content": "//\n//  PBPebbleCentral.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@class PBWatch;\n@class PBDataLoggingService;\n@protocol PBPebbleCentralDelegate;\n\n/**\n PebbleCentral plays the central role for client iOS apps (e.g. RunKeeper).\n */\n@interface PBPebbleCentral : NSObject\n\n/**\n @returns The default central singleton instance.\n */\n+ (PBPebbleCentral*)defaultCentral;\n\n/**\n *  Enables debug logs. The logs will be routed to the system log (ASL) and\n *  console. It is advised to call this before making any other calls to PebbleKit.\n */\n+ (void)setDebugLogsEnabled:(BOOL)logsEnabled;\n\n/**\n The watches that are currently connected. Do not cache the array because it can change over time.\n */\n@property (nonatomic, readonly, strong) NSArray *connectedWatches;\n\n/**\n The watches that are stored in the user preferences of the application.\n */\n@property (nonatomic, readonly, strong) NSArray *registeredWatches;\n\n/**\n The central's delegate.\n */\n@property (nonatomic, readwrite, weak) id<PBPebbleCentralDelegate> delegate;\n\n/**\n *  The UUID is used as the identifier of the watch application and is used\n *  to make sure that appMessage and dataLogging communications arrives at its companion app\n *  on the other device (and not in another app).\n *  For most app message methods there is are two variants: one that does not take a UUID parameter and one that does take\n *  a UUID parameter (for example, -appMessagesAddReceiveUpdateHandler: vs appMessagesAddReceiveUpdateHandler:withUUID:).\n *  The methods that do not take a UUID, will use the UUID as set prior to this property.\n *  @param uuid The 16 byte UUID of your app.\n *  @note The UUID needs to be set before using either app message or data logging.\n */\n@property (nonatomic, strong, readwrite) NSData *appUUID;\n\n/**\n *  Verifies the currently set application UUID.\n *  @return YES if the currently set UUID is valid, NO if it is not.\n *  @see -setAppUuid:\n */\n- (BOOL)hasValidAppUUID;\n\n/**\n @returns YES if the Pebble iOS app is installed, NO if it is not installed.\n */\n- (BOOL)isMobileAppInstalled;\n\n/**\n Redirects to Pebble in the App Store, so the user can install the app.\n */\n- (void)installMobileApp;\n\n/**\n Wipes out the data associated with the registered watches, that is stored on the phone.\n */\n- (void)unregisterAllWatches;\n\n/**\n Returns the most recently connected watch from the -registeredWatches array.\n */\n- (PBWatch*)lastConnectedWatch;\n\n@property (nonatomic, readonly) PBDataLoggingService *dataLoggingService;\n\n@end\n\n\n@protocol PBPebbleCentralDelegate <NSObject>\n@optional\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was connected.\n @param isNew YES if the watch has been connected for the first time since the app has been installed or NO if not.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidConnect:(PBWatch*)watch isNew:(BOOL)isNew;\n\n/**\n @param central The Pebble Central responsible for calling the delegate method.\n @param watch The PBWatch object representing the watch that was disconnected.\n */\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidDisconnect:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+AppMessages.h",
    "content": "//\n//  PBWatch+AppMessages.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/20/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\ntypedef NS_ENUM(UInt8, PBAppState) {\n  PBAppStateNotRunning = 0x00,\n  PBAppStateRunning = 0x01,\n};\n\n@interface PBWatch (AppMessages)\n\n/**\n *  Queries the watch whether AppMessages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isAppMessagesSupported YES if AppMessages are supported, NO if not.\n */\n- (void)appMessagesGetIsSupported:(void(^)(PBWatch *watch, BOOL isAppMessagesSupported))fetchedBlock;\n\n/**\n *  Pushes an update to the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Pushes an update to the watch application with the specified UUID.\n *  @param dictionary Contains the key/value pairs to update. The dictionary can only contain items with an NSNumber\n *  key and only contain NSString, NSNumber or NSData values. Use the methods in the NSNumber (stdint) category to\n *  create NSNumbers with specific types standard integer types.\n *  @param onSent The block that will be called when the message was accepted, rejected or timed out.\n *  @param watch The watch to which the update was sent.\n *  @param update The dictionary that was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watchapp to which the update should be sent.\n */\n- (void)appMessagesPushUpdate:(NSDictionary*)dictionary withUUID:(NSData*)uuid onSent:(void(^)(PBWatch *watch, NSDictionary *update, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive;\n\n/**\n *  Add a receive handler for incoming updates that are send by the watch application with the specified UUID.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param update The dictionary containing the values sent by the watch.\n *  @param uuid The UUID of the watchapp for which sent messages should be handled by the onReceive block.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -appMessagesRemoveUpdateHandler:\n *  @see -appMessagesRemoveUpdateHandler:\n */\n- (id)appMessagesAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, NSDictionary *update))onReceive withUUID:(NSData*)uuid;\n\n/**\n *  Add a handler for lifecycle events of watch applications.\n *  @param onLifecycleUpdate This block will be called when an application starts and\n *  stops running.\n *  @param watch The watch that has sent the event.\n *  @param uuid The uuid of the application that caused the event.\n *  @param newAppState The new state of the app (either PBAppStateNotRunning or PBAppStateRunning).\n */\n- (id)appMessagesAddAppLifecycleUpdateHandler:(void(^)(PBWatch *watch, NSUUID *uuid,\n                                                       PBAppState newAppState))onLifecycleUpdate;\n\n\n// INTERNAL USE ONLY\n- (id)appMessagesAddReceiveAllUpdatesHandler:(BOOL(^)(PBWatch *watch, NSUUID *uuid, NSDictionary *update))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -appMessagesAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -appMessagesAddReceiveUpdateHandler:\n *  @see -appMessagesAddReceiveUpdateHandler:\n */\n- (void)appMessagesRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Fetches the run state of the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]. You can use this method to determine whether the watch\n *  application is running or not.\n *  TODO: Ask Francois how this API works.\n *  @param onSent The block that will be called after the fetch state command has been\n *  sent to the watch.\n */\n- (void)appMessagesFetchAppState:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to launch the watch application with the specified UUID.\n *  @param onSent The block that will be called after the launch command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesLaunch:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n/**\n *  Sends a command to kill the watch application with UUID as set using\n *  -[PBPebbleCentral setAppUUID:]\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends a command to kill the watch application with the specified UUID.\n *  @param onSent The block that will be called after the kill command has been\n *  sent to the watch.\n *  @param watch The watch to which the command was sent.\n *  @param error If there was a problem, this will contain information about the underlying problem. See PBError.h for error codes.\n *  @param uuid The UUID of the watch application to launch.\n */\n- (void)appMessagesKill:(void(^)(PBWatch *watch, NSError *error))onSent withUUID:(NSData*)uuid;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+Golf.h",
    "content": "//\n//  PBWatch+Golf.h\n//  PebbleKit\n//\n//  Created by Martijn The on 4/4/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n@interface PBWatch (Golf)\n\n/**\n *  The UUID of the Golf watch app.\n */\nextern NSData *PBGolfUUID;\n\n/**\n *  The key of the \"Front\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfFrontKey;\n\n/**\n *  The key of the \"Mid\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfMidKey;\n\n/**\n *  The key of the \"Back\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfBackKey;\n\n/**\n *  The key of the \"Hole\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfHoleKey;\n\n/**\n *  The key of the \"Par\" field.\n *  The accompanying value must be an NSString (max. ~5 characters).\n *  @see -golfAppUpdate:onSent:\n */\nextern NSNumber *PBGolfParKey;\n\n/**\n *  The command IDs that can be sent back by the Golf watch app.\n *  @see -golfAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  GolfAppCommandPrevious = 0x01,\n  GolfAppCommandNext = 0x02,\n  GolfAppCommandSelect = 0x03,\n} GolfAppCommand;\n\n/**\n *  Queries the watch whether Golf Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isGolfSupported YES if Golf Messages are supported, NO if not.\n */\n- (void)golfGetIsSupported:(void(^)(PBWatch *watch, BOOL isGolfSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the golf app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends an update to the golf app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey, PBGolfParKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n *  @see PBGolfFrontKey, PBGolfMidKey, PBGolfBackKey, PBGolfHoleKey and PBGolfParKey\n */\n- (void)golfAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Golf updates that are send by the Golf watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param command The command as sent by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -golfAppRemoveUpdateHandler:\n *  @see GolfAppCommand\n *  @see -golfAppRemoveUpdateHandler:\n */\n- (id)golfAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, GolfAppCommand command))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -golfAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -golfAppAddReceiveUpdateHandler:\n *  @see -golfAppAddReceiveUpdateHandler:\n */\n- (void)golfAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the golf app on the watch.\n *  @discussion It is recommended to perform this as the first call after -golfGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)golfSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+Ping.h",
    "content": "//\n//  PBWatch+Ping.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/14/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n@interface PBWatch (Ping)\n\n/**\n * Sends a ping to the watch.\n * @param cookie A number identifying the ping.\n * @param onPong The block handler that will be called when the \"pong\" reply from the watch has been received.\n * @param watch The watch that sent the \"pong\" reply, which is \"self\". It is passed in to avoid retain loops.\n * @param cookie The cookie that was initially passed when calling this method.\n * @param onTimeout The block handler that will be called when the watch failed to reply in time.\n */\n- (void)pingWithCookie:(UInt32)cookie onPong:(void(^)(PBWatch *watch, UInt32 cookie))onPong onTimeout:(void(^)(PBWatch *watch, UInt32 cookie))onTimeout;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+PollServices.h",
    "content": "//\n//  PBWatch+PollServices.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n * PollServiceType\n */ \n\n\nenum {\n  PBPollRemoteServiceMail = 0,\n  PBPollRemoteServiceDataLogging = 1,\n  PBNumPollRemoteServices\n};\ntypedef UInt8 PBPollRemoteServiceType;\n\n@interface PBWatch (PollServices)\n// Call this upon connect with the watch to add handlers:\n- (id)addPollServicesHandler:(void(^)(PBWatch *))handler forService:(PBPollRemoteServiceType)service interval:(UInt8)interval;\n- (void)sendPollRequestForService:(PBPollRemoteServiceType)service;\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+Sports.h",
    "content": "//\n//  PBWatch+Sports.h\n//  PebbleKit\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n#import <UIKit/UIKit.h>\n\n/**\n *  The UUID of the Sports watch app.\n */\nextern NSData *PBSportsUUID;\n\n/**\n *  The key of the \"Time\" field.\n *  The accompanying value must be an NSString (max. ~8 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsTimeKey;\n\n/**\n *  The key of the \"Distance\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDistanceKey;\n\n/**\n *  The key of the general purpose \"Data\" field.\n *  The value must be an NSString (max. ~5 characters).\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsDataKey;\n\n/**\n *  The key of the \"Activity State\".\n *  The value must be an NSNumber created using +[NSNumber numberWithUint8:].\n *  @see SportsAppActivityState for valid values to use\n *  @see -sportsAppUpdate:onSent:\n *  @see PBSportsUpdate\n */\nextern NSNumber *PBSportsActivityStateKey;\n\n/**\n *  Instances of this convenience class represent an update of the current time, distance and pace,\n *  and has a method to convert the values into a dictionary that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n@interface PBSportsUpdate : NSObject\n\n/**\n *  The current time in seconds. The possible range is currently limited from -7140. to 7140., inclusive. (±1h 59min 59sec).\n */\n@property (nonatomic, readwrite, assign) NSTimeInterval time;\n\n/**\n *  The current distance in km or mi. The possible range is currently limited from -99.9 to 99.9, inclusive.\n *  The unit of distance is dependent on the current unit setting.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float distance;\n\n/**\n *  General purpose data variable. The possible range is currently limited from -99.99 to 99.99, inclusive.\n *  @see -sportsAppSetMetric:onSent:\n */\n@property (nonatomic, readwrite, assign) float data;\n\n/**\n *  Convenience method to create an update object.\n */\n+ (PBSportsUpdate*)updateWithTime:(NSTimeInterval)time distance:(float)distance data:(float)data;\n\n/**\n *  Creates an update dictionary from the receiver, that can be used with -sportsAppUpdate:onSent:.\n *  @see -sportsAppUpdate:onSent:\n */\n- (NSDictionary*)dictionary;\n\n/**\n *  Creates a formatted time string with from a total seconds value, formatted as \"h:mm:ss\".\n *  For example, supplying the value 3930.0f seconds will return @\"1:05:30\"\n *  @param seconds The number of seconds from which to create the time string.\n *  @return Formatted time as \"h:mm:ss\"\n */\n+ (NSString*)timeStringFromFloat:(float)seconds;\n\n@end\n\n@interface PBWatch (Sports)\n\n/**\n *  The state of the Sports activity.\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\ntypedef enum {\n  SportsAppActivityStateInit = 0x00,\n  SportsAppActivityStateRunning = 0x01,\n  SportsAppActivityStatePaused = 0x02,\n  SportsAppActivityStateEnd = 0x03,\n} SportsAppActivityState;\n\n/**\n *  Queries the watch whether Sports Messages are supported.\n *  @param fetchedBlock The block that will be called whenthe inquiry has finished. The fetchedBlock will be called\n *  asynchronously on the queue that was originally used when calling this method.\n *  @param watch The watch on which the query was performed.\n *  @param isSportsSupported YES if Sports Messages are supported, NO if not.\n */\n- (void)sportsGetIsSupported:(void(^)(PBWatch *watch, BOOL isSportsSupported))fetchedBlock;\n\n/**\n *  Send a command to launch the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the launch command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppLaunch:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to kill the sports app on the watch that the receiver represents.\n *  @param onSent The handler that will be called when the kill command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppKill:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the preferred\n *  unit system, either metric or imperial.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetMetric:(BOOL)isMetric onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents,\n *  to set the preferred  data label (either PACE or SPEED) and corresponding units.\n *  @param isMetric YES to request metric units or NO to request imperial units\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetLabel:(BOOL)isPace onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Send a command to the sports app on the watch that the receiver represents, to set the state of the\n *  sports activity. Currently only SportsAppActivityStateRunning and SportsAppActivityStatePaused are\n *  supported.\n *  @param state The new sports activity state\n *  @param onSent The handler that will be called when the unit command has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppSetActivityState:(SportsAppActivityState)state onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Sends the update to the sports app on the watch that the receiver represents.\n *  @param update The update to send. Use one or more keys (PBSportsTimeKey, PBSportsPaceKey, PBSportsDistanceKey)\n *  note that the value for each key MUST be of NSString type.\n *  @param onSent The handler that will be called when the update has been sent or timed out (after 1.5 secs).\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsAppUpdate:(NSDictionary*)update onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n/**\n *  Add a receive handler for incoming Sports updates that are send by the Sports watch application.\n *  @param onReceive The block that will be called every time a new update message arrives.\n *  @param watch The watch that has sent the update.\n *  @param state The new sports activity state as set by the watch.\n *  @return An opaque handle object representing the installed receive handler, that can be used in -sportsAppRemoveUpdateHandler:\n *  @see SportsAppActivityState\n *  @see -sportsAppRemoveUpdateHandler:\n */\n- (id)sportsAppAddReceiveUpdateHandler:(BOOL(^)(PBWatch *watch, SportsAppActivityState state))onReceive;\n\n/**\n *  Removes a receive handler that was previously installed using -sportsAppAddReceiveUpdateHandler:\n *  @param opaqueHandle The handle object as returned by -sportsAppAddReceiveUpdateHandler:\n *  @see -sportsAppAddReceiveUpdateHandler:\n */\n- (void)sportsAppRemoveUpdateHandler:(id)opaqueHandle;\n\n/**\n *  Assigns a custom title and icon to the sports app on the watch.\n *  @discussion It is recommended to perform this as the first call after -sportsGetIsSupported:\n *  to avoid changing the title and icon while it is being displayed in the menu as to avoid confusion.\n *  @param title The custom title (max. 20 bytes of UTF-8 string)\n *  @param icon The custom icon (max. 32x32 pixels, black/white only)\n *  @param onSent The handler that will be called when the title and icon have been set or timed out.\n *  @param watch The watch on which the custom title and icon have been set.\n *  @param error nil if the operation was successful, or else an NSError with more information why it failed.\n */\n- (void)sportsSetTitle:(NSString*)title icon:(UIImage*)icon onSent:(void(^)(PBWatch *watch, NSError *error))onSent;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch+Version.h",
    "content": "//\n//  PBWatch+Version.h\n//  PebbleKit\n//\n//  Created by Martijn The on 9/17/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <PebbleKit/PebbleKit.h>\n\n/**\n *  PBFirmwareVersion is a helper class that is able to parse the versionTag string\n *  into its components (os, major, minor, suffix) and facilitate comparisons\n *  between versions.\n *  Valid versions follow the following format:\n *  `vOS(.MAJOR(.MINOR(-SUFFIX)))`\n *  Where the fields OS, MAJOR, MINOR are positive, decimal integer numbers and SUFFIX\n *  an arbitrary string. MAJOR, MINOR and SUFFIX are optional (nested optionality).\n *  Examples of valid versions:\n *  `v1`\n *  `v2.1234.99-alpha-beta-gamma`\n */\n@interface PBFirmwareVersion : NSObject\n/**\n *  The OS version component.\n */\n@property (nonatomic, readonly) NSInteger os;\n\n/**\n *  The major version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger major;\n\n/**\n *  The minor version component.\n *  @note If a version tag string does not contain a major component, it will be set to 0.\n */\n@property (nonatomic, readonly) NSInteger minor;\n\n/**\n *  The release suffix, which is the part following the dash '-'.\n *  @note If a version tag string does not contain a suffix, it will be set to an empty string.\n *  @discussion The release suffix is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *suffix;\n\n/**\n *  The version timestamp.\n *  @note The timestamp is in the final comparison equation, in the -compare: method, after evaluating\n *  os, major and minor components.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The version's git commit hash.\n *  @discussion The commit hash is not used in the -compare: method.\n */\n@property (nonatomic, readonly, copy) NSString *commitHash;\n\n/**\n *  The version's git tag.\n */\n@property (nonatomic, readonly, copy) NSString *tag;\n\n/**\n *  Creates a PBFirmwareVersion object given a tag string and timestamp.\n */\n+ (PBFirmwareVersion*)firmwareVersionWithTag:(NSString*)tag commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Creates a PBFirmwareVersion object given its components.\n *  @discussion The tag string will be set to the canonical format vOS.MINOR.MAJOR(-SUFFIX).\n */\n+ (PBFirmwareVersion*)firmwareVersionWithOS:(NSInteger)os major:(NSInteger)major minor:(NSInteger)minor suffix:(NSString*)suffix commitHash:(NSString*)commitHash timestamp:(UInt32)timestamp;\n\n/**\n *  Compares the receiver to another version object.\n *  @param aVersion The version to compare with the receiver.\n *  @return NSOrderedAscending if the value of aVersion is greater than the receiver’s,\n *  NSOrderedSame if they’re equal, and NSOrderedDescending if the value of aVersion is less than the receiver’s.\n */\n- (NSComparisonResult)compare:(PBFirmwareVersion *)aVersion;\n\n/**\n *  Convenience wrappers around -compare:\n */\n- (BOOL)isEqualOrNewer:(PBFirmwareVersion *)other;\n- (BOOL)isNewer:(PBFirmwareVersion *)other;\n- (BOOL)isEqualVersionOnly:(PBFirmwareVersion *)other;\n\n@end\n\n\n\n/**\n *  Values specifying the Pebble hardware platform variant.\n */\ntypedef enum {\n  FirmwareMetadataPlatformUnknown = 0,\n  FirmwareMetadataPlatformPebbleOneEV1 = 1,\n  FirmwareMetadataPlatformPebbleOneEV2 = 2,\n  FirmwareMetadataPlatformPebbleOneEV2_3 = 3,\n  FirmwareMetadataPlatformPebbleOneEV2_4 = 4,\n  FirmwareMetadataPlatformPebbleOnePointFive = 5,\n  FirmwareMetadataPlatformPebbleTwoPointZero = 6,\n  FirmwareMetadataPlatformPebbleOneBigboard = 0xff,\n  FirmwareMetadataPlatformPebbleOneBigboard2 = 0xfe,\n} FirmwareMetadataPlatform;\n\n/**\n *  Instances of PBFirmwareMetadata describe a firmware in terms of\n *  its version, whether it is a recovery firmware and its intended hardware\n *  platform.\n *  @see PBVersionInfo\n */\n\n@interface PBFirmwareMetadata : NSObject\n\n/**\n *  The version of the firmware.\n *  @see PBFirmwareVersion\n */\n@property (nonatomic, readonly) PBFirmwareVersion *version;\n\n/**\n *  YES if the firmware is a recovery firmware, NO if it is a regular firmware.\n */\n@property (nonatomic, readonly) BOOL isRecoveryFirmware;\n\n/**\n *  The hardware platform variant with which the firmware is compatible.\n */\n@property (nonatomic, readonly) FirmwareMetadataPlatform hardwarePlatform;\n\n/**\n *  Converts a <FirmwareMetadataPlatform> value to a string.\n *  @param hardwarePlatform The hardware platform value to convert\n *  @return A string of the hardware platform\n */\n+ (NSString*)hardwarePlatformToString:(FirmwareMetadataPlatform)hardwarePlatform;\n\n/**\n *  Converts an NSString hardware platform string to the corresponding\n *  FirmwareMetadataPlatform value.\n *  @param hardwarePlatformString The string representing the hardware platform.\n *  @return The hardware platform enum value\n */\n+ (FirmwareMetadataPlatform)stringToHardwarePlatform:(NSString *)hardwarePlatformString;\n\n@end\n\n/**\n *  Instances of PBResourceMetadata describe (system) resources.\n *  @see PBVersionInfo\n */\n\n@interface PBResourceMetadata : NSObject\n\n/**\n *  The version of the resources as the Epoch timestamp of the Git commit.\n */\n@property (nonatomic, readonly) UInt32 timestamp;\n\n/**\n *  The checksum of the resources.\n */\n@property (nonatomic, readonly) UInt32 crc;\n\n/**\n *  The human-friendly string version of the resources.\n */\n@property (nonatomic, readonly, strong) NSString *friendlyVersion;\n\n/**\n *  YES if the metadata represents valid resources, NO if it does not.\n */\n- (BOOL)isValid;\n\n@end\n\n/**\n *  An instance of PBVersionInfo describes all the different system software (Pebble OS)\n *  on a Pebble watch and other auxiliary information.\n *  @see PBWatch\n */\n\n@interface PBVersionInfo : NSObject\n\n/**\n *  The metadata of the firmware that is running.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *runningFirmwareMetadata;\n\n/**\n *  The metadata of the recovery firmware that is in storage.\n */\n@property (nonatomic, readonly, strong) PBFirmwareMetadata *recoveryFirmwareMetadata;\n\n/**\n *  The metadata of the system resources.\n */\n@property (nonatomic, readonly, strong) PBResourceMetadata *systemResources;\n\n/**\n *  The version of the bootloader.\n */\n@property (nonatomic, readonly) UInt32 bootloaderVersion;\n\n/**\n *  The version of the hardware.\n */\n@property (nonatomic, readonly, strong) NSString *hardwareVersion;\n\n/**\n *  The serial number.\n */\n@property (nonatomic, readonly, strong) NSString *serialNumber;\n\n/**\n *  The current Bluetooth device address.\n */\n@property (nonatomic, readonly, strong) NSData *deviceAddress;\n\n/**\n *  YES if valid recovery firmware is installed, NO if not.\n */\n- (BOOL)hasRecoveryFirmware;\n\n/**\n *  YES if valid system resources are installed, NO if not.\n */\n- (BOOL)hasSystemResources;\n\n@end\n\n@interface PBWatch (Version)\n\n/**\n *  Requests the version info from the receiver.\n *  @param handler The handler that will be called when the version info response has been received.\n *  @param onTimeout The handler that will be called if the watch did not respond within 5 seconds.\n *  @param watch The watch for which the version info was requested.\n *  @param versionInfo The version info response.\n *  @discussion The <PBVersionInfo> response will be cached. The latest version info can be\n *  accessed through the <versionInfo> property of <PBWatch>.\n */\n- (void)getVersionInfo:(void (^)(PBWatch *watch, PBVersionInfo *versionInfo))handler onTimeout:(void (^)(PBWatch *watch))onTimeout;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PBWatch.h",
    "content": "//\n//  PBWatch.h\n//  PebbleSDK-iOS\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@protocol PBWatchDelegate;\n@class PBVersionInfo;\n@class PBDataLoggingService;\n\n/**\n *  Represents a Pebble watch.\n *\n *  On iOS, there is the notion of a \"communication session\" between an app and\n *  the Pebble watch. You can imagine this as a \"data pipe\" directly from the\n *  watch to your app. However, there is only one session for 3rd party apps.\n *  This one session has to be shared among all 3rd party apps that want to\n *  communicate with Pebble (excluding the official Pebble iOS app).\n *\n *  Unfortunately, the session can only be opened from the phone app. This means\n *  that the iOS app has to start talking to the watch first to open the\n *  communications channel; the other way around is not possible.\n *  Most methods in the PBWatch categories (Ping), (Version), (Sports), (Golf)\n *  and (AppMessages) all implicitly open the shared communication session.\n *\n *  Lastly, iOS provides no good way to manage how the one shared session is\n *  accessed or used. Simply, the last iOS app to try to open it, wins and gets\n *  to use it. Therefore, it is important that your iOS app does **not** try\n *  communicate when a Pebble is connected.\n *\n *  When the user has stopped using your app (e.g. when going to the background\n *  or when explicitely stopping a certain activity in the app) your iOS app\n *  should close the communication session using the -closeSession: method.\n */\n@interface PBWatch : NSObject\n\n/**\n *  YES if the receiver is connected and NO if the receiver is disconnected.\n *  @discussion This property is KVO-compliant.\n */\n@property (nonatomic, readonly, getter=isConnected) BOOL connected;\n\n/**\n *  The human-friendly name of the receiver.\n *  This is the same name as the user will see in the iOS Bluetooth Settings.\n */\n@property (nonatomic, readonly) NSString *name;\n\n/**\n *  The serial number of the receiver.\n */\n@property (nonatomic, readonly) NSString *serialNumber;\n\n/**\n *  The versionInfo of the receiver.\n *  @see PBVersionInfo\n */\n@property (nonatomic, readonly) PBVersionInfo *versionInfo;\n\n/**\n *  The delegate of the watch that will be notified of disconnections and errors.\n *  @see PBWatchDelegate\n */\n@property (nonatomic, readwrite, weak) id<PBWatchDelegate> delegate;\n\n/**\n *  The userInfo property can be used to associate application specific data\n *  with the watch. Note that the application itself is responsible for persisting\n *  the information if neccessary.\n */\n@property (nonatomic, readwrite, strong) id userInfo;\n\n/**\n *  The date when the watch was last known to be connected.\n *  This date will be updated automatically when the watch connects and\n *  disconnects. While the watch is being connected, this date will not be updated.\n */\n@property (nonatomic, readonly) NSDate *lastConnectedDate;\n\n/**\n *  Developer-friendly debugging description of the watch.\n *  @return localized, user-friendly summary of the receiver, including\n *  software and hardware version information, if available.\n */\n- (NSString*)friendlyDescription;\n\n/**\n *  Closes the communication session with the watch.\n *  Since there is only one, shared session for all 3rd party iOS apps,\n *  an app should close the session after the user is done using the app/watch-integration,\n *  so it can be used by other apps.\n *  The communication session is implicitely opened automatically when needed.\n *  @param onDone Callback block that will be called after the closing of the session\n *  has completed. If there is no open session, the onDone block will (also) be executed\n *  asynchronously on the calling queue.\n */\n- (void)closeSession:(void(^)(void))onDone;\n\n@end\n\n@protocol PBWatchDelegate <NSObject>\n@optional\n\n/**\n *  Called when the watch got disconnected.\n */\n- (void)watchDidDisconnect:(PBWatch*)watch;\n\n/**\n *  Called when the watch caught an error.\n */\n- (void)watch:(PBWatch*)watch handleError:(NSError*)error;\n\n/**\n *  Called when the internal EASession is about to be reset.\n */\n- (void)watchWillResetSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is opened\n */\n- (void)watchDidOpenSession:(PBWatch*)watch;\n\n/**\n *  Called when the internal EASession is closed\n */\n- (void)watchDidCloseSession:(PBWatch*)watch;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/PebbleKit.h",
    "content": "//\n//  PebbleSDK.h\n//  PebbleSDK\n//\n//  Created by Martijn Thé on 4/24/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#import <PebbleKit/PBWatch.h>\n#import <PebbleKit/PBPebbleCentral.h>\n#import <PebbleKit/PBWatch+Ping.h>\n#import <PebbleKit/PBWatch+Version.h>\n#import <PebbleKit/PBErrors.h>\n#import <PebbleKit/PBWatch+AppMessages.h>\n#import <PebbleKit/NSNumber+stdint.h>\n#import <PebbleKit/PBWatch+Sports.h>\n#import <PebbleKit/PBWatch+Golf.h>\n#import <PebbleKit/PBBitmap.h>\n#import <PebbleKit/PBDataLoggingService.h>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleKit.framework/Versions/Current/Headers/gtypes.h",
    "content": "//\n//  gtypes.h\n//  PebbleKit\n//\n//  Created by Martijn The on 3/24/13.\n//  Copyright (c) 2013 Pebble Technology. All rights reserved.\n//\n\n#ifndef PebbleKit_gtypes_h\n#define PebbleKit_gtypes_h\n\ntypedef struct GSize {\n  int16_t w;\n  int16_t h;\n} GSize;\n\ntypedef struct GPoint {\n  int16_t x;\n  int16_t y;\n} GPoint;\n\ntypedef struct GRect {\n  GPoint origin;\n  GSize size;\n} GRect;\n\n#endif\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/CHMultiDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMultiDictionary.h\n \n Copyright (c) 2008-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n#import \"CHMutableDictionary.h\"\n\n/**\n @file CHMultiDictionary.h\n \n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> in which multiple values may be associated with a given key.\n */\n\n/**\n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> implementation, in which multiple values may be associated with a given key.\n \n A map is the same as a \"dictionary\", \"associative array\", etc. and consists of a unique set of keys and a collection of values. In a standard map, each key is associated with one value; in a multimap, more than one value may be associated with a given key. A multimap is appropriate for any situation in which one item may correspond to (map to) multiple values, such as a term in an book index and occurrences of that term, courses for which a student is registered, etc.\n \n The values for a key may or may not be ordered. This implementation does not maintain an ordering for objects associated with a key, nor does it allow for multiple occurrences of an object associated with the same key. Internally, this class uses an NSMutableDictionary, and the associated values for each key are stored in distinct NSMutableSet instances. (Just as with NSDictionary, each key added to a CHMultiDictionary is copied using \\link NSCopying#copyWithZone: -copyWithZone:\\endlink and all keys must conform to the NSCopying protocol.) Objects are retained on insertion and released on removal or deallocation.\n \n Since NSDictionary and NSSet conform to the NSCoding protocol, any internal data can be serialized. However, NSSet cannot automatically be written to or read from a property list, since it has no specified order. Thus, instances of CHMultiDictionary must be encoded as an NSData object before saving to disk.\n \n Currently, this implementation does not support key-value coding, observing, or binding like NSDictionary does. Consequently, the distinction between \"object\" and \"value\" is blurrier, although hopefully consistent with the Cocoa APIs in general....\n \n Unlike NSDictionary and other Cocoa collections, CHMultiDictionary has not been designed with mutable and immutable variants. A multimap is not that much more useful if it is immutable, so any copies made of this class are mutable by definition.\n */\n@interface CHMultiDictionary : CHMutableDictionary {\n\tNSUInteger objectCount; // Number of objects currently in the dictionary.\n}\n\n#pragma mark Querying Contents\n\n/**\n Returns the number of objects in the receiver, associated with any key.\n \n @return The number of objects in the receiver. This is the sum total of objects associated with each key in the dictonary.\n \n @see allObjects\n */\n- (NSUInteger) countForAllKeys;\n\n/**\n Returns the number of objects associated with a given key.\n \n @param aKey The key for which to return the object count.\n @return The number of objects associated with a given key in the dictionary.\n \n @see objectsForKey:\n */\n- (NSUInteger) countForKey:(id)aKey;\n\n/**\n Returns an array of objects associated with a given key.\n \n @param aKey The key for which to return the corresponding objects.\n @return An NSSet of objects associated with a given key, or nil if the key is not in the receiver.\n \n @see countForKey:\n @see removeObjectsForKey:\n */\n- (NSSet*) objectsForKey:(id)aKey;\n\n#pragma mark Modifying Contents\n\n/**\n Adds a given object to an entry for a given key in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param anObject An object to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#addObject: -[NSMutableSet addObject:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObject:(id)anObject forKey:(id)aKey;\n\n/**\n Adds the given object(s) to a key entry in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param objectSet A set of objects to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#unionSet: -[NSMutableSet unionSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n/**\n Remove @b all occurrences of @a anObject associated with a given key.\n \n @param aKey The key for which to remove an entry.\n @param anObject An object (possibly) associated with @a aKey in the receiver. Objects are considered to be equal if -compare: returns NSOrderedSame.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n If @a aKey does not exist in the receiver, or if @a anObject is not associated with @a aKey, the contents of the receiver are not modified.\n \n @see containsObject\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) removeObject:(id)anObject forKey:(id)aKey;\n\n/**\n Remove a given key and its associated value(s) from the receiver.\n \n @param aKey The key for which to remove an entry.\n \n If @a aKey does not exist in the receiver, there is no effect on the receiver.\n \n @see objectsForKey:\n @see removeObject:forKey:\n */\n- (void) removeObjectsForKey:(id)aKey;\n\n/**\n Sets the object(s) associated with a key entry in the receiver.\n \n @param aKey The key with which to associate the objects in @a objectSet.\n @param objectSet A set of objects to associate with @a key. If @a objectSet is empty, the contents of the receiver are not modified. If an entry for @a key already exists in the receiver, @a objectSet is added using \\link NSMutableSet#setSet: -[NSMutableSet setSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) setObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/CHMutableDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMutableDictionary.h\n \n Copyright (c) 2009-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n__attribute__((visibility(\"hidden\"))) void createCollectableCFMutableDictionary(CFMutableDictionaryRef* dictionary, NSUInteger initialCapacity);\n\n/**\n @file CHMutableDictionary.h\n \n A mutable dictionary class.\n */\n\n/**\n A mutable dictionary class.\n \n A CFMutableDictionaryRef is used internally to store the key-value pairs. Subclasses may choose to add other instance variables to enable a specific ordering of keys, override methods to modify behavior, and add methods to extend existing behaviors. However, all subclasses should behave like a standard Cocoa dictionary as much as possible, and document clearly when they do not.\n \n @note Any method inherited from NSDictionary or NSMutableDictionary is supported by this class and its children. Please see the documentation for those classes for details.\n \n @todo Implement @c -copy and @c -mutableCopy differently (so users can actually obtain an immutable copy) and make mutation methods aware of immutability?\n */\n@interface CHMutableDictionary : NSMutableDictionary {\n  CFMutableDictionaryRef dictionary; // A Core Foundation dictionary.\n}\n\n- (id) initWithCapacity:(NSUInteger)numItems;\n\n- (NSUInteger) count;\n- (NSEnumerator*) keyEnumerator;\n- (id) objectForKey:(id)aKey;\n- (void) removeAllObjects;\n- (void) removeObjectForKey:(id)aKey;\n- (void) setObject:(id)anObject forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/DDASLLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import <asl.h>\n\n#import \"DDLog.h\"\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for the Apple System Log facility.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log\n * - StdErr (if stderr is a TTY) so log statements show up in Xcode console\n * \n * To duplicate NSLog() functionality you can simply add this logger and a tty logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use a file logger and a tty logger.\n**/\n\n@interface DDASLLogger : DDAbstractLogger <DDLogger>\n{\n    aslclient client;\n}\n\n+ (instancetype)sharedInstance;\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/DDFileLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"DDLog.h\"\n\n@class DDLogFileInfo;\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger to write log statements to a file.\n**/\n\n\n// Default configuration and safety/sanity values.\n// \n// maximumFileSize         -> DEFAULT_LOG_MAX_FILE_SIZE\n// rollingFrequency        -> DEFAULT_LOG_ROLLING_FREQUENCY\n// maximumNumberOfLogFiles -> DEFAULT_LOG_MAX_NUM_LOG_FILES\n// \n// You should carefully consider the proper configuration values for your application.\n\n#define DEFAULT_LOG_MAX_FILE_SIZE     (1024 * 1024)   //  1 MB\n#define DEFAULT_LOG_ROLLING_FREQUENCY (60 * 60 * 24)  // 24 Hours\n#define DEFAULT_LOG_MAX_NUM_LOG_FILES (5)             //  5 Files\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// The LogFileManager protocol is designed to allow you to control all aspects of your log files.\n// \n// The primary purpose of this is to allow you to do something with the log files after they have been rolled.\n// Perhaps you want to compress them to save disk space.\n// Perhaps you want to upload them to an FTP server.\n// Perhaps you want to run some analytics on the file.\n// \n// A default LogFileManager is, of course, provided.\n// The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property.\n// \n// This protocol provides various methods to fetch the list of log files.\n// \n// There are two variants: sorted and unsorted.\n// If sorting is not necessary, the unsorted variant is obviously faster.\n// The sorted variant will return an array sorted by when the log files were created,\n// with the most recently created log file at index 0, and the oldest log file at the end of the array.\n// \n// You can fetch only the log file paths (full path including name), log file names (name only),\n// or an array of DDLogFileInfo objects.\n// The DDLogFileInfo class is documented below, and provides a handy wrapper that\n// gives you easy access to various file attributes such as the creation date or the file size.\n\n@protocol DDLogFileManager <NSObject>\n@required\n\n// Public properties\n\n/**\n * The maximum number of archived log files to keep on disk.\n * For example, if this property is set to 3,\n * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk.\n * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted.\n * \n * You may optionally disable deleting old/rolled/archived log files by setting this property to zero.\n**/\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n// Public methods\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n// Private methods (only to be used by DDFileLogger)\n\n- (NSString *)createNewLogFile;\n\n@optional\n\n// Notifications from DDFileLogger\n\n- (void)didArchiveLogFile:(NSString *)logFilePath;\n- (void)didRollAndArchiveLogFile:(NSString *)logFilePath;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Default log file manager.\n * \n * All log files are placed inside the logsDirectory.\n * If a specific logsDirectory isn't specified, the default directory is used.\n * On Mac, this is in ~/Library/Logs/<Application Name>.\n * On iPhone, this is in ~/Library/Caches/Logs.\n * \n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n * \n * Archived log files are automatically deleted according to the maximumNumberOfLogFiles property.\n**/\n@interface DDLogFileManagerDefault : NSObject <DDLogFileManager>\n{\n    NSUInteger maximumNumberOfLogFiles;\n    NSString *_logsDirectory;\n}\n\n- (id)init;\n- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory;\n\n/*\n * Methods to override.\n *\n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n *\n * If you wish to change default filename, you can override following two methods.\n * - newLogFileName method would be called on new logfile creation.\n * - isLogFile: method would be called to filter logfiles from all other files in logsDirectory.\n *   You have to parse given filename and return YES if it is logFile.\n *\n * **NOTE**\n * newLogFileName returns filename. If appropriate file already exists, number would be added\n * to filename before extension. You have to handle this case in isLogFile: method.\n *\n * Example:\n * - newLogFileName returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 2.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03 1.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 3.log\" would be created.\n**/\n- (NSString *)newLogFileName;\n- (BOOL)isLogFile:(NSString *)fileName;\n\n/* Inherited from DDLogFileManager protocol:\n\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n*/\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Most users will want file log messages to be prepended with the date and time.\n * Rather than forcing the majority of users to write their own formatter,\n * we will supply a logical default formatter.\n * Users can easily replace this formatter with their own by invoking the setLogFormatter method.\n * It can also be removed by calling setLogFormatter, and passing a nil parameter.\n * \n * In addition to the convenience of having a logical default formatter,\n * it will also provide a template that makes it easy for developers to copy and change.\n**/\n@interface DDLogFileFormatterDefault : NSObject <DDLogFormatter>\n{\n    NSDateFormatter *dateFormatter;\n}\n\n- (id)init;\n- (instancetype)initWithDateFormatter:(NSDateFormatter *)dateFormatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDFileLogger : DDAbstractLogger <DDLogger>\n{\n    __strong id <DDLogFileManager> logFileManager;\n    \n    DDLogFileInfo *currentLogFileInfo;\n    NSFileHandle *currentLogFileHandle;\n    \n    dispatch_source_t currentLogFileVnode;\n    dispatch_source_t rollingTimer;\n    \n    unsigned long long maximumFileSize;\n    NSTimeInterval rollingFrequency;\n}\n\n- (id)init;\n- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)logFileManager;\n\n/**\n * Log File Rolling:\n * \n * maximumFileSize:\n *   The approximate maximum size to allow log files to grow.\n *   If a log file is larger than this value after a log statement is appended,\n *   then the log file is rolled.\n * \n * rollingFrequency\n *   How often to roll the log file.\n *   The frequency is given as an NSTimeInterval, which is a double that specifies the interval in seconds.\n *   Once the log file gets to be this old, it is rolled.\n * \n * Both the maximumFileSize and the rollingFrequency are used to manage rolling.\n * Whichever occurs first will cause the log file to be rolled.\n * \n * For example:\n * The rollingFrequency is 24 hours,\n * but the log file surpasses the maximumFileSize after only 20 hours.\n * The log file will be rolled at that 20 hour mark.\n * A new log file will be created, and the 24 hour timer will be restarted.\n * \n * You may optionally disable rolling due to filesize by setting maximumFileSize to zero.\n * If you do so, rolling is based solely on rollingFrequency.\n * \n * You may optionally disable rolling due to time by setting rollingFrequency to zero (or any non-positive number).\n * If you do so, rolling is based solely on maximumFileSize.\n * \n * If you disable both maximumFileSize and rollingFrequency, then the log file won't ever be rolled.\n * This is strongly discouraged.\n**/\n@property (readwrite, assign) unsigned long long maximumFileSize;\n@property (readwrite, assign) NSTimeInterval rollingFrequency;\n\n/**\n * The DDLogFileManager instance can be used to retrieve the list of log files,\n * and configure the maximum number of archived log files to keep.\n * \n * @see DDLogFileManager.maximumNumberOfLogFiles\n**/\n@property (strong, nonatomic, readonly) id <DDLogFileManager> logFileManager;\n\n\n// You can optionally force the current log file to be rolled with this method.\n// CompletionBlock will be called on main queue.\n\n- (void)rollLogFileWithCompletionBlock:(void (^)())completionBlock;\n\n// Method is deprecated. Use rollLogFileWithCompletionBlock: method instead.\n\n- (void)rollLogFile __attribute((deprecated));\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * DDLogFileInfo is a simple class that provides access to various file attributes.\n * It provides good performance as it only fetches the information if requested,\n * and it caches the information to prevent duplicate fetches.\n * \n * It was designed to provide quick snapshots of the current state of log files,\n * and to help sort log files in an array.\n * \n * This class does not monitor the files, or update it's cached attribute values if the file changes on disk.\n * This is not what the class was designed for.\n * \n * If you absolutely must get updated values,\n * you can invoke the reset method which will clear the cache.\n**/\n@interface DDLogFileInfo : NSObject\n{\n    __strong NSString *filePath;\n    __strong NSString *fileName;\n    \n    __strong NSDictionary *fileAttributes;\n    \n    __strong NSDate *creationDate;\n    __strong NSDate *modificationDate;\n    \n    unsigned long long fileSize;\n}\n\n@property (strong, nonatomic, readonly) NSString *filePath;\n@property (strong, nonatomic, readonly) NSString *fileName;\n\n@property (strong, nonatomic, readonly) NSDictionary *fileAttributes;\n\n@property (strong, nonatomic, readonly) NSDate *creationDate;\n@property (strong, nonatomic, readonly) NSDate *modificationDate;\n\n@property (nonatomic, readonly) unsigned long long fileSize;\n\n@property (nonatomic, readonly) NSTimeInterval age;\n\n@property (nonatomic, readwrite) BOOL isArchived;\n\n+ (instancetype)logFileWithPath:(NSString *)filePath;\n\n- (instancetype)initWithFilePath:(NSString *)filePath;\n\n- (void)reset;\n- (void)renameFile:(NSString *)newFileName;\n\n#if TARGET_IPHONE_SIMULATOR\n\n// So here's the situation.\n// Extended attributes are perfect for what we're trying to do here (marking files as archived).\n// This is exactly what extended attributes were designed for.\n// \n// But Apple screws us over on the simulator.\n// Everytime you build-and-go, they copy the application into a new folder on the hard drive,\n// and as part of the process they strip extended attributes from our log files.\n// Normally, a copy of a file preserves extended attributes.\n// So obviously Apple has gone to great lengths to piss us off.\n// \n// Thus we use a slightly different tactic for marking log files as archived in the simulator.\n// That way it \"just works\" and there's no confusion when testing.\n// \n// The difference in method names is indicative of the difference in functionality.\n// On the simulator we add an attribute by appending a filename extension.\n// \n// For example:\n// log-ABC123.txt -> log-ABC123.archived.txt\n\n- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName;\n\n- (void)addExtensionAttributeWithName:(NSString *)attrName;\n- (void)removeExtensionAttributeWithName:(NSString *)attrName;\n\n#else\n\n// Normal use of extended attributes used everywhere else,\n// such as on Macs and on iPhone devices.\n\n- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName;\n\n- (void)addExtendedAttributeWithName:(NSString *)attrName;\n- (void)removeExtendedAttributeWithName:(NSString *)attrName;\n\n#endif\n\n- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another;\n- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/DDLog.h",
    "content": "#import <Foundation/Foundation.h>\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * Otherwise, here is a quick refresher.\n * There are three steps to using the macros:\n * \n * Step 1:\n * Import the header in your implementation file:\n * \n * #import \"DDLog.h\"\n * \n * Step 2:\n * Define your logging level in your implementation file:\n * \n * // Log levels: off, error, warn, info, verbose\n * static const int ddLogLevel = LOG_LEVEL_VERBOSE;\n * \n * Step 2 [3rd party frameworks]:\n *\n * Define your LOG_LEVEL_DEF to a different variable/function than ddLogLevel:\n *\n * // #undef LOG_LEVEL_DEF // Undefine first only if needed\n * #define LOG_LEVEL_DEF myLibLogLevel\n *\n * Define your logging level in your implementation file:\n *\n * // Log levels: off, error, warn, info, verbose\n * static const int myLibLogLevel = LOG_LEVEL_VERBOSE;\n *\n * Step 3:\n * Replace your NSLog statements with DDLog statements according to the severity of the message.\n * \n * NSLog(@\"Fatal error, no dohickey found!\"); -> DDLogError(@\"Fatal error, no dohickey found!\");\n * \n * DDLog works exactly the same as NSLog.\n * This means you can pass it multiple variables just like NSLog.\n**/\n\n#ifndef LOG_LEVEL_DEF\n    #define LOG_LEVEL_DEF ddLogLevel\n#endif\n\n@class DDLogMessage;\n\n@protocol DDLogger;\n@protocol DDLogFormatter;\n\n/**\n * This is the single macro that all other macros below compile into.\n * This big multiline macro makes all the other macros easier to read.\n**/\n\n#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \\\n  [DDLog log:isAsynchronous                                             \\\n       level:lvl                                                        \\\n        flag:flg                                                        \\\n     context:ctx                                                        \\\n        file:__FILE__                                                   \\\n    function:fnct                                                       \\\n        line:__LINE__                                                   \\\n         tag:atag                                                       \\\n      format:(frmt), ##__VA_ARGS__]\n\n/**\n * Define the Objective-C and C versions of the macro.\n * These automatically inject the proper function name for either an objective-c method or c function.\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_OBJC_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MACRO(async, lvl, flg, ctx, nil, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MACRO(async, lvl, flg, ctx, nil, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define version of the macro that only execute if the logLevel is above the threshold.\n * The compiled versions essentially look like this:\n * \n * if (logFlagForThisLogMsg & ddLogLevel) { execute log message }\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels.\n * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques.\n * \n * Note that when compiler optimizations are enabled (as they are for your release builds),\n * the log messages above your logging threshold will automatically be compiled out.\n * \n * (If the compiler sees ddLogLevel declared as a constant, the compiler simply checks to see if the 'if' statement\n *  would execute, and if not it strips it from the binary.)\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define versions of the macros that also accept tags.\n * \n * The DDLogMessage object includes a 'tag' ivar that may be used for a variety of purposes.\n * It may be used to pass custom information to loggers or formatters.\n * Or it may be used by 3rd party extensions to the framework.\n * \n * Thes macros just make it a little easier to extend logging functionality.\n**/\n\n#define LOG_OBJC_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n                 LOG_MACRO(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n              LOG_MACRO(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n             LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n          LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n/**\n * Define the standard options.\n * \n * We default to only 4 levels because it makes it easier for beginners\n * to make the transition to a logging framework.\n * \n * More advanced users may choose to completely customize the levels (and level names) to suite their needs.\n * For more information on this see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n * \n * Advanced users may also notice that we're using a bitmask.\n * This is to allow for custom fine grained logging:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/FineGrainedLogging\n * \n * -- Flags --\n * \n * Typically you will use the LOG_LEVELS (see below), but the flags may be used directly in certain situations.\n * For example, say you have a lot of warning log messages, and you wanted to disable them.\n * However, you still needed to see your error and info log messages.\n * You could accomplish that with the following:\n * \n * static const int ddLogLevel = LOG_FLAG_ERROR | LOG_FLAG_INFO;\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * Flags may also be consulted when writing custom log formatters,\n * as the DDLogMessage class captures the individual flag that caused the log message to fire.\n * \n * -- Levels --\n * \n * Log levels are simply the proper bitmask of the flags.\n * \n * -- Booleans --\n * \n * The booleans may be used when your logging code involves more than one line.\n * For example:\n * \n * if (LOG_VERBOSE) {\n *     for (id sprocket in sprockets)\n *         DDLogVerbose(@\"sprocket: %@\", [sprocket description])\n * }\n * \n * -- Async --\n * \n * Defines the default asynchronous options.\n * The default philosophy for asynchronous logging is very simple:\n * \n * Log messages with errors should be executed synchronously.\n *     After all, an error just occurred. The application could be unstable.\n * \n * All other log messages, such as debug output, are executed asynchronously.\n *     After all, if it wasn't an error, then it was just informational output,\n *     or something the application was easily able to recover from.\n * \n * -- Changes --\n * \n * You are strongly discouraged from modifying this file.\n * If you do, you make it more difficult on yourself to merge future bug fixes and improvements from the project.\n * Instead, create your own MyLogging.h or ApplicationNameLogging.h or CompanyLogging.h\n * \n * For an example of customizing your logging experience, see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n**/\n\n#define LOG_FLAG_ERROR    (1 << 0)  // 0...00001\n#define LOG_FLAG_WARN     (1 << 1)  // 0...00010\n#define LOG_FLAG_INFO     (1 << 2)  // 0...00100\n#define LOG_FLAG_DEBUG    (1 << 3)  // 0...01000\n#define LOG_FLAG_VERBOSE  (1 << 4)  // 0...10000\n\n#define LOG_LEVEL_OFF     0\n#define LOG_LEVEL_ERROR   (LOG_FLAG_ERROR)                                                                          // 0...00001\n#define LOG_LEVEL_WARN    (LOG_FLAG_ERROR | LOG_FLAG_WARN)                                                          // 0...00011\n#define LOG_LEVEL_INFO    (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO)                                          // 0...00111\n#define LOG_LEVEL_DEBUG   (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG)                         // 0...01111\n#define LOG_LEVEL_VERBOSE (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG | LOG_FLAG_VERBOSE)      // 0...11111\n\n#define LOG_ERROR    (LOG_LEVEL_DEF & LOG_FLAG_ERROR)\n#define LOG_WARN     (LOG_LEVEL_DEF & LOG_FLAG_WARN)\n#define LOG_INFO     (LOG_LEVEL_DEF & LOG_FLAG_INFO)\n#define LOG_DEBUG    (LOG_LEVEL_DEF & LOG_FLAG_DEBUG)\n#define LOG_VERBOSE  (LOG_LEVEL_DEF & LOG_FLAG_VERBOSE)\n\n#define LOG_ASYNC_ENABLED YES\n\n#define LOG_ASYNC_ERROR    ( NO && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_WARN     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_INFO     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_DEBUG    (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_VERBOSE  (YES && LOG_ASYNC_ENABLED)\n\n#define DDLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogDebug(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define DDLogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogCDebug(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n/**\n * The THIS_FILE macro gives you an NSString of the file name.\n * For simplicity and clarity, the file name does not include the full path or file extension.\n * \n * For example: DDLogWarn(@\"%@: Unable to find thingy\", THIS_FILE) -> @\"MyViewController: Unable to find thingy\"\n**/\n\nNSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy);\n\n#define THIS_FILE (DDExtractFileNameWithoutExtension(__FILE__, NO))\n\n/**\n * The THIS_METHOD macro gives you the name of the current objective-c method.\n * \n * For example: DDLogWarn(@\"%@ - Requires non-nil strings\", THIS_METHOD) -> @\"setMake:model: requires non-nil strings\"\n * \n * Note: This does NOT work in straight C functions (non objective-c).\n * Instead you should use the predefined __FUNCTION__ macro.\n**/\n\n#define THIS_METHOD NSStringFromSelector(_cmd)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDLog : NSObject\n\n/**\n * Provides access to the underlying logging queue.\n * This may be helpful to Logger classes for things like thread synchronization.\n**/\n\n+ (dispatch_queue_t)loggingQueue;\n\n/**\n * Logging Primitive.\n * \n * This method is used by the macros above.\n * It is suggested you stick with the macros as they're easier to use.\n**/\n\n+ (void)log:(BOOL)synchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format, ... __attribute__ ((format (__NSString__, 9, 10)));\n\n/**\n * Logging Primitive.\n * \n * This method can be used if you have a prepared va_list.\n**/\n\n+ (void)log:(BOOL)asynchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format\n       args:(va_list)argList;\n\n\n/**\n * Since logging can be asynchronous, there may be times when you want to flush the logs.\n * The framework invokes this automatically when the application quits.\n**/\n\n+ (void)flushLog;\n\n/** \n * Loggers\n * \n * If you want your log statements to go somewhere,\n * you should create and add a logger.\n**/\n\n+ (void)addLogger:(id <DDLogger>)logger;    // adds the logger using maximum log level (LOG_LEVEL_VERBOSE)\n\n/**\n * Please use as logLevels the LOG_LEVEL_* macros\n *\n**/\n+ (void)addLogger:(id <DDLogger>)logger withLogLevel:(int)logLevel;\n\n+ (void)removeLogger:(id <DDLogger>)logger;\n+ (void)removeAllLoggers;\n\n/**\n * Registered Dynamic Logging\n * \n * These methods allow you to obtain a list of classes that are using registered dynamic logging,\n * and also provides methods to get and set their log level during run time.\n**/\n\n+ (NSArray *)registeredClasses;\n+ (NSArray *)registeredClassNames;\n\n+ (int)logLevelForClass:(Class)aClass;\n+ (int)logLevelForClassWithName:(NSString *)aClassName;\n\n+ (void)setLogLevel:(int)logLevel forClass:(Class)aClass;\n+ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogger <NSObject>\n@required\n\n- (void)logMessage:(DDLogMessage *)logMessage;\n\n/**\n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n**/\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@optional\n\n/**\n * Since logging is asynchronous, adding and removing loggers is also asynchronous.\n * In other words, the loggers are added and removed at appropriate times with regards to log messages.\n * \n * - Loggers will not receive log messages that were executed prior to when they were added.\n * - Loggers will not receive log messages that were executed after they were removed.\n * \n * These methods are executed in the logging thread/queue.\n * This is the same thread/queue that will execute every logMessage: invocation.\n * Loggers may use these methods for thread synchronization or other setup/teardown tasks.\n**/\n- (void)didAddLogger;\n- (void)willRemoveLogger;\n\n/**\n * Some loggers may buffer IO for optimization purposes.\n * For example, a database logger may only save occasionaly as the disk IO is slow.\n * In such loggers, this method should be implemented to flush any pending IO.\n * \n * This allows invocations of DDLog's flushLog method to be propogated to loggers that need it.\n * \n * Note that DDLog's flushLog method is invoked automatically when the application quits,\n * and it may be also invoked manually by the developer prior to application crashes, or other such reasons.\n**/\n- (void)flush;\n\n/**\n * Each logger is executed concurrently with respect to the other loggers.\n * Thus, a dedicated dispatch queue is used for each logger.\n * Logger implementations may optionally choose to provide their own dispatch queue.\n**/\n- (dispatch_queue_t)loggerQueue;\n\n/**\n * If the logger implementation does not choose to provide its own queue,\n * one will automatically be created for it.\n * The created queue will receive its name from this method.\n * This may be helpful for debugging or profiling reasons.\n**/\n- (NSString *)loggerName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogFormatter <NSObject>\n@required\n\n/**\n * Formatters may optionally be added to any logger.\n * This allows for increased flexibility in the logging environment.\n * For example, log messages for log files may be formatted differently than log messages for the console.\n * \n * For more information about formatters, see the \"Custom Formatters\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The formatter may also optionally filter the log message by returning nil,\n * in which case the logger will not log the message.\n**/\n- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;\n\n@optional\n\n/**\n * A single formatter instance can be added to multiple loggers.\n * These methods provides hooks to notify the formatter of when it's added/removed.\n *\n * This is primarily for thread-safety.\n * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers.\n * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter),\n * it could possibly use these hooks to switch to thread-safe versions of the code.\n**/\n- (void)didAddToLogger:(id <DDLogger>)logger;\n- (void)willRemoveFromLogger:(id <DDLogger>)logger;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDRegisteredDynamicLogging\n\n/**\n * Implement these methods to allow a file's log level to be managed from a central location.\n * \n * This is useful if you'd like to be able to change log levels for various parts\n * of your code from within the running application.\n * \n * Imagine pulling up the settings for your application,\n * and being able to configure the logging level on a per file basis.\n * \n * The implementation can be very straight-forward:\n * \n * + (int)ddLogLevel\n * {\n *     return ddLogLevel;\n * }\n *  \n * + (void)ddSetLogLevel:(int)logLevel\n * {\n *     ddLogLevel = logLevel;\n * }\n**/\n\n+ (int)ddLogLevel;\n+ (void)ddSetLogLevel:(int)logLevel;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogMessage class encapsulates information about the log message.\n * If you write custom loggers or formatters, you will be dealing with objects of this class.\n**/\n\nenum {\n    DDLogMessageCopyFile     = 1 << 0,\n    DDLogMessageCopyFunction = 1 << 1\n};\ntypedef int DDLogMessageOptions;\n\n@interface DDLogMessage : NSObject <NSCopying>\n{\n\n// The public variables below can be accessed directly (for speed).\n// For example: logMessage->logLevel\n    \n@public\n    int logLevel;\n    int logFlag;\n    int logContext;\n    NSString *logMsg;\n    NSDate *timestamp;\n    char *file;\n    char *function;\n    int lineNumber;\n    mach_port_t machThreadID;\n    char *queueLabel;\n    NSString *threadName;\n    \n    // For 3rd party extensions to the framework, where flags and contexts aren't enough.\n    id tag;\n    \n    // For 3rd party extensions that manually create DDLogMessage instances.\n    DDLogMessageOptions options;\n}\n\n/**\n * Standard init method for a log message object.\n * Used by the logging primitives. (And the macros use the logging primitives.)\n * \n * If you find need to manually create logMessage objects, there is one thing you should be aware of:\n * \n * If no flags are passed, the method expects the file and function parameters to be string literals.\n * That is, it expects the given strings to exist for the duration of the object's lifetime,\n * and it expects the given strings to be immutable.\n * In other words, it does not copy these strings, it simply points to them.\n * This is due to the fact that __FILE__ and __FUNCTION__ are usually used to specify these parameters,\n * so it makes sense to optimize and skip the unnecessary allocations.\n * However, if you need them to be copied you may use the options parameter to specify this.\n * Options is a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction.\n**/\n- (instancetype)initWithLogMsg:(NSString *)logMsg\n                         level:(int)logLevel\n                          flag:(int)logFlag\n                       context:(int)logContext\n                          file:(const char *)file\n                      function:(const char *)function\n                          line:(int)line\n                           tag:(id)tag\n                       options:(DDLogMessageOptions)optionsMask;\n\n/**\n * Returns the threadID as it appears in NSLog.\n * That is, it is a hexadecimal value which is calculated from the machThreadID.\n**/\n- (NSString *)threadID;\n\n/**\n * Convenience property to get just the file name, as the file variable is generally the full file path.\n * This method does not include the file extension, which is generally unwanted for logging purposes.\n**/\n- (NSString *)fileName;\n\n/**\n * Returns the function variable in NSString form.\n**/\n- (NSString *)methodName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogger protocol specifies that an optional formatter can be added to a logger.\n * Most (but not all) loggers will want to support formatters.\n * \n * However, writting getters and setters in a thread safe manner,\n * while still maintaining maximum speed for the logging process, is a difficult task.\n * \n * To do it right, the implementation of the getter/setter has strict requiremenets:\n * - Must NOT require the logMessage method to acquire a lock.\n * - Must NOT require the logMessage method to access an atomic property (also a lock of sorts).\n * \n * To simplify things, an abstract logger is provided that implements the getter and setter.\n * \n * Logger implementations may simply extend this class,\n * and they can ACCESS THE FORMATTER VARIABLE DIRECTLY from within their logMessage method!\n**/\n\n@interface DDAbstractLogger : NSObject <DDLogger>\n{\n    id <DDLogFormatter> formatter;\n    \n    dispatch_queue_t loggerQueue;\n}\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n// For thread-safety assertions\n- (BOOL)isOnGlobalLoggingQueue;\n- (BOOL)isOnInternalLoggerQueue;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/DDTTYLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#if TARGET_OS_IPHONE\n#import <UIKit/UIColor.h>   // iOS\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n#import <AppKit/NSColor.h>  // OS X with AppKit\n#else\n#import \"CLIColor.h\"        // OS X without AppKit\n#endif\n\n#import \"DDLog.h\"\n\n#define LOG_CONTEXT_ALL INT_MAX\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for Terminal output or Xcode console output,\n * depending on where you are running your code.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log (so it shows up in Console.app)\n * - StdErr (if stderr is a TTY, so log statements show up in Xcode console)\n * \n * To duplicate NSLog() functionality you can simply add this logger and an asl logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use only a file logger and a tty logger.\n**/\n\n@interface DDTTYLogger : DDAbstractLogger <DDLogger>\n{\n    NSCalendar *calendar;\n    NSUInteger calendarUnitFlags;\n    \n    NSString *appName;\n    char *app;\n    size_t appLen;\n    \n    NSString *processID;\n    char *pid;\n    size_t pidLen;\n    \n    BOOL colorsEnabled;\n    NSMutableArray *colorProfilesArray;\n    NSMutableDictionary *colorProfilesDict;\n}\n\n+ (instancetype)sharedInstance;\n\n/* Inherited from the DDLogger protocol:\n * \n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n * \n * More information about formatters can be found here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The actual implementation of these methods is inherited from DDAbstractLogger.\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n \n*/\n\n/**\n * Want to use different colors for different log levels?\n * Enable this property.\n * \n * If you run the application via the Terminal (not Xcode),\n * the logger will map colors to xterm-256color or xterm-color (if available).\n * \n * Xcode does NOT natively support colors in the Xcode debugging console.\n * You'll need to install the XcodeColors plugin to see colors in the Xcode console.\n * https://github.com/robbiehanson/XcodeColors\n * \n * The default value if NO.\n**/\n@property (readwrite, assign) BOOL colorsEnabled;\n\n/**\n * The default color set (foregroundColor, backgroundColor) is:\n * \n * - LOG_FLAG_ERROR = (red, nil)\n * - LOG_FLAG_WARN  = (orange, nil)\n * \n * You can customize the colors however you see fit.\n * Please note that you are passing a flag, NOT a level.\n * \n * GOOD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_FLAG_INFO];  // <- Good :)\n *  BAD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_LEVEL_INFO]; // <- BAD! :(\n * \n * LOG_FLAG_INFO  = 0...00100\n * LOG_LEVEL_INFO = 0...00111 <- Would match LOG_FLAG_INFO and LOG_FLAG_WARN and LOG_FLAG_ERROR\n * \n * If you run the application within Xcode, then the XcodeColors plugin is required.\n * \n * If you run the application from a shell, then DDTTYLogger will automatically map the given color to\n * the closest available color. (xterm-256color or xterm-color which have 256 and 16 supported colors respectively.)\n * \n * This method invokes setForegroundColor:backgroundColor:forFlag:context: and applies it to `LOG_CONTEXT_ALL`.\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask;\n#endif\n\n/**\n * Just like setForegroundColor:backgroundColor:flag, but allows you to specify a particular logging context.\n * \n * A logging context is often used to identify log messages coming from a 3rd party framework,\n * although logging context's can be used for many different functions.\n * \n * Use LOG_CONTEXT_ALL to set the deafult color for all contexts that have no specific color set defined.\n * \n * Logging context's are explained in further detail here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomContext\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#endif\n\n/**\n * Similar to the methods above, but allows you to map DDLogMessage->tag to a particular color profile.\n * For example, you could do something like this:\n * \n * static NSString *const PurpleTag = @\"PurpleTag\";\n * \n * #define DDLogPurple(frmt, ...) LOG_OBJC_TAG_MACRO(NO, 0, 0, 0, PurpleTag, frmt, ##__VA_ARGS__)\n * \n * And then in your applicationDidFinishLaunching, or wherever you configure Lumberjack:\n * \n * #if TARGET_OS_IPHONE\n *   UIColor *purple = [UIColor colorWithRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n * #else\n *   NSColor *purple = [NSColor colorWithCalibratedRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n *\n * Note: For CLI OS X projects that don't link with AppKit use CLIColor objects instead\n * \n * [[DDTTYLogger sharedInstance] setForegroundColor:purple backgroundColor:nil forTag:PurpleTag];\n * [DDLog addLogger:[DDTTYLogger sharedInstance]];\n * \n * This would essentially give you a straight NSLog replacement that prints in purple:\n * \n * DDLogPurple(@\"I'm a purple log message!\");\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forTag:(id <NSCopying>)tag;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forTag:(id <NSCopying>)tag;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forTag:(id <NSCopying>)tag;\n#endif\n\n/**\n * Clearing color profiles.\n**/\n- (void)clearColorsForFlag:(int)mask;\n- (void)clearColorsForFlag:(int)mask context:(int)context;\n- (void)clearColorsForTag:(id <NSCopying>)tag;\n- (void)clearColorsForAllFlags;\n- (void)clearColorsForAllTags;\n- (void)clearAllColors;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/NSJSONSerialization+ObjectWithNString.h",
    "content": "//\n//  NSJSONSerialization+ObjectWithNString.h\n//  Ejecta\n//\n//  Created by matth on 7/19/13.\n//\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (ObjectWithNString)\n+ (id)JSONObjectWithString:(NSString *)string options:(NSJSONReadingOptions)opt error:(NSError **)error;\n+ (NSString*)stringWithNSDictionary:(NSDictionary*)dictionary;\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/NSJSONSerialization+PBJSONHelpers.h",
    "content": "//\n//  NSJSONSerialization+PBJSONHelpers.h\n//  PebbleVendor\n//\n//  Created by matth on 9/17/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (PBJSONHelpers)\n\n/** @name Reflection helpers */\n\n/**\n * Derived from the Box SDK (MIT license) NSJSONSerialization+BoxAdditions...\n * https://github.com/box/box-ios-sdk-v2/tree/master/BoxSDK/Categories\n \n * Ensure that the object at `key` in `dictionary` is a member of the expected class.\n * `NSNull` may be specified as an allowable value. This method may return nil if `key`\n * is not present in `dictionary`.\n *\n * @param key The key to lookup in `dictionary`.\n * @param dictionary A dictionary resulting from deserializing a JSON object.\n * @param cls The expected class of the value at key.\n * @param nullAllowed If true, `NSNull` will be returned. If not, NSNull will be converted to nil. Property getters that pass `YES` for this parameter should have the return type of `id`.\n *\n * @return The object at `key` in `dictionary` if expectations are satisfied; `nil` otherwise.\n */\n+ (id)ensureObjectForKey:(NSString *)key inDictionary:(NSDictionary *)dictionary hasExpectedType:(Class)cls nullAllowed:(BOOL)nullAllowed;\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/NSString+HexData.h",
    "content": "//\n//  NSString+HexData.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 11/19/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSString (HexData)\n\n- (NSData*)hexData;\n\n@end\n\n\n@interface NSData (HexString)\n\n- (NSString*)hexString;\n\n@end"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Headers/UIDevice-Hardware.h",
    "content": "/*\n Erica Sadun, http://ericasadun.com\n iPhone Developer's Cookbook, 6.x Edition\n BSD License, Use at your own risk\n */\n\n#import <UIKit/UIKit.h>\n\ntypedef enum {\n    UIDeviceFamilyiPhone,\n    UIDeviceFamilyiPod,\n    UIDeviceFamilyiPad,\n    UIDeviceFamilyAppleTV,\n    UIDeviceFamilyUnknown,\n    \n} UIDeviceFamily;\n\n@interface UIDevice (Hardware)\n- (NSString *) platform;\n- (NSString *) hwmodel;\n- (NSString *) platformString;\n\n- (NSUInteger) cpuFrequency;\n- (NSUInteger) busFrequency;\n- (NSUInteger) cpuCount;\n- (NSUInteger) totalMemory;\n- (NSUInteger) userMemory;\n\n- (NSNumber *) totalDiskSpace;\n- (NSNumber *) freeDiskSpace;\n\n- (NSString *) macaddress;\n\n- (BOOL) hasRetinaDisplay;\n- (BOOL) hasBluetoothMAP;\n- (UIDeviceFamily) deviceFamily;\n@end"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/CHMultiDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMultiDictionary.h\n \n Copyright (c) 2008-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n#import \"CHMutableDictionary.h\"\n\n/**\n @file CHMultiDictionary.h\n \n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> in which multiple values may be associated with a given key.\n */\n\n/**\n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> implementation, in which multiple values may be associated with a given key.\n \n A map is the same as a \"dictionary\", \"associative array\", etc. and consists of a unique set of keys and a collection of values. In a standard map, each key is associated with one value; in a multimap, more than one value may be associated with a given key. A multimap is appropriate for any situation in which one item may correspond to (map to) multiple values, such as a term in an book index and occurrences of that term, courses for which a student is registered, etc.\n \n The values for a key may or may not be ordered. This implementation does not maintain an ordering for objects associated with a key, nor does it allow for multiple occurrences of an object associated with the same key. Internally, this class uses an NSMutableDictionary, and the associated values for each key are stored in distinct NSMutableSet instances. (Just as with NSDictionary, each key added to a CHMultiDictionary is copied using \\link NSCopying#copyWithZone: -copyWithZone:\\endlink and all keys must conform to the NSCopying protocol.) Objects are retained on insertion and released on removal or deallocation.\n \n Since NSDictionary and NSSet conform to the NSCoding protocol, any internal data can be serialized. However, NSSet cannot automatically be written to or read from a property list, since it has no specified order. Thus, instances of CHMultiDictionary must be encoded as an NSData object before saving to disk.\n \n Currently, this implementation does not support key-value coding, observing, or binding like NSDictionary does. Consequently, the distinction between \"object\" and \"value\" is blurrier, although hopefully consistent with the Cocoa APIs in general....\n \n Unlike NSDictionary and other Cocoa collections, CHMultiDictionary has not been designed with mutable and immutable variants. A multimap is not that much more useful if it is immutable, so any copies made of this class are mutable by definition.\n */\n@interface CHMultiDictionary : CHMutableDictionary {\n\tNSUInteger objectCount; // Number of objects currently in the dictionary.\n}\n\n#pragma mark Querying Contents\n\n/**\n Returns the number of objects in the receiver, associated with any key.\n \n @return The number of objects in the receiver. This is the sum total of objects associated with each key in the dictonary.\n \n @see allObjects\n */\n- (NSUInteger) countForAllKeys;\n\n/**\n Returns the number of objects associated with a given key.\n \n @param aKey The key for which to return the object count.\n @return The number of objects associated with a given key in the dictionary.\n \n @see objectsForKey:\n */\n- (NSUInteger) countForKey:(id)aKey;\n\n/**\n Returns an array of objects associated with a given key.\n \n @param aKey The key for which to return the corresponding objects.\n @return An NSSet of objects associated with a given key, or nil if the key is not in the receiver.\n \n @see countForKey:\n @see removeObjectsForKey:\n */\n- (NSSet*) objectsForKey:(id)aKey;\n\n#pragma mark Modifying Contents\n\n/**\n Adds a given object to an entry for a given key in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param anObject An object to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#addObject: -[NSMutableSet addObject:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObject:(id)anObject forKey:(id)aKey;\n\n/**\n Adds the given object(s) to a key entry in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param objectSet A set of objects to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#unionSet: -[NSMutableSet unionSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n/**\n Remove @b all occurrences of @a anObject associated with a given key.\n \n @param aKey The key for which to remove an entry.\n @param anObject An object (possibly) associated with @a aKey in the receiver. Objects are considered to be equal if -compare: returns NSOrderedSame.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n If @a aKey does not exist in the receiver, or if @a anObject is not associated with @a aKey, the contents of the receiver are not modified.\n \n @see containsObject\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) removeObject:(id)anObject forKey:(id)aKey;\n\n/**\n Remove a given key and its associated value(s) from the receiver.\n \n @param aKey The key for which to remove an entry.\n \n If @a aKey does not exist in the receiver, there is no effect on the receiver.\n \n @see objectsForKey:\n @see removeObject:forKey:\n */\n- (void) removeObjectsForKey:(id)aKey;\n\n/**\n Sets the object(s) associated with a key entry in the receiver.\n \n @param aKey The key with which to associate the objects in @a objectSet.\n @param objectSet A set of objects to associate with @a key. If @a objectSet is empty, the contents of the receiver are not modified. If an entry for @a key already exists in the receiver, @a objectSet is added using \\link NSMutableSet#setSet: -[NSMutableSet setSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) setObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/CHMutableDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMutableDictionary.h\n \n Copyright (c) 2009-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n__attribute__((visibility(\"hidden\"))) void createCollectableCFMutableDictionary(CFMutableDictionaryRef* dictionary, NSUInteger initialCapacity);\n\n/**\n @file CHMutableDictionary.h\n \n A mutable dictionary class.\n */\n\n/**\n A mutable dictionary class.\n \n A CFMutableDictionaryRef is used internally to store the key-value pairs. Subclasses may choose to add other instance variables to enable a specific ordering of keys, override methods to modify behavior, and add methods to extend existing behaviors. However, all subclasses should behave like a standard Cocoa dictionary as much as possible, and document clearly when they do not.\n \n @note Any method inherited from NSDictionary or NSMutableDictionary is supported by this class and its children. Please see the documentation for those classes for details.\n \n @todo Implement @c -copy and @c -mutableCopy differently (so users can actually obtain an immutable copy) and make mutation methods aware of immutability?\n */\n@interface CHMutableDictionary : NSMutableDictionary {\n  CFMutableDictionaryRef dictionary; // A Core Foundation dictionary.\n}\n\n- (id) initWithCapacity:(NSUInteger)numItems;\n\n- (NSUInteger) count;\n- (NSEnumerator*) keyEnumerator;\n- (id) objectForKey:(id)aKey;\n- (void) removeAllObjects;\n- (void) removeObjectForKey:(id)aKey;\n- (void) setObject:(id)anObject forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/DDASLLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import <asl.h>\n\n#import \"DDLog.h\"\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for the Apple System Log facility.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log\n * - StdErr (if stderr is a TTY) so log statements show up in Xcode console\n * \n * To duplicate NSLog() functionality you can simply add this logger and a tty logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use a file logger and a tty logger.\n**/\n\n@interface DDASLLogger : DDAbstractLogger <DDLogger>\n{\n    aslclient client;\n}\n\n+ (instancetype)sharedInstance;\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/DDFileLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"DDLog.h\"\n\n@class DDLogFileInfo;\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger to write log statements to a file.\n**/\n\n\n// Default configuration and safety/sanity values.\n// \n// maximumFileSize         -> DEFAULT_LOG_MAX_FILE_SIZE\n// rollingFrequency        -> DEFAULT_LOG_ROLLING_FREQUENCY\n// maximumNumberOfLogFiles -> DEFAULT_LOG_MAX_NUM_LOG_FILES\n// \n// You should carefully consider the proper configuration values for your application.\n\n#define DEFAULT_LOG_MAX_FILE_SIZE     (1024 * 1024)   //  1 MB\n#define DEFAULT_LOG_ROLLING_FREQUENCY (60 * 60 * 24)  // 24 Hours\n#define DEFAULT_LOG_MAX_NUM_LOG_FILES (5)             //  5 Files\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// The LogFileManager protocol is designed to allow you to control all aspects of your log files.\n// \n// The primary purpose of this is to allow you to do something with the log files after they have been rolled.\n// Perhaps you want to compress them to save disk space.\n// Perhaps you want to upload them to an FTP server.\n// Perhaps you want to run some analytics on the file.\n// \n// A default LogFileManager is, of course, provided.\n// The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property.\n// \n// This protocol provides various methods to fetch the list of log files.\n// \n// There are two variants: sorted and unsorted.\n// If sorting is not necessary, the unsorted variant is obviously faster.\n// The sorted variant will return an array sorted by when the log files were created,\n// with the most recently created log file at index 0, and the oldest log file at the end of the array.\n// \n// You can fetch only the log file paths (full path including name), log file names (name only),\n// or an array of DDLogFileInfo objects.\n// The DDLogFileInfo class is documented below, and provides a handy wrapper that\n// gives you easy access to various file attributes such as the creation date or the file size.\n\n@protocol DDLogFileManager <NSObject>\n@required\n\n// Public properties\n\n/**\n * The maximum number of archived log files to keep on disk.\n * For example, if this property is set to 3,\n * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk.\n * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted.\n * \n * You may optionally disable deleting old/rolled/archived log files by setting this property to zero.\n**/\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n// Public methods\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n// Private methods (only to be used by DDFileLogger)\n\n- (NSString *)createNewLogFile;\n\n@optional\n\n// Notifications from DDFileLogger\n\n- (void)didArchiveLogFile:(NSString *)logFilePath;\n- (void)didRollAndArchiveLogFile:(NSString *)logFilePath;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Default log file manager.\n * \n * All log files are placed inside the logsDirectory.\n * If a specific logsDirectory isn't specified, the default directory is used.\n * On Mac, this is in ~/Library/Logs/<Application Name>.\n * On iPhone, this is in ~/Library/Caches/Logs.\n * \n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n * \n * Archived log files are automatically deleted according to the maximumNumberOfLogFiles property.\n**/\n@interface DDLogFileManagerDefault : NSObject <DDLogFileManager>\n{\n    NSUInteger maximumNumberOfLogFiles;\n    NSString *_logsDirectory;\n}\n\n- (id)init;\n- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory;\n\n/*\n * Methods to override.\n *\n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n *\n * If you wish to change default filename, you can override following two methods.\n * - newLogFileName method would be called on new logfile creation.\n * - isLogFile: method would be called to filter logfiles from all other files in logsDirectory.\n *   You have to parse given filename and return YES if it is logFile.\n *\n * **NOTE**\n * newLogFileName returns filename. If appropriate file already exists, number would be added\n * to filename before extension. You have to handle this case in isLogFile: method.\n *\n * Example:\n * - newLogFileName returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 2.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03 1.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 3.log\" would be created.\n**/\n- (NSString *)newLogFileName;\n- (BOOL)isLogFile:(NSString *)fileName;\n\n/* Inherited from DDLogFileManager protocol:\n\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n*/\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Most users will want file log messages to be prepended with the date and time.\n * Rather than forcing the majority of users to write their own formatter,\n * we will supply a logical default formatter.\n * Users can easily replace this formatter with their own by invoking the setLogFormatter method.\n * It can also be removed by calling setLogFormatter, and passing a nil parameter.\n * \n * In addition to the convenience of having a logical default formatter,\n * it will also provide a template that makes it easy for developers to copy and change.\n**/\n@interface DDLogFileFormatterDefault : NSObject <DDLogFormatter>\n{\n    NSDateFormatter *dateFormatter;\n}\n\n- (id)init;\n- (instancetype)initWithDateFormatter:(NSDateFormatter *)dateFormatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDFileLogger : DDAbstractLogger <DDLogger>\n{\n    __strong id <DDLogFileManager> logFileManager;\n    \n    DDLogFileInfo *currentLogFileInfo;\n    NSFileHandle *currentLogFileHandle;\n    \n    dispatch_source_t currentLogFileVnode;\n    dispatch_source_t rollingTimer;\n    \n    unsigned long long maximumFileSize;\n    NSTimeInterval rollingFrequency;\n}\n\n- (id)init;\n- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)logFileManager;\n\n/**\n * Log File Rolling:\n * \n * maximumFileSize:\n *   The approximate maximum size to allow log files to grow.\n *   If a log file is larger than this value after a log statement is appended,\n *   then the log file is rolled.\n * \n * rollingFrequency\n *   How often to roll the log file.\n *   The frequency is given as an NSTimeInterval, which is a double that specifies the interval in seconds.\n *   Once the log file gets to be this old, it is rolled.\n * \n * Both the maximumFileSize and the rollingFrequency are used to manage rolling.\n * Whichever occurs first will cause the log file to be rolled.\n * \n * For example:\n * The rollingFrequency is 24 hours,\n * but the log file surpasses the maximumFileSize after only 20 hours.\n * The log file will be rolled at that 20 hour mark.\n * A new log file will be created, and the 24 hour timer will be restarted.\n * \n * You may optionally disable rolling due to filesize by setting maximumFileSize to zero.\n * If you do so, rolling is based solely on rollingFrequency.\n * \n * You may optionally disable rolling due to time by setting rollingFrequency to zero (or any non-positive number).\n * If you do so, rolling is based solely on maximumFileSize.\n * \n * If you disable both maximumFileSize and rollingFrequency, then the log file won't ever be rolled.\n * This is strongly discouraged.\n**/\n@property (readwrite, assign) unsigned long long maximumFileSize;\n@property (readwrite, assign) NSTimeInterval rollingFrequency;\n\n/**\n * The DDLogFileManager instance can be used to retrieve the list of log files,\n * and configure the maximum number of archived log files to keep.\n * \n * @see DDLogFileManager.maximumNumberOfLogFiles\n**/\n@property (strong, nonatomic, readonly) id <DDLogFileManager> logFileManager;\n\n\n// You can optionally force the current log file to be rolled with this method.\n// CompletionBlock will be called on main queue.\n\n- (void)rollLogFileWithCompletionBlock:(void (^)())completionBlock;\n\n// Method is deprecated. Use rollLogFileWithCompletionBlock: method instead.\n\n- (void)rollLogFile __attribute((deprecated));\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * DDLogFileInfo is a simple class that provides access to various file attributes.\n * It provides good performance as it only fetches the information if requested,\n * and it caches the information to prevent duplicate fetches.\n * \n * It was designed to provide quick snapshots of the current state of log files,\n * and to help sort log files in an array.\n * \n * This class does not monitor the files, or update it's cached attribute values if the file changes on disk.\n * This is not what the class was designed for.\n * \n * If you absolutely must get updated values,\n * you can invoke the reset method which will clear the cache.\n**/\n@interface DDLogFileInfo : NSObject\n{\n    __strong NSString *filePath;\n    __strong NSString *fileName;\n    \n    __strong NSDictionary *fileAttributes;\n    \n    __strong NSDate *creationDate;\n    __strong NSDate *modificationDate;\n    \n    unsigned long long fileSize;\n}\n\n@property (strong, nonatomic, readonly) NSString *filePath;\n@property (strong, nonatomic, readonly) NSString *fileName;\n\n@property (strong, nonatomic, readonly) NSDictionary *fileAttributes;\n\n@property (strong, nonatomic, readonly) NSDate *creationDate;\n@property (strong, nonatomic, readonly) NSDate *modificationDate;\n\n@property (nonatomic, readonly) unsigned long long fileSize;\n\n@property (nonatomic, readonly) NSTimeInterval age;\n\n@property (nonatomic, readwrite) BOOL isArchived;\n\n+ (instancetype)logFileWithPath:(NSString *)filePath;\n\n- (instancetype)initWithFilePath:(NSString *)filePath;\n\n- (void)reset;\n- (void)renameFile:(NSString *)newFileName;\n\n#if TARGET_IPHONE_SIMULATOR\n\n// So here's the situation.\n// Extended attributes are perfect for what we're trying to do here (marking files as archived).\n// This is exactly what extended attributes were designed for.\n// \n// But Apple screws us over on the simulator.\n// Everytime you build-and-go, they copy the application into a new folder on the hard drive,\n// and as part of the process they strip extended attributes from our log files.\n// Normally, a copy of a file preserves extended attributes.\n// So obviously Apple has gone to great lengths to piss us off.\n// \n// Thus we use a slightly different tactic for marking log files as archived in the simulator.\n// That way it \"just works\" and there's no confusion when testing.\n// \n// The difference in method names is indicative of the difference in functionality.\n// On the simulator we add an attribute by appending a filename extension.\n// \n// For example:\n// log-ABC123.txt -> log-ABC123.archived.txt\n\n- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName;\n\n- (void)addExtensionAttributeWithName:(NSString *)attrName;\n- (void)removeExtensionAttributeWithName:(NSString *)attrName;\n\n#else\n\n// Normal use of extended attributes used everywhere else,\n// such as on Macs and on iPhone devices.\n\n- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName;\n\n- (void)addExtendedAttributeWithName:(NSString *)attrName;\n- (void)removeExtendedAttributeWithName:(NSString *)attrName;\n\n#endif\n\n- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another;\n- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/DDLog.h",
    "content": "#import <Foundation/Foundation.h>\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * Otherwise, here is a quick refresher.\n * There are three steps to using the macros:\n * \n * Step 1:\n * Import the header in your implementation file:\n * \n * #import \"DDLog.h\"\n * \n * Step 2:\n * Define your logging level in your implementation file:\n * \n * // Log levels: off, error, warn, info, verbose\n * static const int ddLogLevel = LOG_LEVEL_VERBOSE;\n * \n * Step 2 [3rd party frameworks]:\n *\n * Define your LOG_LEVEL_DEF to a different variable/function than ddLogLevel:\n *\n * // #undef LOG_LEVEL_DEF // Undefine first only if needed\n * #define LOG_LEVEL_DEF myLibLogLevel\n *\n * Define your logging level in your implementation file:\n *\n * // Log levels: off, error, warn, info, verbose\n * static const int myLibLogLevel = LOG_LEVEL_VERBOSE;\n *\n * Step 3:\n * Replace your NSLog statements with DDLog statements according to the severity of the message.\n * \n * NSLog(@\"Fatal error, no dohickey found!\"); -> DDLogError(@\"Fatal error, no dohickey found!\");\n * \n * DDLog works exactly the same as NSLog.\n * This means you can pass it multiple variables just like NSLog.\n**/\n\n#ifndef LOG_LEVEL_DEF\n    #define LOG_LEVEL_DEF ddLogLevel\n#endif\n\n@class DDLogMessage;\n\n@protocol DDLogger;\n@protocol DDLogFormatter;\n\n/**\n * This is the single macro that all other macros below compile into.\n * This big multiline macro makes all the other macros easier to read.\n**/\n\n#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \\\n  [DDLog log:isAsynchronous                                             \\\n       level:lvl                                                        \\\n        flag:flg                                                        \\\n     context:ctx                                                        \\\n        file:__FILE__                                                   \\\n    function:fnct                                                       \\\n        line:__LINE__                                                   \\\n         tag:atag                                                       \\\n      format:(frmt), ##__VA_ARGS__]\n\n/**\n * Define the Objective-C and C versions of the macro.\n * These automatically inject the proper function name for either an objective-c method or c function.\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_OBJC_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MACRO(async, lvl, flg, ctx, nil, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MACRO(async, lvl, flg, ctx, nil, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define version of the macro that only execute if the logLevel is above the threshold.\n * The compiled versions essentially look like this:\n * \n * if (logFlagForThisLogMsg & ddLogLevel) { execute log message }\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels.\n * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques.\n * \n * Note that when compiler optimizations are enabled (as they are for your release builds),\n * the log messages above your logging threshold will automatically be compiled out.\n * \n * (If the compiler sees ddLogLevel declared as a constant, the compiler simply checks to see if the 'if' statement\n *  would execute, and if not it strips it from the binary.)\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define versions of the macros that also accept tags.\n * \n * The DDLogMessage object includes a 'tag' ivar that may be used for a variety of purposes.\n * It may be used to pass custom information to loggers or formatters.\n * Or it may be used by 3rd party extensions to the framework.\n * \n * Thes macros just make it a little easier to extend logging functionality.\n**/\n\n#define LOG_OBJC_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n                 LOG_MACRO(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n              LOG_MACRO(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n             LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n          LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n/**\n * Define the standard options.\n * \n * We default to only 4 levels because it makes it easier for beginners\n * to make the transition to a logging framework.\n * \n * More advanced users may choose to completely customize the levels (and level names) to suite their needs.\n * For more information on this see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n * \n * Advanced users may also notice that we're using a bitmask.\n * This is to allow for custom fine grained logging:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/FineGrainedLogging\n * \n * -- Flags --\n * \n * Typically you will use the LOG_LEVELS (see below), but the flags may be used directly in certain situations.\n * For example, say you have a lot of warning log messages, and you wanted to disable them.\n * However, you still needed to see your error and info log messages.\n * You could accomplish that with the following:\n * \n * static const int ddLogLevel = LOG_FLAG_ERROR | LOG_FLAG_INFO;\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * Flags may also be consulted when writing custom log formatters,\n * as the DDLogMessage class captures the individual flag that caused the log message to fire.\n * \n * -- Levels --\n * \n * Log levels are simply the proper bitmask of the flags.\n * \n * -- Booleans --\n * \n * The booleans may be used when your logging code involves more than one line.\n * For example:\n * \n * if (LOG_VERBOSE) {\n *     for (id sprocket in sprockets)\n *         DDLogVerbose(@\"sprocket: %@\", [sprocket description])\n * }\n * \n * -- Async --\n * \n * Defines the default asynchronous options.\n * The default philosophy for asynchronous logging is very simple:\n * \n * Log messages with errors should be executed synchronously.\n *     After all, an error just occurred. The application could be unstable.\n * \n * All other log messages, such as debug output, are executed asynchronously.\n *     After all, if it wasn't an error, then it was just informational output,\n *     or something the application was easily able to recover from.\n * \n * -- Changes --\n * \n * You are strongly discouraged from modifying this file.\n * If you do, you make it more difficult on yourself to merge future bug fixes and improvements from the project.\n * Instead, create your own MyLogging.h or ApplicationNameLogging.h or CompanyLogging.h\n * \n * For an example of customizing your logging experience, see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n**/\n\n#define LOG_FLAG_ERROR    (1 << 0)  // 0...00001\n#define LOG_FLAG_WARN     (1 << 1)  // 0...00010\n#define LOG_FLAG_INFO     (1 << 2)  // 0...00100\n#define LOG_FLAG_DEBUG    (1 << 3)  // 0...01000\n#define LOG_FLAG_VERBOSE  (1 << 4)  // 0...10000\n\n#define LOG_LEVEL_OFF     0\n#define LOG_LEVEL_ERROR   (LOG_FLAG_ERROR)                                                                          // 0...00001\n#define LOG_LEVEL_WARN    (LOG_FLAG_ERROR | LOG_FLAG_WARN)                                                          // 0...00011\n#define LOG_LEVEL_INFO    (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO)                                          // 0...00111\n#define LOG_LEVEL_DEBUG   (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG)                         // 0...01111\n#define LOG_LEVEL_VERBOSE (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG | LOG_FLAG_VERBOSE)      // 0...11111\n\n#define LOG_ERROR    (LOG_LEVEL_DEF & LOG_FLAG_ERROR)\n#define LOG_WARN     (LOG_LEVEL_DEF & LOG_FLAG_WARN)\n#define LOG_INFO     (LOG_LEVEL_DEF & LOG_FLAG_INFO)\n#define LOG_DEBUG    (LOG_LEVEL_DEF & LOG_FLAG_DEBUG)\n#define LOG_VERBOSE  (LOG_LEVEL_DEF & LOG_FLAG_VERBOSE)\n\n#define LOG_ASYNC_ENABLED YES\n\n#define LOG_ASYNC_ERROR    ( NO && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_WARN     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_INFO     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_DEBUG    (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_VERBOSE  (YES && LOG_ASYNC_ENABLED)\n\n#define DDLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogDebug(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define DDLogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogCDebug(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n/**\n * The THIS_FILE macro gives you an NSString of the file name.\n * For simplicity and clarity, the file name does not include the full path or file extension.\n * \n * For example: DDLogWarn(@\"%@: Unable to find thingy\", THIS_FILE) -> @\"MyViewController: Unable to find thingy\"\n**/\n\nNSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy);\n\n#define THIS_FILE (DDExtractFileNameWithoutExtension(__FILE__, NO))\n\n/**\n * The THIS_METHOD macro gives you the name of the current objective-c method.\n * \n * For example: DDLogWarn(@\"%@ - Requires non-nil strings\", THIS_METHOD) -> @\"setMake:model: requires non-nil strings\"\n * \n * Note: This does NOT work in straight C functions (non objective-c).\n * Instead you should use the predefined __FUNCTION__ macro.\n**/\n\n#define THIS_METHOD NSStringFromSelector(_cmd)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDLog : NSObject\n\n/**\n * Provides access to the underlying logging queue.\n * This may be helpful to Logger classes for things like thread synchronization.\n**/\n\n+ (dispatch_queue_t)loggingQueue;\n\n/**\n * Logging Primitive.\n * \n * This method is used by the macros above.\n * It is suggested you stick with the macros as they're easier to use.\n**/\n\n+ (void)log:(BOOL)synchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format, ... __attribute__ ((format (__NSString__, 9, 10)));\n\n/**\n * Logging Primitive.\n * \n * This method can be used if you have a prepared va_list.\n**/\n\n+ (void)log:(BOOL)asynchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format\n       args:(va_list)argList;\n\n\n/**\n * Since logging can be asynchronous, there may be times when you want to flush the logs.\n * The framework invokes this automatically when the application quits.\n**/\n\n+ (void)flushLog;\n\n/** \n * Loggers\n * \n * If you want your log statements to go somewhere,\n * you should create and add a logger.\n**/\n\n+ (void)addLogger:(id <DDLogger>)logger;    // adds the logger using maximum log level (LOG_LEVEL_VERBOSE)\n\n/**\n * Please use as logLevels the LOG_LEVEL_* macros\n *\n**/\n+ (void)addLogger:(id <DDLogger>)logger withLogLevel:(int)logLevel;\n\n+ (void)removeLogger:(id <DDLogger>)logger;\n+ (void)removeAllLoggers;\n\n/**\n * Registered Dynamic Logging\n * \n * These methods allow you to obtain a list of classes that are using registered dynamic logging,\n * and also provides methods to get and set their log level during run time.\n**/\n\n+ (NSArray *)registeredClasses;\n+ (NSArray *)registeredClassNames;\n\n+ (int)logLevelForClass:(Class)aClass;\n+ (int)logLevelForClassWithName:(NSString *)aClassName;\n\n+ (void)setLogLevel:(int)logLevel forClass:(Class)aClass;\n+ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogger <NSObject>\n@required\n\n- (void)logMessage:(DDLogMessage *)logMessage;\n\n/**\n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n**/\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@optional\n\n/**\n * Since logging is asynchronous, adding and removing loggers is also asynchronous.\n * In other words, the loggers are added and removed at appropriate times with regards to log messages.\n * \n * - Loggers will not receive log messages that were executed prior to when they were added.\n * - Loggers will not receive log messages that were executed after they were removed.\n * \n * These methods are executed in the logging thread/queue.\n * This is the same thread/queue that will execute every logMessage: invocation.\n * Loggers may use these methods for thread synchronization or other setup/teardown tasks.\n**/\n- (void)didAddLogger;\n- (void)willRemoveLogger;\n\n/**\n * Some loggers may buffer IO for optimization purposes.\n * For example, a database logger may only save occasionaly as the disk IO is slow.\n * In such loggers, this method should be implemented to flush any pending IO.\n * \n * This allows invocations of DDLog's flushLog method to be propogated to loggers that need it.\n * \n * Note that DDLog's flushLog method is invoked automatically when the application quits,\n * and it may be also invoked manually by the developer prior to application crashes, or other such reasons.\n**/\n- (void)flush;\n\n/**\n * Each logger is executed concurrently with respect to the other loggers.\n * Thus, a dedicated dispatch queue is used for each logger.\n * Logger implementations may optionally choose to provide their own dispatch queue.\n**/\n- (dispatch_queue_t)loggerQueue;\n\n/**\n * If the logger implementation does not choose to provide its own queue,\n * one will automatically be created for it.\n * The created queue will receive its name from this method.\n * This may be helpful for debugging or profiling reasons.\n**/\n- (NSString *)loggerName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogFormatter <NSObject>\n@required\n\n/**\n * Formatters may optionally be added to any logger.\n * This allows for increased flexibility in the logging environment.\n * For example, log messages for log files may be formatted differently than log messages for the console.\n * \n * For more information about formatters, see the \"Custom Formatters\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The formatter may also optionally filter the log message by returning nil,\n * in which case the logger will not log the message.\n**/\n- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;\n\n@optional\n\n/**\n * A single formatter instance can be added to multiple loggers.\n * These methods provides hooks to notify the formatter of when it's added/removed.\n *\n * This is primarily for thread-safety.\n * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers.\n * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter),\n * it could possibly use these hooks to switch to thread-safe versions of the code.\n**/\n- (void)didAddToLogger:(id <DDLogger>)logger;\n- (void)willRemoveFromLogger:(id <DDLogger>)logger;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDRegisteredDynamicLogging\n\n/**\n * Implement these methods to allow a file's log level to be managed from a central location.\n * \n * This is useful if you'd like to be able to change log levels for various parts\n * of your code from within the running application.\n * \n * Imagine pulling up the settings for your application,\n * and being able to configure the logging level on a per file basis.\n * \n * The implementation can be very straight-forward:\n * \n * + (int)ddLogLevel\n * {\n *     return ddLogLevel;\n * }\n *  \n * + (void)ddSetLogLevel:(int)logLevel\n * {\n *     ddLogLevel = logLevel;\n * }\n**/\n\n+ (int)ddLogLevel;\n+ (void)ddSetLogLevel:(int)logLevel;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogMessage class encapsulates information about the log message.\n * If you write custom loggers or formatters, you will be dealing with objects of this class.\n**/\n\nenum {\n    DDLogMessageCopyFile     = 1 << 0,\n    DDLogMessageCopyFunction = 1 << 1\n};\ntypedef int DDLogMessageOptions;\n\n@interface DDLogMessage : NSObject <NSCopying>\n{\n\n// The public variables below can be accessed directly (for speed).\n// For example: logMessage->logLevel\n    \n@public\n    int logLevel;\n    int logFlag;\n    int logContext;\n    NSString *logMsg;\n    NSDate *timestamp;\n    char *file;\n    char *function;\n    int lineNumber;\n    mach_port_t machThreadID;\n    char *queueLabel;\n    NSString *threadName;\n    \n    // For 3rd party extensions to the framework, where flags and contexts aren't enough.\n    id tag;\n    \n    // For 3rd party extensions that manually create DDLogMessage instances.\n    DDLogMessageOptions options;\n}\n\n/**\n * Standard init method for a log message object.\n * Used by the logging primitives. (And the macros use the logging primitives.)\n * \n * If you find need to manually create logMessage objects, there is one thing you should be aware of:\n * \n * If no flags are passed, the method expects the file and function parameters to be string literals.\n * That is, it expects the given strings to exist for the duration of the object's lifetime,\n * and it expects the given strings to be immutable.\n * In other words, it does not copy these strings, it simply points to them.\n * This is due to the fact that __FILE__ and __FUNCTION__ are usually used to specify these parameters,\n * so it makes sense to optimize and skip the unnecessary allocations.\n * However, if you need them to be copied you may use the options parameter to specify this.\n * Options is a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction.\n**/\n- (instancetype)initWithLogMsg:(NSString *)logMsg\n                         level:(int)logLevel\n                          flag:(int)logFlag\n                       context:(int)logContext\n                          file:(const char *)file\n                      function:(const char *)function\n                          line:(int)line\n                           tag:(id)tag\n                       options:(DDLogMessageOptions)optionsMask;\n\n/**\n * Returns the threadID as it appears in NSLog.\n * That is, it is a hexadecimal value which is calculated from the machThreadID.\n**/\n- (NSString *)threadID;\n\n/**\n * Convenience property to get just the file name, as the file variable is generally the full file path.\n * This method does not include the file extension, which is generally unwanted for logging purposes.\n**/\n- (NSString *)fileName;\n\n/**\n * Returns the function variable in NSString form.\n**/\n- (NSString *)methodName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogger protocol specifies that an optional formatter can be added to a logger.\n * Most (but not all) loggers will want to support formatters.\n * \n * However, writting getters and setters in a thread safe manner,\n * while still maintaining maximum speed for the logging process, is a difficult task.\n * \n * To do it right, the implementation of the getter/setter has strict requiremenets:\n * - Must NOT require the logMessage method to acquire a lock.\n * - Must NOT require the logMessage method to access an atomic property (also a lock of sorts).\n * \n * To simplify things, an abstract logger is provided that implements the getter and setter.\n * \n * Logger implementations may simply extend this class,\n * and they can ACCESS THE FORMATTER VARIABLE DIRECTLY from within their logMessage method!\n**/\n\n@interface DDAbstractLogger : NSObject <DDLogger>\n{\n    id <DDLogFormatter> formatter;\n    \n    dispatch_queue_t loggerQueue;\n}\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n// For thread-safety assertions\n- (BOOL)isOnGlobalLoggingQueue;\n- (BOOL)isOnInternalLoggerQueue;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/DDTTYLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#if TARGET_OS_IPHONE\n#import <UIKit/UIColor.h>   // iOS\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n#import <AppKit/NSColor.h>  // OS X with AppKit\n#else\n#import \"CLIColor.h\"        // OS X without AppKit\n#endif\n\n#import \"DDLog.h\"\n\n#define LOG_CONTEXT_ALL INT_MAX\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for Terminal output or Xcode console output,\n * depending on where you are running your code.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log (so it shows up in Console.app)\n * - StdErr (if stderr is a TTY, so log statements show up in Xcode console)\n * \n * To duplicate NSLog() functionality you can simply add this logger and an asl logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use only a file logger and a tty logger.\n**/\n\n@interface DDTTYLogger : DDAbstractLogger <DDLogger>\n{\n    NSCalendar *calendar;\n    NSUInteger calendarUnitFlags;\n    \n    NSString *appName;\n    char *app;\n    size_t appLen;\n    \n    NSString *processID;\n    char *pid;\n    size_t pidLen;\n    \n    BOOL colorsEnabled;\n    NSMutableArray *colorProfilesArray;\n    NSMutableDictionary *colorProfilesDict;\n}\n\n+ (instancetype)sharedInstance;\n\n/* Inherited from the DDLogger protocol:\n * \n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n * \n * More information about formatters can be found here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The actual implementation of these methods is inherited from DDAbstractLogger.\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n \n*/\n\n/**\n * Want to use different colors for different log levels?\n * Enable this property.\n * \n * If you run the application via the Terminal (not Xcode),\n * the logger will map colors to xterm-256color or xterm-color (if available).\n * \n * Xcode does NOT natively support colors in the Xcode debugging console.\n * You'll need to install the XcodeColors plugin to see colors in the Xcode console.\n * https://github.com/robbiehanson/XcodeColors\n * \n * The default value if NO.\n**/\n@property (readwrite, assign) BOOL colorsEnabled;\n\n/**\n * The default color set (foregroundColor, backgroundColor) is:\n * \n * - LOG_FLAG_ERROR = (red, nil)\n * - LOG_FLAG_WARN  = (orange, nil)\n * \n * You can customize the colors however you see fit.\n * Please note that you are passing a flag, NOT a level.\n * \n * GOOD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_FLAG_INFO];  // <- Good :)\n *  BAD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_LEVEL_INFO]; // <- BAD! :(\n * \n * LOG_FLAG_INFO  = 0...00100\n * LOG_LEVEL_INFO = 0...00111 <- Would match LOG_FLAG_INFO and LOG_FLAG_WARN and LOG_FLAG_ERROR\n * \n * If you run the application within Xcode, then the XcodeColors plugin is required.\n * \n * If you run the application from a shell, then DDTTYLogger will automatically map the given color to\n * the closest available color. (xterm-256color or xterm-color which have 256 and 16 supported colors respectively.)\n * \n * This method invokes setForegroundColor:backgroundColor:forFlag:context: and applies it to `LOG_CONTEXT_ALL`.\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask;\n#endif\n\n/**\n * Just like setForegroundColor:backgroundColor:flag, but allows you to specify a particular logging context.\n * \n * A logging context is often used to identify log messages coming from a 3rd party framework,\n * although logging context's can be used for many different functions.\n * \n * Use LOG_CONTEXT_ALL to set the deafult color for all contexts that have no specific color set defined.\n * \n * Logging context's are explained in further detail here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomContext\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#endif\n\n/**\n * Similar to the methods above, but allows you to map DDLogMessage->tag to a particular color profile.\n * For example, you could do something like this:\n * \n * static NSString *const PurpleTag = @\"PurpleTag\";\n * \n * #define DDLogPurple(frmt, ...) LOG_OBJC_TAG_MACRO(NO, 0, 0, 0, PurpleTag, frmt, ##__VA_ARGS__)\n * \n * And then in your applicationDidFinishLaunching, or wherever you configure Lumberjack:\n * \n * #if TARGET_OS_IPHONE\n *   UIColor *purple = [UIColor colorWithRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n * #else\n *   NSColor *purple = [NSColor colorWithCalibratedRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n *\n * Note: For CLI OS X projects that don't link with AppKit use CLIColor objects instead\n * \n * [[DDTTYLogger sharedInstance] setForegroundColor:purple backgroundColor:nil forTag:PurpleTag];\n * [DDLog addLogger:[DDTTYLogger sharedInstance]];\n * \n * This would essentially give you a straight NSLog replacement that prints in purple:\n * \n * DDLogPurple(@\"I'm a purple log message!\");\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forTag:(id <NSCopying>)tag;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forTag:(id <NSCopying>)tag;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forTag:(id <NSCopying>)tag;\n#endif\n\n/**\n * Clearing color profiles.\n**/\n- (void)clearColorsForFlag:(int)mask;\n- (void)clearColorsForFlag:(int)mask context:(int)context;\n- (void)clearColorsForTag:(id <NSCopying>)tag;\n- (void)clearColorsForAllFlags;\n- (void)clearColorsForAllTags;\n- (void)clearAllColors;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/NSJSONSerialization+ObjectWithNString.h",
    "content": "//\n//  NSJSONSerialization+ObjectWithNString.h\n//  Ejecta\n//\n//  Created by matth on 7/19/13.\n//\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (ObjectWithNString)\n+ (id)JSONObjectWithString:(NSString *)string options:(NSJSONReadingOptions)opt error:(NSError **)error;\n+ (NSString*)stringWithNSDictionary:(NSDictionary*)dictionary;\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/NSJSONSerialization+PBJSONHelpers.h",
    "content": "//\n//  NSJSONSerialization+PBJSONHelpers.h\n//  PebbleVendor\n//\n//  Created by matth on 9/17/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (PBJSONHelpers)\n\n/** @name Reflection helpers */\n\n/**\n * Derived from the Box SDK (MIT license) NSJSONSerialization+BoxAdditions...\n * https://github.com/box/box-ios-sdk-v2/tree/master/BoxSDK/Categories\n \n * Ensure that the object at `key` in `dictionary` is a member of the expected class.\n * `NSNull` may be specified as an allowable value. This method may return nil if `key`\n * is not present in `dictionary`.\n *\n * @param key The key to lookup in `dictionary`.\n * @param dictionary A dictionary resulting from deserializing a JSON object.\n * @param cls The expected class of the value at key.\n * @param nullAllowed If true, `NSNull` will be returned. If not, NSNull will be converted to nil. Property getters that pass `YES` for this parameter should have the return type of `id`.\n *\n * @return The object at `key` in `dictionary` if expectations are satisfied; `nil` otherwise.\n */\n+ (id)ensureObjectForKey:(NSString *)key inDictionary:(NSDictionary *)dictionary hasExpectedType:(Class)cls nullAllowed:(BOOL)nullAllowed;\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/NSString+HexData.h",
    "content": "//\n//  NSString+HexData.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 11/19/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSString (HexData)\n\n- (NSData*)hexData;\n\n@end\n\n\n@interface NSData (HexString)\n\n- (NSString*)hexString;\n\n@end"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/A/Headers/UIDevice-Hardware.h",
    "content": "/*\n Erica Sadun, http://ericasadun.com\n iPhone Developer's Cookbook, 6.x Edition\n BSD License, Use at your own risk\n */\n\n#import <UIKit/UIKit.h>\n\ntypedef enum {\n    UIDeviceFamilyiPhone,\n    UIDeviceFamilyiPod,\n    UIDeviceFamilyiPad,\n    UIDeviceFamilyAppleTV,\n    UIDeviceFamilyUnknown,\n    \n} UIDeviceFamily;\n\n@interface UIDevice (Hardware)\n- (NSString *) platform;\n- (NSString *) hwmodel;\n- (NSString *) platformString;\n\n- (NSUInteger) cpuFrequency;\n- (NSUInteger) busFrequency;\n- (NSUInteger) cpuCount;\n- (NSUInteger) totalMemory;\n- (NSUInteger) userMemory;\n\n- (NSNumber *) totalDiskSpace;\n- (NSNumber *) freeDiskSpace;\n\n- (NSString *) macaddress;\n\n- (BOOL) hasRetinaDisplay;\n- (BOOL) hasBluetoothMAP;\n- (UIDeviceFamily) deviceFamily;\n@end"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/CHMultiDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMultiDictionary.h\n \n Copyright (c) 2008-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n#import \"CHMutableDictionary.h\"\n\n/**\n @file CHMultiDictionary.h\n \n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> in which multiple values may be associated with a given key.\n */\n\n/**\n A <a href=\"http://en.wikipedia.org/wiki/Multimap_(data_structure)\">multimap</a> implementation, in which multiple values may be associated with a given key.\n \n A map is the same as a \"dictionary\", \"associative array\", etc. and consists of a unique set of keys and a collection of values. In a standard map, each key is associated with one value; in a multimap, more than one value may be associated with a given key. A multimap is appropriate for any situation in which one item may correspond to (map to) multiple values, such as a term in an book index and occurrences of that term, courses for which a student is registered, etc.\n \n The values for a key may or may not be ordered. This implementation does not maintain an ordering for objects associated with a key, nor does it allow for multiple occurrences of an object associated with the same key. Internally, this class uses an NSMutableDictionary, and the associated values for each key are stored in distinct NSMutableSet instances. (Just as with NSDictionary, each key added to a CHMultiDictionary is copied using \\link NSCopying#copyWithZone: -copyWithZone:\\endlink and all keys must conform to the NSCopying protocol.) Objects are retained on insertion and released on removal or deallocation.\n \n Since NSDictionary and NSSet conform to the NSCoding protocol, any internal data can be serialized. However, NSSet cannot automatically be written to or read from a property list, since it has no specified order. Thus, instances of CHMultiDictionary must be encoded as an NSData object before saving to disk.\n \n Currently, this implementation does not support key-value coding, observing, or binding like NSDictionary does. Consequently, the distinction between \"object\" and \"value\" is blurrier, although hopefully consistent with the Cocoa APIs in general....\n \n Unlike NSDictionary and other Cocoa collections, CHMultiDictionary has not been designed with mutable and immutable variants. A multimap is not that much more useful if it is immutable, so any copies made of this class are mutable by definition.\n */\n@interface CHMultiDictionary : CHMutableDictionary {\n\tNSUInteger objectCount; // Number of objects currently in the dictionary.\n}\n\n#pragma mark Querying Contents\n\n/**\n Returns the number of objects in the receiver, associated with any key.\n \n @return The number of objects in the receiver. This is the sum total of objects associated with each key in the dictonary.\n \n @see allObjects\n */\n- (NSUInteger) countForAllKeys;\n\n/**\n Returns the number of objects associated with a given key.\n \n @param aKey The key for which to return the object count.\n @return The number of objects associated with a given key in the dictionary.\n \n @see objectsForKey:\n */\n- (NSUInteger) countForKey:(id)aKey;\n\n/**\n Returns an array of objects associated with a given key.\n \n @param aKey The key for which to return the corresponding objects.\n @return An NSSet of objects associated with a given key, or nil if the key is not in the receiver.\n \n @see countForKey:\n @see removeObjectsForKey:\n */\n- (NSSet*) objectsForKey:(id)aKey;\n\n#pragma mark Modifying Contents\n\n/**\n Adds a given object to an entry for a given key in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param anObject An object to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#addObject: -[NSMutableSet addObject:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObject:(id)anObject forKey:(id)aKey;\n\n/**\n Adds the given object(s) to a key entry in the receiver.\n \n @param aKey The key with which to associate @a anObject.\n @param objectSet A set of objects to add to an entry for @a aKey in the receiver. If an entry for @a aKey already exists in the receiver, @a anObject is added using \\link NSMutableSet#unionSet: -[NSMutableSet unionSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n @see setObjects:forKey:\n */\n- (void) addObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n/**\n Remove @b all occurrences of @a anObject associated with a given key.\n \n @param aKey The key for which to remove an entry.\n @param anObject An object (possibly) associated with @a aKey in the receiver. Objects are considered to be equal if -compare: returns NSOrderedSame.\n \n @throw NSInvalidArgumentException if @a aKey or @a anObject is @c nil.\n \n If @a aKey does not exist in the receiver, or if @a anObject is not associated with @a aKey, the contents of the receiver are not modified.\n \n @see containsObject\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) removeObject:(id)anObject forKey:(id)aKey;\n\n/**\n Remove a given key and its associated value(s) from the receiver.\n \n @param aKey The key for which to remove an entry.\n \n If @a aKey does not exist in the receiver, there is no effect on the receiver.\n \n @see objectsForKey:\n @see removeObject:forKey:\n */\n- (void) removeObjectsForKey:(id)aKey;\n\n/**\n Sets the object(s) associated with a key entry in the receiver.\n \n @param aKey The key with which to associate the objects in @a objectSet.\n @param objectSet A set of objects to associate with @a key. If @a objectSet is empty, the contents of the receiver are not modified. If an entry for @a key already exists in the receiver, @a objectSet is added using \\link NSMutableSet#setSet: -[NSMutableSet setSet:]\\endlink, otherwise a new entry is created.\n \n @throw NSInvalidArgumentException if @a aKey or @a objectSet is @c nil.\n \n @see addObject:forKey:\n @see addObjects:forKey:\n @see objectsForKey:\n @see removeObjectsForKey:\n */\n- (void) setObjects:(NSSet*)objectSet forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/CHMutableDictionary.h",
    "content": "/*\n CHDataStructures.framework -- CHMutableDictionary.h\n \n Copyright (c) 2009-2010, Quinn Taylor <http://homepage.mac.com/quinntaylor>\n \n This source code is released under the ISC License. <http://www.opensource.org/licenses/isc-license>\n \n Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n \n The software is  provided \"as is\", without warranty of any kind, including all implied warranties of merchantability and fitness. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.\n */\n\n__attribute__((visibility(\"hidden\"))) void createCollectableCFMutableDictionary(CFMutableDictionaryRef* dictionary, NSUInteger initialCapacity);\n\n/**\n @file CHMutableDictionary.h\n \n A mutable dictionary class.\n */\n\n/**\n A mutable dictionary class.\n \n A CFMutableDictionaryRef is used internally to store the key-value pairs. Subclasses may choose to add other instance variables to enable a specific ordering of keys, override methods to modify behavior, and add methods to extend existing behaviors. However, all subclasses should behave like a standard Cocoa dictionary as much as possible, and document clearly when they do not.\n \n @note Any method inherited from NSDictionary or NSMutableDictionary is supported by this class and its children. Please see the documentation for those classes for details.\n \n @todo Implement @c -copy and @c -mutableCopy differently (so users can actually obtain an immutable copy) and make mutation methods aware of immutability?\n */\n@interface CHMutableDictionary : NSMutableDictionary {\n  CFMutableDictionaryRef dictionary; // A Core Foundation dictionary.\n}\n\n- (id) initWithCapacity:(NSUInteger)numItems;\n\n- (NSUInteger) count;\n- (NSEnumerator*) keyEnumerator;\n- (id) objectForKey:(id)aKey;\n- (void) removeAllObjects;\n- (void) removeObjectForKey:(id)aKey;\n- (void) setObject:(id)anObject forKey:(id)aKey;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/DDASLLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import <asl.h>\n\n#import \"DDLog.h\"\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for the Apple System Log facility.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log\n * - StdErr (if stderr is a TTY) so log statements show up in Xcode console\n * \n * To duplicate NSLog() functionality you can simply add this logger and a tty logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use a file logger and a tty logger.\n**/\n\n@interface DDASLLogger : DDAbstractLogger <DDLogger>\n{\n    aslclient client;\n}\n\n+ (instancetype)sharedInstance;\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/DDFileLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"DDLog.h\"\n\n@class DDLogFileInfo;\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger to write log statements to a file.\n**/\n\n\n// Default configuration and safety/sanity values.\n// \n// maximumFileSize         -> DEFAULT_LOG_MAX_FILE_SIZE\n// rollingFrequency        -> DEFAULT_LOG_ROLLING_FREQUENCY\n// maximumNumberOfLogFiles -> DEFAULT_LOG_MAX_NUM_LOG_FILES\n// \n// You should carefully consider the proper configuration values for your application.\n\n#define DEFAULT_LOG_MAX_FILE_SIZE     (1024 * 1024)   //  1 MB\n#define DEFAULT_LOG_ROLLING_FREQUENCY (60 * 60 * 24)  // 24 Hours\n#define DEFAULT_LOG_MAX_NUM_LOG_FILES (5)             //  5 Files\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// The LogFileManager protocol is designed to allow you to control all aspects of your log files.\n// \n// The primary purpose of this is to allow you to do something with the log files after they have been rolled.\n// Perhaps you want to compress them to save disk space.\n// Perhaps you want to upload them to an FTP server.\n// Perhaps you want to run some analytics on the file.\n// \n// A default LogFileManager is, of course, provided.\n// The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property.\n// \n// This protocol provides various methods to fetch the list of log files.\n// \n// There are two variants: sorted and unsorted.\n// If sorting is not necessary, the unsorted variant is obviously faster.\n// The sorted variant will return an array sorted by when the log files were created,\n// with the most recently created log file at index 0, and the oldest log file at the end of the array.\n// \n// You can fetch only the log file paths (full path including name), log file names (name only),\n// or an array of DDLogFileInfo objects.\n// The DDLogFileInfo class is documented below, and provides a handy wrapper that\n// gives you easy access to various file attributes such as the creation date or the file size.\n\n@protocol DDLogFileManager <NSObject>\n@required\n\n// Public properties\n\n/**\n * The maximum number of archived log files to keep on disk.\n * For example, if this property is set to 3,\n * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk.\n * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted.\n * \n * You may optionally disable deleting old/rolled/archived log files by setting this property to zero.\n**/\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n// Public methods\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n// Private methods (only to be used by DDFileLogger)\n\n- (NSString *)createNewLogFile;\n\n@optional\n\n// Notifications from DDFileLogger\n\n- (void)didArchiveLogFile:(NSString *)logFilePath;\n- (void)didRollAndArchiveLogFile:(NSString *)logFilePath;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Default log file manager.\n * \n * All log files are placed inside the logsDirectory.\n * If a specific logsDirectory isn't specified, the default directory is used.\n * On Mac, this is in ~/Library/Logs/<Application Name>.\n * On iPhone, this is in ~/Library/Caches/Logs.\n * \n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n * \n * Archived log files are automatically deleted according to the maximumNumberOfLogFiles property.\n**/\n@interface DDLogFileManagerDefault : NSObject <DDLogFileManager>\n{\n    NSUInteger maximumNumberOfLogFiles;\n    NSString *_logsDirectory;\n}\n\n- (id)init;\n- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory;\n\n/*\n * Methods to override.\n *\n * Log files are named \"<bundle identifier> <date> <time>.log\"\n * Example: com.organization.myapp 2013-12-03 17-14.log\n *\n * If you wish to change default filename, you can override following two methods.\n * - newLogFileName method would be called on new logfile creation.\n * - isLogFile: method would be called to filter logfiles from all other files in logsDirectory.\n *   You have to parse given filename and return YES if it is logFile.\n *\n * **NOTE**\n * newLogFileName returns filename. If appropriate file already exists, number would be added\n * to filename before extension. You have to handle this case in isLogFile: method.\n *\n * Example:\n * - newLogFileName returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 2.log\" would be created.\n * - after some time \"com.organization.myapp 2013-12-03 1.log\" is archived\n * - newLogFileName again returns \"com.organization.myapp 2013-12-03.log\",\n *   file \"com.organization.myapp 2013-12-03 3.log\" would be created.\n**/\n- (NSString *)newLogFileName;\n- (BOOL)isLogFile:(NSString *)fileName;\n\n/* Inherited from DDLogFileManager protocol:\n\n@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles;\n\n- (NSString *)logsDirectory;\n\n- (NSArray *)unsortedLogFilePaths;\n- (NSArray *)unsortedLogFileNames;\n- (NSArray *)unsortedLogFileInfos;\n\n- (NSArray *)sortedLogFilePaths;\n- (NSArray *)sortedLogFileNames;\n- (NSArray *)sortedLogFileInfos;\n\n*/\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Most users will want file log messages to be prepended with the date and time.\n * Rather than forcing the majority of users to write their own formatter,\n * we will supply a logical default formatter.\n * Users can easily replace this formatter with their own by invoking the setLogFormatter method.\n * It can also be removed by calling setLogFormatter, and passing a nil parameter.\n * \n * In addition to the convenience of having a logical default formatter,\n * it will also provide a template that makes it easy for developers to copy and change.\n**/\n@interface DDLogFileFormatterDefault : NSObject <DDLogFormatter>\n{\n    NSDateFormatter *dateFormatter;\n}\n\n- (id)init;\n- (instancetype)initWithDateFormatter:(NSDateFormatter *)dateFormatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDFileLogger : DDAbstractLogger <DDLogger>\n{\n    __strong id <DDLogFileManager> logFileManager;\n    \n    DDLogFileInfo *currentLogFileInfo;\n    NSFileHandle *currentLogFileHandle;\n    \n    dispatch_source_t currentLogFileVnode;\n    dispatch_source_t rollingTimer;\n    \n    unsigned long long maximumFileSize;\n    NSTimeInterval rollingFrequency;\n}\n\n- (id)init;\n- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)logFileManager;\n\n/**\n * Log File Rolling:\n * \n * maximumFileSize:\n *   The approximate maximum size to allow log files to grow.\n *   If a log file is larger than this value after a log statement is appended,\n *   then the log file is rolled.\n * \n * rollingFrequency\n *   How often to roll the log file.\n *   The frequency is given as an NSTimeInterval, which is a double that specifies the interval in seconds.\n *   Once the log file gets to be this old, it is rolled.\n * \n * Both the maximumFileSize and the rollingFrequency are used to manage rolling.\n * Whichever occurs first will cause the log file to be rolled.\n * \n * For example:\n * The rollingFrequency is 24 hours,\n * but the log file surpasses the maximumFileSize after only 20 hours.\n * The log file will be rolled at that 20 hour mark.\n * A new log file will be created, and the 24 hour timer will be restarted.\n * \n * You may optionally disable rolling due to filesize by setting maximumFileSize to zero.\n * If you do so, rolling is based solely on rollingFrequency.\n * \n * You may optionally disable rolling due to time by setting rollingFrequency to zero (or any non-positive number).\n * If you do so, rolling is based solely on maximumFileSize.\n * \n * If you disable both maximumFileSize and rollingFrequency, then the log file won't ever be rolled.\n * This is strongly discouraged.\n**/\n@property (readwrite, assign) unsigned long long maximumFileSize;\n@property (readwrite, assign) NSTimeInterval rollingFrequency;\n\n/**\n * The DDLogFileManager instance can be used to retrieve the list of log files,\n * and configure the maximum number of archived log files to keep.\n * \n * @see DDLogFileManager.maximumNumberOfLogFiles\n**/\n@property (strong, nonatomic, readonly) id <DDLogFileManager> logFileManager;\n\n\n// You can optionally force the current log file to be rolled with this method.\n// CompletionBlock will be called on main queue.\n\n- (void)rollLogFileWithCompletionBlock:(void (^)())completionBlock;\n\n// Method is deprecated. Use rollLogFileWithCompletionBlock: method instead.\n\n- (void)rollLogFile __attribute((deprecated));\n\n// Inherited from DDAbstractLogger\n\n// - (id <DDLogFormatter>)logFormatter;\n// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * DDLogFileInfo is a simple class that provides access to various file attributes.\n * It provides good performance as it only fetches the information if requested,\n * and it caches the information to prevent duplicate fetches.\n * \n * It was designed to provide quick snapshots of the current state of log files,\n * and to help sort log files in an array.\n * \n * This class does not monitor the files, or update it's cached attribute values if the file changes on disk.\n * This is not what the class was designed for.\n * \n * If you absolutely must get updated values,\n * you can invoke the reset method which will clear the cache.\n**/\n@interface DDLogFileInfo : NSObject\n{\n    __strong NSString *filePath;\n    __strong NSString *fileName;\n    \n    __strong NSDictionary *fileAttributes;\n    \n    __strong NSDate *creationDate;\n    __strong NSDate *modificationDate;\n    \n    unsigned long long fileSize;\n}\n\n@property (strong, nonatomic, readonly) NSString *filePath;\n@property (strong, nonatomic, readonly) NSString *fileName;\n\n@property (strong, nonatomic, readonly) NSDictionary *fileAttributes;\n\n@property (strong, nonatomic, readonly) NSDate *creationDate;\n@property (strong, nonatomic, readonly) NSDate *modificationDate;\n\n@property (nonatomic, readonly) unsigned long long fileSize;\n\n@property (nonatomic, readonly) NSTimeInterval age;\n\n@property (nonatomic, readwrite) BOOL isArchived;\n\n+ (instancetype)logFileWithPath:(NSString *)filePath;\n\n- (instancetype)initWithFilePath:(NSString *)filePath;\n\n- (void)reset;\n- (void)renameFile:(NSString *)newFileName;\n\n#if TARGET_IPHONE_SIMULATOR\n\n// So here's the situation.\n// Extended attributes are perfect for what we're trying to do here (marking files as archived).\n// This is exactly what extended attributes were designed for.\n// \n// But Apple screws us over on the simulator.\n// Everytime you build-and-go, they copy the application into a new folder on the hard drive,\n// and as part of the process they strip extended attributes from our log files.\n// Normally, a copy of a file preserves extended attributes.\n// So obviously Apple has gone to great lengths to piss us off.\n// \n// Thus we use a slightly different tactic for marking log files as archived in the simulator.\n// That way it \"just works\" and there's no confusion when testing.\n// \n// The difference in method names is indicative of the difference in functionality.\n// On the simulator we add an attribute by appending a filename extension.\n// \n// For example:\n// log-ABC123.txt -> log-ABC123.archived.txt\n\n- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName;\n\n- (void)addExtensionAttributeWithName:(NSString *)attrName;\n- (void)removeExtensionAttributeWithName:(NSString *)attrName;\n\n#else\n\n// Normal use of extended attributes used everywhere else,\n// such as on Macs and on iPhone devices.\n\n- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName;\n\n- (void)addExtendedAttributeWithName:(NSString *)attrName;\n- (void)removeExtendedAttributeWithName:(NSString *)attrName;\n\n#endif\n\n- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another;\n- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/DDLog.h",
    "content": "#import <Foundation/Foundation.h>\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * Otherwise, here is a quick refresher.\n * There are three steps to using the macros:\n * \n * Step 1:\n * Import the header in your implementation file:\n * \n * #import \"DDLog.h\"\n * \n * Step 2:\n * Define your logging level in your implementation file:\n * \n * // Log levels: off, error, warn, info, verbose\n * static const int ddLogLevel = LOG_LEVEL_VERBOSE;\n * \n * Step 2 [3rd party frameworks]:\n *\n * Define your LOG_LEVEL_DEF to a different variable/function than ddLogLevel:\n *\n * // #undef LOG_LEVEL_DEF // Undefine first only if needed\n * #define LOG_LEVEL_DEF myLibLogLevel\n *\n * Define your logging level in your implementation file:\n *\n * // Log levels: off, error, warn, info, verbose\n * static const int myLibLogLevel = LOG_LEVEL_VERBOSE;\n *\n * Step 3:\n * Replace your NSLog statements with DDLog statements according to the severity of the message.\n * \n * NSLog(@\"Fatal error, no dohickey found!\"); -> DDLogError(@\"Fatal error, no dohickey found!\");\n * \n * DDLog works exactly the same as NSLog.\n * This means you can pass it multiple variables just like NSLog.\n**/\n\n#ifndef LOG_LEVEL_DEF\n    #define LOG_LEVEL_DEF ddLogLevel\n#endif\n\n@class DDLogMessage;\n\n@protocol DDLogger;\n@protocol DDLogFormatter;\n\n/**\n * This is the single macro that all other macros below compile into.\n * This big multiline macro makes all the other macros easier to read.\n**/\n\n#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \\\n  [DDLog log:isAsynchronous                                             \\\n       level:lvl                                                        \\\n        flag:flg                                                        \\\n     context:ctx                                                        \\\n        file:__FILE__                                                   \\\n    function:fnct                                                       \\\n        line:__LINE__                                                   \\\n         tag:atag                                                       \\\n      format:(frmt), ##__VA_ARGS__]\n\n/**\n * Define the Objective-C and C versions of the macro.\n * These automatically inject the proper function name for either an objective-c method or c function.\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_OBJC_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MACRO(async, lvl, flg, ctx, nil, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MACRO(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MACRO(async, lvl, flg, ctx, nil, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define version of the macro that only execute if the logLevel is above the threshold.\n * The compiled versions essentially look like this:\n * \n * if (logFlagForThisLogMsg & ddLogLevel) { execute log message }\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels.\n * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques.\n * \n * Note that when compiler optimizations are enabled (as they are for your release builds),\n * the log messages above your logging threshold will automatically be compiled out.\n * \n * (If the compiler sees ddLogLevel declared as a constant, the compiler simply checks to see if the 'if' statement\n *  would execute, and if not it strips it from the binary.)\n * \n * We also define shorthand versions for asynchronous and synchronous logging.\n**/\n\n#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n             LOG_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_MAYBE(async, lvl, flg, ctx, frmt, ...) \\\n          LOG_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_OBJC_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define  SYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n#define ASYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \\\n              LOG_C_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)\n\n/**\n * Define versions of the macros that also accept tags.\n * \n * The DDLogMessage object includes a 'tag' ivar that may be used for a variety of purposes.\n * It may be used to pass custom information to loggers or formatters.\n * Or it may be used by 3rd party extensions to the framework.\n * \n * Thes macros just make it a little easier to extend logging functionality.\n**/\n\n#define LOG_OBJC_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n                 LOG_MACRO(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \\\n              LOG_MACRO(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n#define LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \\\n  do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)\n\n#define LOG_OBJC_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n             LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)\n\n#define LOG_C_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \\\n          LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)\n\n/**\n * Define the standard options.\n * \n * We default to only 4 levels because it makes it easier for beginners\n * to make the transition to a logging framework.\n * \n * More advanced users may choose to completely customize the levels (and level names) to suite their needs.\n * For more information on this see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n * \n * Advanced users may also notice that we're using a bitmask.\n * This is to allow for custom fine grained logging:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/FineGrainedLogging\n * \n * -- Flags --\n * \n * Typically you will use the LOG_LEVELS (see below), but the flags may be used directly in certain situations.\n * For example, say you have a lot of warning log messages, and you wanted to disable them.\n * However, you still needed to see your error and info log messages.\n * You could accomplish that with the following:\n * \n * static const int ddLogLevel = LOG_FLAG_ERROR | LOG_FLAG_INFO;\n * \n * When LOG_LEVEL_DEF is defined as ddLogLevel.\n *\n * Flags may also be consulted when writing custom log formatters,\n * as the DDLogMessage class captures the individual flag that caused the log message to fire.\n * \n * -- Levels --\n * \n * Log levels are simply the proper bitmask of the flags.\n * \n * -- Booleans --\n * \n * The booleans may be used when your logging code involves more than one line.\n * For example:\n * \n * if (LOG_VERBOSE) {\n *     for (id sprocket in sprockets)\n *         DDLogVerbose(@\"sprocket: %@\", [sprocket description])\n * }\n * \n * -- Async --\n * \n * Defines the default asynchronous options.\n * The default philosophy for asynchronous logging is very simple:\n * \n * Log messages with errors should be executed synchronously.\n *     After all, an error just occurred. The application could be unstable.\n * \n * All other log messages, such as debug output, are executed asynchronously.\n *     After all, if it wasn't an error, then it was just informational output,\n *     or something the application was easily able to recover from.\n * \n * -- Changes --\n * \n * You are strongly discouraged from modifying this file.\n * If you do, you make it more difficult on yourself to merge future bug fixes and improvements from the project.\n * Instead, create your own MyLogging.h or ApplicationNameLogging.h or CompanyLogging.h\n * \n * For an example of customizing your logging experience, see the \"Custom Log Levels\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels\n**/\n\n#define LOG_FLAG_ERROR    (1 << 0)  // 0...00001\n#define LOG_FLAG_WARN     (1 << 1)  // 0...00010\n#define LOG_FLAG_INFO     (1 << 2)  // 0...00100\n#define LOG_FLAG_DEBUG    (1 << 3)  // 0...01000\n#define LOG_FLAG_VERBOSE  (1 << 4)  // 0...10000\n\n#define LOG_LEVEL_OFF     0\n#define LOG_LEVEL_ERROR   (LOG_FLAG_ERROR)                                                                          // 0...00001\n#define LOG_LEVEL_WARN    (LOG_FLAG_ERROR | LOG_FLAG_WARN)                                                          // 0...00011\n#define LOG_LEVEL_INFO    (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO)                                          // 0...00111\n#define LOG_LEVEL_DEBUG   (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG)                         // 0...01111\n#define LOG_LEVEL_VERBOSE (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG | LOG_FLAG_VERBOSE)      // 0...11111\n\n#define LOG_ERROR    (LOG_LEVEL_DEF & LOG_FLAG_ERROR)\n#define LOG_WARN     (LOG_LEVEL_DEF & LOG_FLAG_WARN)\n#define LOG_INFO     (LOG_LEVEL_DEF & LOG_FLAG_INFO)\n#define LOG_DEBUG    (LOG_LEVEL_DEF & LOG_FLAG_DEBUG)\n#define LOG_VERBOSE  (LOG_LEVEL_DEF & LOG_FLAG_VERBOSE)\n\n#define LOG_ASYNC_ENABLED YES\n\n#define LOG_ASYNC_ERROR    ( NO && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_WARN     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_INFO     (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_DEBUG    (YES && LOG_ASYNC_ENABLED)\n#define LOG_ASYNC_VERBOSE  (YES && LOG_ASYNC_ENABLED)\n\n#define DDLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogDebug(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n#define DDLogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)\n#define DDLogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)\n#define DDLogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)\n#define DDLogCDebug(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)\n#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)\n\n/**\n * The THIS_FILE macro gives you an NSString of the file name.\n * For simplicity and clarity, the file name does not include the full path or file extension.\n * \n * For example: DDLogWarn(@\"%@: Unable to find thingy\", THIS_FILE) -> @\"MyViewController: Unable to find thingy\"\n**/\n\nNSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy);\n\n#define THIS_FILE (DDExtractFileNameWithoutExtension(__FILE__, NO))\n\n/**\n * The THIS_METHOD macro gives you the name of the current objective-c method.\n * \n * For example: DDLogWarn(@\"%@ - Requires non-nil strings\", THIS_METHOD) -> @\"setMake:model: requires non-nil strings\"\n * \n * Note: This does NOT work in straight C functions (non objective-c).\n * Instead you should use the predefined __FUNCTION__ macro.\n**/\n\n#define THIS_METHOD NSStringFromSelector(_cmd)\n\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDLog : NSObject\n\n/**\n * Provides access to the underlying logging queue.\n * This may be helpful to Logger classes for things like thread synchronization.\n**/\n\n+ (dispatch_queue_t)loggingQueue;\n\n/**\n * Logging Primitive.\n * \n * This method is used by the macros above.\n * It is suggested you stick with the macros as they're easier to use.\n**/\n\n+ (void)log:(BOOL)synchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format, ... __attribute__ ((format (__NSString__, 9, 10)));\n\n/**\n * Logging Primitive.\n * \n * This method can be used if you have a prepared va_list.\n**/\n\n+ (void)log:(BOOL)asynchronous\n      level:(int)level\n       flag:(int)flag\n    context:(int)context\n       file:(const char *)file\n   function:(const char *)function\n       line:(int)line\n        tag:(id)tag\n     format:(NSString *)format\n       args:(va_list)argList;\n\n\n/**\n * Since logging can be asynchronous, there may be times when you want to flush the logs.\n * The framework invokes this automatically when the application quits.\n**/\n\n+ (void)flushLog;\n\n/** \n * Loggers\n * \n * If you want your log statements to go somewhere,\n * you should create and add a logger.\n**/\n\n+ (void)addLogger:(id <DDLogger>)logger;    // adds the logger using maximum log level (LOG_LEVEL_VERBOSE)\n\n/**\n * Please use as logLevels the LOG_LEVEL_* macros\n *\n**/\n+ (void)addLogger:(id <DDLogger>)logger withLogLevel:(int)logLevel;\n\n+ (void)removeLogger:(id <DDLogger>)logger;\n+ (void)removeAllLoggers;\n\n/**\n * Registered Dynamic Logging\n * \n * These methods allow you to obtain a list of classes that are using registered dynamic logging,\n * and also provides methods to get and set their log level during run time.\n**/\n\n+ (NSArray *)registeredClasses;\n+ (NSArray *)registeredClassNames;\n\n+ (int)logLevelForClass:(Class)aClass;\n+ (int)logLevelForClassWithName:(NSString *)aClassName;\n\n+ (void)setLogLevel:(int)logLevel forClass:(Class)aClass;\n+ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogger <NSObject>\n@required\n\n- (void)logMessage:(DDLogMessage *)logMessage;\n\n/**\n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n**/\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n@optional\n\n/**\n * Since logging is asynchronous, adding and removing loggers is also asynchronous.\n * In other words, the loggers are added and removed at appropriate times with regards to log messages.\n * \n * - Loggers will not receive log messages that were executed prior to when they were added.\n * - Loggers will not receive log messages that were executed after they were removed.\n * \n * These methods are executed in the logging thread/queue.\n * This is the same thread/queue that will execute every logMessage: invocation.\n * Loggers may use these methods for thread synchronization or other setup/teardown tasks.\n**/\n- (void)didAddLogger;\n- (void)willRemoveLogger;\n\n/**\n * Some loggers may buffer IO for optimization purposes.\n * For example, a database logger may only save occasionaly as the disk IO is slow.\n * In such loggers, this method should be implemented to flush any pending IO.\n * \n * This allows invocations of DDLog's flushLog method to be propogated to loggers that need it.\n * \n * Note that DDLog's flushLog method is invoked automatically when the application quits,\n * and it may be also invoked manually by the developer prior to application crashes, or other such reasons.\n**/\n- (void)flush;\n\n/**\n * Each logger is executed concurrently with respect to the other loggers.\n * Thus, a dedicated dispatch queue is used for each logger.\n * Logger implementations may optionally choose to provide their own dispatch queue.\n**/\n- (dispatch_queue_t)loggerQueue;\n\n/**\n * If the logger implementation does not choose to provide its own queue,\n * one will automatically be created for it.\n * The created queue will receive its name from this method.\n * This may be helpful for debugging or profiling reasons.\n**/\n- (NSString *)loggerName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDLogFormatter <NSObject>\n@required\n\n/**\n * Formatters may optionally be added to any logger.\n * This allows for increased flexibility in the logging environment.\n * For example, log messages for log files may be formatted differently than log messages for the console.\n * \n * For more information about formatters, see the \"Custom Formatters\" page:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The formatter may also optionally filter the log message by returning nil,\n * in which case the logger will not log the message.\n**/\n- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;\n\n@optional\n\n/**\n * A single formatter instance can be added to multiple loggers.\n * These methods provides hooks to notify the formatter of when it's added/removed.\n *\n * This is primarily for thread-safety.\n * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers.\n * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter),\n * it could possibly use these hooks to switch to thread-safe versions of the code.\n**/\n- (void)didAddToLogger:(id <DDLogger>)logger;\n- (void)willRemoveFromLogger:(id <DDLogger>)logger;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@protocol DDRegisteredDynamicLogging\n\n/**\n * Implement these methods to allow a file's log level to be managed from a central location.\n * \n * This is useful if you'd like to be able to change log levels for various parts\n * of your code from within the running application.\n * \n * Imagine pulling up the settings for your application,\n * and being able to configure the logging level on a per file basis.\n * \n * The implementation can be very straight-forward:\n * \n * + (int)ddLogLevel\n * {\n *     return ddLogLevel;\n * }\n *  \n * + (void)ddSetLogLevel:(int)logLevel\n * {\n *     ddLogLevel = logLevel;\n * }\n**/\n\n+ (int)ddLogLevel;\n+ (void)ddSetLogLevel:(int)logLevel;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogMessage class encapsulates information about the log message.\n * If you write custom loggers or formatters, you will be dealing with objects of this class.\n**/\n\nenum {\n    DDLogMessageCopyFile     = 1 << 0,\n    DDLogMessageCopyFunction = 1 << 1\n};\ntypedef int DDLogMessageOptions;\n\n@interface DDLogMessage : NSObject <NSCopying>\n{\n\n// The public variables below can be accessed directly (for speed).\n// For example: logMessage->logLevel\n    \n@public\n    int logLevel;\n    int logFlag;\n    int logContext;\n    NSString *logMsg;\n    NSDate *timestamp;\n    char *file;\n    char *function;\n    int lineNumber;\n    mach_port_t machThreadID;\n    char *queueLabel;\n    NSString *threadName;\n    \n    // For 3rd party extensions to the framework, where flags and contexts aren't enough.\n    id tag;\n    \n    // For 3rd party extensions that manually create DDLogMessage instances.\n    DDLogMessageOptions options;\n}\n\n/**\n * Standard init method for a log message object.\n * Used by the logging primitives. (And the macros use the logging primitives.)\n * \n * If you find need to manually create logMessage objects, there is one thing you should be aware of:\n * \n * If no flags are passed, the method expects the file and function parameters to be string literals.\n * That is, it expects the given strings to exist for the duration of the object's lifetime,\n * and it expects the given strings to be immutable.\n * In other words, it does not copy these strings, it simply points to them.\n * This is due to the fact that __FILE__ and __FUNCTION__ are usually used to specify these parameters,\n * so it makes sense to optimize and skip the unnecessary allocations.\n * However, if you need them to be copied you may use the options parameter to specify this.\n * Options is a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction.\n**/\n- (instancetype)initWithLogMsg:(NSString *)logMsg\n                         level:(int)logLevel\n                          flag:(int)logFlag\n                       context:(int)logContext\n                          file:(const char *)file\n                      function:(const char *)function\n                          line:(int)line\n                           tag:(id)tag\n                       options:(DDLogMessageOptions)optionsMask;\n\n/**\n * Returns the threadID as it appears in NSLog.\n * That is, it is a hexadecimal value which is calculated from the machThreadID.\n**/\n- (NSString *)threadID;\n\n/**\n * Convenience property to get just the file name, as the file variable is generally the full file path.\n * This method does not include the file extension, which is generally unwanted for logging purposes.\n**/\n- (NSString *)fileName;\n\n/**\n * Returns the function variable in NSString form.\n**/\n- (NSString *)methodName;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * The DDLogger protocol specifies that an optional formatter can be added to a logger.\n * Most (but not all) loggers will want to support formatters.\n * \n * However, writting getters and setters in a thread safe manner,\n * while still maintaining maximum speed for the logging process, is a difficult task.\n * \n * To do it right, the implementation of the getter/setter has strict requiremenets:\n * - Must NOT require the logMessage method to acquire a lock.\n * - Must NOT require the logMessage method to access an atomic property (also a lock of sorts).\n * \n * To simplify things, an abstract logger is provided that implements the getter and setter.\n * \n * Logger implementations may simply extend this class,\n * and they can ACCESS THE FORMATTER VARIABLE DIRECTLY from within their logMessage method!\n**/\n\n@interface DDAbstractLogger : NSObject <DDLogger>\n{\n    id <DDLogFormatter> formatter;\n    \n    dispatch_queue_t loggerQueue;\n}\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n\n// For thread-safety assertions\n- (BOOL)isOnGlobalLoggingQueue;\n- (BOOL)isOnInternalLoggerQueue;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/DDTTYLogger.h",
    "content": "#import <Foundation/Foundation.h>\n#if TARGET_OS_IPHONE\n#import <UIKit/UIColor.h>   // iOS\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n#import <AppKit/NSColor.h>  // OS X with AppKit\n#else\n#import \"CLIColor.h\"        // OS X without AppKit\n#endif\n\n#import \"DDLog.h\"\n\n#define LOG_CONTEXT_ALL INT_MAX\n\n/**\n * Welcome to Cocoa Lumberjack!\n * \n * The project page has a wealth of documentation if you have any questions.\n * https://github.com/CocoaLumberjack/CocoaLumberjack\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted\n * \n * \n * This class provides a logger for Terminal output or Xcode console output,\n * depending on where you are running your code.\n * \n * As described in the \"Getting Started\" page,\n * the traditional NSLog() function directs it's output to two places:\n * \n * - Apple System Log (so it shows up in Console.app)\n * - StdErr (if stderr is a TTY, so log statements show up in Xcode console)\n * \n * To duplicate NSLog() functionality you can simply add this logger and an asl logger.\n * However, if you instead choose to use file logging (for faster performance),\n * you may choose to use only a file logger and a tty logger.\n**/\n\n@interface DDTTYLogger : DDAbstractLogger <DDLogger>\n{\n    NSCalendar *calendar;\n    NSUInteger calendarUnitFlags;\n    \n    NSString *appName;\n    char *app;\n    size_t appLen;\n    \n    NSString *processID;\n    char *pid;\n    size_t pidLen;\n    \n    BOOL colorsEnabled;\n    NSMutableArray *colorProfilesArray;\n    NSMutableDictionary *colorProfilesDict;\n}\n\n+ (instancetype)sharedInstance;\n\n/* Inherited from the DDLogger protocol:\n * \n * Formatters may optionally be added to any logger.\n * \n * If no formatter is set, the logger simply logs the message as it is given in logMessage,\n * or it may use its own built in formatting style.\n * \n * More information about formatters can be found here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters\n * \n * The actual implementation of these methods is inherited from DDAbstractLogger.\n\n- (id <DDLogFormatter>)logFormatter;\n- (void)setLogFormatter:(id <DDLogFormatter>)formatter;\n \n*/\n\n/**\n * Want to use different colors for different log levels?\n * Enable this property.\n * \n * If you run the application via the Terminal (not Xcode),\n * the logger will map colors to xterm-256color or xterm-color (if available).\n * \n * Xcode does NOT natively support colors in the Xcode debugging console.\n * You'll need to install the XcodeColors plugin to see colors in the Xcode console.\n * https://github.com/robbiehanson/XcodeColors\n * \n * The default value if NO.\n**/\n@property (readwrite, assign) BOOL colorsEnabled;\n\n/**\n * The default color set (foregroundColor, backgroundColor) is:\n * \n * - LOG_FLAG_ERROR = (red, nil)\n * - LOG_FLAG_WARN  = (orange, nil)\n * \n * You can customize the colors however you see fit.\n * Please note that you are passing a flag, NOT a level.\n * \n * GOOD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_FLAG_INFO];  // <- Good :)\n *  BAD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_LEVEL_INFO]; // <- BAD! :(\n * \n * LOG_FLAG_INFO  = 0...00100\n * LOG_LEVEL_INFO = 0...00111 <- Would match LOG_FLAG_INFO and LOG_FLAG_WARN and LOG_FLAG_ERROR\n * \n * If you run the application within Xcode, then the XcodeColors plugin is required.\n * \n * If you run the application from a shell, then DDTTYLogger will automatically map the given color to\n * the closest available color. (xterm-256color or xterm-color which have 256 and 16 supported colors respectively.)\n * \n * This method invokes setForegroundColor:backgroundColor:forFlag:context: and applies it to `LOG_CONTEXT_ALL`.\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask;\n#endif\n\n/**\n * Just like setForegroundColor:backgroundColor:flag, but allows you to specify a particular logging context.\n * \n * A logging context is often used to identify log messages coming from a 3rd party framework,\n * although logging context's can be used for many different functions.\n * \n * Use LOG_CONTEXT_ALL to set the deafult color for all contexts that have no specific color set defined.\n * \n * Logging context's are explained in further detail here:\n * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomContext\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask context:(int)ctxt;\n#endif\n\n/**\n * Similar to the methods above, but allows you to map DDLogMessage->tag to a particular color profile.\n * For example, you could do something like this:\n * \n * static NSString *const PurpleTag = @\"PurpleTag\";\n * \n * #define DDLogPurple(frmt, ...) LOG_OBJC_TAG_MACRO(NO, 0, 0, 0, PurpleTag, frmt, ##__VA_ARGS__)\n * \n * And then in your applicationDidFinishLaunching, or wherever you configure Lumberjack:\n * \n * #if TARGET_OS_IPHONE\n *   UIColor *purple = [UIColor colorWithRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n * #else\n *   NSColor *purple = [NSColor colorWithCalibratedRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];\n *\n * Note: For CLI OS X projects that don't link with AppKit use CLIColor objects instead\n * \n * [[DDTTYLogger sharedInstance] setForegroundColor:purple backgroundColor:nil forTag:PurpleTag];\n * [DDLog addLogger:[DDTTYLogger sharedInstance]];\n * \n * This would essentially give you a straight NSLog replacement that prints in purple:\n * \n * DDLogPurple(@\"I'm a purple log message!\");\n**/\n#if TARGET_OS_IPHONE\n- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forTag:(id <NSCopying>)tag;\n#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)\n- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forTag:(id <NSCopying>)tag;\n#else\n- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forTag:(id <NSCopying>)tag;\n#endif\n\n/**\n * Clearing color profiles.\n**/\n- (void)clearColorsForFlag:(int)mask;\n- (void)clearColorsForFlag:(int)mask context:(int)context;\n- (void)clearColorsForTag:(id <NSCopying>)tag;\n- (void)clearColorsForAllFlags;\n- (void)clearColorsForAllTags;\n- (void)clearAllColors;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/NSJSONSerialization+ObjectWithNString.h",
    "content": "//\n//  NSJSONSerialization+ObjectWithNString.h\n//  Ejecta\n//\n//  Created by matth on 7/19/13.\n//\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (ObjectWithNString)\n+ (id)JSONObjectWithString:(NSString *)string options:(NSJSONReadingOptions)opt error:(NSError **)error;\n+ (NSString*)stringWithNSDictionary:(NSDictionary*)dictionary;\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/NSJSONSerialization+PBJSONHelpers.h",
    "content": "//\n//  NSJSONSerialization+PBJSONHelpers.h\n//  PebbleVendor\n//\n//  Created by matth on 9/17/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSJSONSerialization (PBJSONHelpers)\n\n/** @name Reflection helpers */\n\n/**\n * Derived from the Box SDK (MIT license) NSJSONSerialization+BoxAdditions...\n * https://github.com/box/box-ios-sdk-v2/tree/master/BoxSDK/Categories\n \n * Ensure that the object at `key` in `dictionary` is a member of the expected class.\n * `NSNull` may be specified as an allowable value. This method may return nil if `key`\n * is not present in `dictionary`.\n *\n * @param key The key to lookup in `dictionary`.\n * @param dictionary A dictionary resulting from deserializing a JSON object.\n * @param cls The expected class of the value at key.\n * @param nullAllowed If true, `NSNull` will be returned. If not, NSNull will be converted to nil. Property getters that pass `YES` for this parameter should have the return type of `id`.\n *\n * @return The object at `key` in `dictionary` if expectations are satisfied; `nil` otherwise.\n */\n+ (id)ensureObjectForKey:(NSString *)key inDictionary:(NSDictionary *)dictionary hasExpectedType:(Class)cls nullAllowed:(BOOL)nullAllowed;\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/NSString+HexData.h",
    "content": "//\n//  NSString+HexData.h\n//  PebblePrivateKit\n//\n//  Created by Martijn The on 11/19/12.\n//  Copyright (c) 2012 Pebble Technology. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSString (HexData)\n\n- (NSData*)hexData;\n\n@end\n\n\n@interface NSData (HexString)\n\n- (NSString*)hexString;\n\n@end"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/PebbleVendor.framework/Versions/Current/Headers/UIDevice-Hardware.h",
    "content": "/*\n Erica Sadun, http://ericasadun.com\n iPhone Developer's Cookbook, 6.x Edition\n BSD License, Use at your own risk\n */\n\n#import <UIKit/UIKit.h>\n\ntypedef enum {\n    UIDeviceFamilyiPhone,\n    UIDeviceFamilyiPod,\n    UIDeviceFamilyiPad,\n    UIDeviceFamilyAppleTV,\n    UIDeviceFamilyUnknown,\n    \n} UIDeviceFamily;\n\n@interface UIDevice (Hardware)\n- (NSString *) platform;\n- (NSString *) hwmodel;\n- (NSString *) platformString;\n\n- (NSUInteger) cpuFrequency;\n- (NSUInteger) busFrequency;\n- (NSUInteger) cpuCount;\n- (NSUInteger) totalMemory;\n- (NSUInteger) userMemory;\n\n- (NSNumber *) totalDiskSpace;\n- (NSNumber *) freeDiskSpace;\n\n- (NSString *) macaddress;\n\n- (BOOL) hasRetinaDisplay;\n- (BOOL) hasBluetoothMAP;\n- (UIDeviceFamily) deviceFamily;\n@end"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/PebbleKit/Readme.md",
    "content": "# PebbleKit iOS\n\nWelcome to Pebble's official iOS SDK!\n\n## Compatibility\n\n- iOS 5.0+\n- iPhone 3GS or later\n\n## Examples\n\nAll Pebble SDK examples are now grouped in Pebble SDK, please look into the `examples/` folder of your Pebble SDK for sample code.\n\n## Integrating PebbleKit using Cocoapods\n\n- Install [Cocoapods](http://www.cocoapods.org) or make sure it is up to date\n- Add a Podfile to your project if you don't have one already (Hint: use `pod init`).\n- Add this line to the Podfile: `pod 'PebbleKit', :path => \"/path/to/PebbleKit-iOS\"`\n- Run `pod install`\n\n## Integrating PebbleKit Manually\n\n- Drag PebbleKit.framework into project\n- Drag in PebbleVendor.framework into the project, or, drag the PebbleVendor.xcodeproj into project if you need to control the 3rd party components needed for PebbleKit.\n- Link ExternalAccessory.framework, libz.dylib, CoreBluetooth.framework, CoreMotion.framework and MessageUI.framework\n- Add \"-ObjC\" linker flag to your project's build settings\n- Add the value \"com.getpebble.public\" to the \"Supported external accessory protocols\" (UISupportedExternalAccessoryProtocols) array in your app's Info.plist\n- Optionally, add the value \"App communicates with an accessory\" (external-accessory) to the \"Required background modes\" (UIBackgroundModes) array in your app's Info.plist\n\n\n## Xcode Documentation\n\n- An Xcode docset is included with documentation about all public APIs.\n- Copy `com.getpebble.PebbleKit.docset` content into `~/Library/Developer/Shared/Documentation/DocSets`\n- Restart Xcode. The documentation will now be available from `Help > Documentation and API Reference`\n\n## Submitting iOS apps with PebbleKit to Apple's App Store\n\nIn order for Pebble to work with iPhones, Pebble is part of the Made For iPhone program (a requirement for hardware accessories to interact with iOS apps). Unfortunately this also means that if you build an iOS app with PebbleKit, we (Pebble) will need to whitelist your iOS app before you can upload it to the App Store. If you have completed a Pebble app and would like to learn more about making it available on the App Store, please visit [the whitelisting guide](https://developer.getpebble.com/2/distribute/whitelisting.html)\n\n## Change Log\n\n#### TODO-SetDate - 2.0\n\n- Remove examples from PebbleKit and move them into Pebble SDK\n\n#### 2013-07-03 - 1.12\n- Log errors to the console if there is no delegate set on PBWatch\n- Bugfixes\n-- Fix threading bugs in WeatherDemo\n-- Fix bugs that could cause callbacks to be called on the wrong thread\n-- Fix a bug that could cause a crash when re-connecting to the watch\n-- Fix a bug that caused some types to be unavailable (gtypes.h)\n\n#### 2013-05-06\n- Added WeatherDemo sample project to demonstrate custom use of the AppMessage subsystem\n- Added -[PBWatch closeSession:] to enable 3rd party apps to explicitely close the shared communication session.\n- Added PBBitmap helper class to convert UIImage to the native Pebble bitmap format\n- Exposed category methods on NSData/NSDictionary to (de)serialize from/to Pebble dicts\n- Added documentation for the NSNumber+stdint category\n\n#### 2013-03-25\n- Added generic bi-directional phone app <-> watch app communication layer, called \"App Messages\"\n- Refactored legacy Sports protocol to use App Messages\n- Added APIs to query the watch whether App / Sports Messages are supported (-appMessagesGetIsSupported: and -sportsGetIsSupported:)\n- Added API to set custom icon / title to the Sports watch app\n- Added API to receive Sports activity state changes by pressing the SELECT button on the watch (-sportsAppAddReceiveUpdateHandler:)\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/Pods-PebbleKit-Private.xcconfig",
    "content": "#include \"Pods-PebbleKit.xcconfig\"\nFRAMEWORK_SEARCH_PATHS = ${PODS_PEBBLEKIT_FRAMEWORK_SEARCH_PATHS}\nGCC_PREPROCESSOR_DEFINITIONS = COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/BuildHeaders\" \"${PODS_ROOT}/BuildHeaders/PebbleKit\" \"${PODS_ROOT}/Headers\" \"${PODS_ROOT}/Headers/PebbleKit\"\nOTHER_LDFLAGS = -ObjC ${PODS_PEBBLEKIT_OTHER_LDFLAGS}\nPODS_ROOT = ${SRCROOT}"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/Pods-PebbleKit-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_PebbleKit : NSObject\n@end\n@implementation PodsDummy_Pods_PebbleKit\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/Pods-PebbleKit-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n#import \"Pods-environment.h\"\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/Pods-PebbleKit.xcconfig",
    "content": "PODS_PEBBLEKIT_FRAMEWORK_SEARCH_PATHS = \"$(PODS_ROOT)/PebbleKit\" \"$(PODS_ROOT)/PebbleKit\"\nPODS_PEBBLEKIT_OTHER_LDFLAGS = -lz -framework PebbleKit -framework PebbleVendor -weak_framework CoreBluetooth -weak_framework CoreMotion -weak_framework ExternalAccessory -weak_framework MessageUI"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/Pods-acknowledgements.markdown",
    "content": "# Acknowledgements\nThis application makes use of the following third party libraries:\n\n## PebbleKit\n\n© 2014 Pebble Technology Corp. All rights reserved.\n\nGenerated by CocoaPods - http://cocoapods.org\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/Pods-acknowledgements.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreferenceSpecifiers</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>This application makes use of the following third party libraries:</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Acknowledgements</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>© 2014 Pebble Technology Corp. All rights reserved.\n</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>PebbleKit</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Generated by CocoaPods - http://cocoapods.org</string>\n\t\t\t<key>Title</key>\n\t\t\t<string></string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t</array>\n\t<key>StringsTable</key>\n\t<string>Acknowledgements</string>\n\t<key>Title</key>\n\t<string>Acknowledgements</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/Pods-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods : NSObject\n@end\n@implementation PodsDummy_Pods\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/Pods-environment.h",
    "content": "\n// To check if a library is compiled with CocoaPods you\n// can use the `COCOAPODS` macro definition which is\n// defined in the xcconfigs so it is available in\n// headers also when they are imported in the client\n// project.\n\n\n// PebbleKit\n#define COCOAPODS_POD_AVAILABLE_PebbleKit\n#define COCOAPODS_VERSION_MAJOR_PebbleKit 2\n#define COCOAPODS_VERSION_MINOR_PebbleKit 2\n#define COCOAPODS_VERSION_PATCH_PebbleKit 0\n\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/Pods-resources.sh",
    "content": "#!/bin/sh\nset -e\n\nRESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt\n> \"$RESOURCES_TO_COPY\"\n\ninstall_resource()\n{\n  case $1 in\n    *.storyboard)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}\"\n      ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .storyboard`.storyboardc\" \"${PODS_ROOT}/$1\" --sdk \"${SDKROOT}\"\n      ;;\n    *.xib)\n        echo \"ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}\"\n      ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .xib`.nib\" \"${PODS_ROOT}/$1\" --sdk \"${SDKROOT}\"\n      ;;\n    *.framework)\n      echo \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      mkdir -p \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      echo \"rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      rsync -av \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      ;;\n    *.xcdatamodel)\n      echo \"xcrun momc \\\"${PODS_ROOT}/$1\\\" \\\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\"`.mom\\\"\"\n      xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcdatamodel`.mom\"\n      ;;\n    *.xcdatamodeld)\n      echo \"xcrun momc \\\"${PODS_ROOT}/$1\\\" \\\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcdatamodeld`.momd\\\"\"\n      xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcdatamodeld`.momd\"\n      ;;\n    *.xcassets)\n      ;;\n    /*)\n      echo \"$1\"\n      echo \"$1\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n    *)\n      echo \"${PODS_ROOT}/$1\"\n      echo \"${PODS_ROOT}/$1\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n  esac\n}\n\nrsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nif [[ \"${ACTION}\" == \"install\" ]]; then\n  rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\nrm -f \"$RESOURCES_TO_COPY\"\n\nif [[ -n \"${WRAPPER_EXTENSION}\" ]] && [ `xcrun --find actool` ] && [ `find . -name '*.xcassets' | wc -l` -ne 0 ]\nthen\n  case \"${TARGETED_DEVICE_FAMILY}\" in \n    1,2)\n      TARGET_DEVICE_ARGS=\"--target-device ipad --target-device iphone\"\n      ;;\n    1)\n      TARGET_DEVICE_ARGS=\"--target-device iphone\"\n      ;;\n    2)\n      TARGET_DEVICE_ARGS=\"--target-device ipad\"\n      ;;\n    *)\n      TARGET_DEVICE_ARGS=\"--target-device mac\"\n      ;;  \n  esac \n  find \"${PWD}\" -name \"*.xcassets\" -print0 | xargs -0 actool --output-format human-readable-text --notices --warnings --platform \"${PLATFORM_NAME}\" --minimum-deployment-target \"${IPHONEOS_DEPLOYMENT_TARGET}\" ${TARGET_DEVICE_ARGS} --compress-pngs --compile \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/Pods.xcconfig",
    "content": "FRAMEWORK_SEARCH_PATHS = \"$(PODS_ROOT)/PebbleKit\" \"$(PODS_ROOT)/PebbleKit\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers\" \"${PODS_ROOT}/Headers/PebbleKit\"\nOTHER_CFLAGS = $(inherited) -isystem \"${PODS_ROOT}/Headers\" -isystem \"${PODS_ROOT}/Headers/PebbleKit\"\nOTHER_LDFLAGS = -ObjC -lz -framework PebbleKit -framework PebbleVendor -weak_framework CoreBluetooth -weak_framework CoreMotion -weak_framework ExternalAccessory -weak_framework MessageUI\nPODS_ROOT = ${SRCROOT}/Pods"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/Pods/Pods.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t11560F352F634288AF084F9D /* Pods-PebbleKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FF0449218AD4C6EB62771E4 /* Pods-PebbleKit-dummy.m */; };\n\t\t421D4351E0B1466691B25520 /* Pods-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5FE1459D66A04859A67DD16A /* Pods-dummy.m */; };\n\t\t5E197E0F560540B5949F64C5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 45935F8623C14ACDAE9D450B /* Foundation.framework */; };\n\t\t631F95D2992040EFB520C229 /* libPods-PebbleKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DF377B312264A8D9D5A1B98 /* libPods-PebbleKit.a */; };\n\t\t83242E63C8644ADDAC5A6B7C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 45935F8623C14ACDAE9D450B /* Foundation.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t00C48C508A51451E8717F467 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0C3918AD1BF145BFAFF78EB6 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = B64B5FE85FFA44019BEACD42;\n\t\t\tremoteInfo = \"Pods-PebbleKit\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t0FF0449218AD4C6EB62771E4 /* Pods-PebbleKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-PebbleKit-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t11C52A06851145C885FDFE88 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1CEBC2A27A5147E8ADFA3FEF /* Pods-environment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Pods-environment.h\"; sourceTree = \"<group>\"; };\n\t\t45935F8623C14ACDAE9D450B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };\n\t\t53C9FDCCBA6042DFAE7526CE /* Pods-PebbleKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-PebbleKit.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t5B305DC4E0274951818D5AB7 /* Pods-PebbleKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Pods-PebbleKit-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t5DF377B312264A8D9D5A1B98 /* libPods-PebbleKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-PebbleKit.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t5FE1459D66A04859A67DD16A /* Pods-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t7B009BD7014447C4B5328148 /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };\n\t\t8997D8BFFCB84A42A0FA3A7A /* Pods-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-resources.sh\"; sourceTree = \"<group>\"; };\n\t\tB2B8F4F2E5444619A40A40B4 /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.xcconfig; sourceTree = \"<group>\"; };\n\t\tB722F40053ED419290308E2E /* Pods-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-acknowledgements.plist\"; sourceTree = \"<group>\"; };\n\t\tB9EF01F550CF4ADD8D8F8874 /* Pods-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = \"Pods-acknowledgements.markdown\"; sourceTree = \"<group>\"; };\n\t\tC92005B118BD4CC7A9719894 /* PebbleVendor.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = PebbleVendor.framework; sourceTree = \"<group>\"; };\n\t\tEBB9D83981F6475481689495 /* PebbleKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = PebbleKit.framework; sourceTree = \"<group>\"; };\n\t\tF84D890342D94F5EA094CC7E /* Pods-PebbleKit-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-PebbleKit-Private.xcconfig\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t30CB92D2048D4481BC6A121A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t83242E63C8644ADDAC5A6B7C /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF59A272038584610AEC46768 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5E197E0F560540B5949F64C5 /* Foundation.framework in Frameworks */,\n\t\t\t\t631F95D2992040EFB520C229 /* libPods-PebbleKit.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t06768DC57C1F4A03971DD638 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t11C52A06851145C885FDFE88 /* libPods.a */,\n\t\t\t\t5DF377B312264A8D9D5A1B98 /* libPods-PebbleKit.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1FF5D216957B48A9A582A1F3 /* iOS */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t45935F8623C14ACDAE9D450B /* Foundation.framework */,\n\t\t\t);\n\t\t\tname = iOS;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t22CA0A70A97E4FFCB0FEE894 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB5E81D066D0D43B4A40896B9 /* PebbleKit */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t24255629A95B4E579F88A4AB = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B009BD7014447C4B5328148 /* Podfile */,\n\t\t\t\t424B19754EE24D41AD76712D /* Frameworks */,\n\t\t\t\t22CA0A70A97E4FFCB0FEE894 /* Pods */,\n\t\t\t\t06768DC57C1F4A03971DD638 /* Products */,\n\t\t\t\t73A96408413E4BA7AE75DB97 /* Targets Support Files */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2A8D43A6518C485281AF852C /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB2B8F4F2E5444619A40A40B4 /* Pods.xcconfig */,\n\t\t\t\tB9EF01F550CF4ADD8D8F8874 /* Pods-acknowledgements.markdown */,\n\t\t\t\tB722F40053ED419290308E2E /* Pods-acknowledgements.plist */,\n\t\t\t\t5FE1459D66A04859A67DD16A /* Pods-dummy.m */,\n\t\t\t\t1CEBC2A27A5147E8ADFA3FEF /* Pods-environment.h */,\n\t\t\t\t8997D8BFFCB84A42A0FA3A7A /* Pods-resources.sh */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t424B19754EE24D41AD76712D /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1FF5D216957B48A9A582A1F3 /* iOS */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t61CD749AC9B94BAA96BDA5EA /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEBB9D83981F6475481689495 /* PebbleKit.framework */,\n\t\t\t\tC92005B118BD4CC7A9719894 /* PebbleVendor.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t73A96408413E4BA7AE75DB97 /* Targets Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2A8D43A6518C485281AF852C /* Pods */,\n\t\t\t);\n\t\t\tname = \"Targets Support Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA0A24387D2D846D08D5B6E96 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t53C9FDCCBA6042DFAE7526CE /* Pods-PebbleKit.xcconfig */,\n\t\t\t\tF84D890342D94F5EA094CC7E /* Pods-PebbleKit-Private.xcconfig */,\n\t\t\t\t0FF0449218AD4C6EB62771E4 /* Pods-PebbleKit-dummy.m */,\n\t\t\t\t5B305DC4E0274951818D5AB7 /* Pods-PebbleKit-prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\tB5E81D066D0D43B4A40896B9 /* PebbleKit */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t61CD749AC9B94BAA96BDA5EA /* Frameworks */,\n\t\t\t\tA0A24387D2D846D08D5B6E96 /* Support Files */,\n\t\t\t);\n\t\t\tname = PebbleKit;\n\t\t\tpath = PebbleKit;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t1AF6CC541AF844F696876EE2 /* Pods */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6A67E03DD1054724B7341976 /* Build configuration list for PBXNativeTarget \"Pods\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tCEA5FD64852F4C2495E7C46D /* Sources */,\n\t\t\t\tF59A272038584610AEC46768 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t52DBC272F3D747FF886BCF3A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tproductName = Pods;\n\t\t\tproductReference = 11C52A06851145C885FDFE88 /* libPods.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\tB64B5FE85FFA44019BEACD42 /* Pods-PebbleKit */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = A067CE30A872400E8880BEA2 /* Build configuration list for PBXNativeTarget \"Pods-PebbleKit\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8AF718D44E29443EB405A792 /* Sources */,\n\t\t\t\t30CB92D2048D4481BC6A121A /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Pods-PebbleKit\";\n\t\t\tproductName = \"Pods-PebbleKit\";\n\t\t\tproductReference = 5DF377B312264A8D9D5A1B98 /* libPods-PebbleKit.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t0C3918AD1BF145BFAFF78EB6 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0510;\n\t\t\t};\n\t\t\tbuildConfigurationList = A4028D118C8D48919419E572 /* Build configuration list for PBXProject \"Pods\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 24255629A95B4E579F88A4AB;\n\t\t\tproductRefGroup = 06768DC57C1F4A03971DD638 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectReferences = (\n\t\t\t);\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t1AF6CC541AF844F696876EE2 /* Pods */,\n\t\t\t\tB64B5FE85FFA44019BEACD42 /* Pods-PebbleKit */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t8AF718D44E29443EB405A792 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t11560F352F634288AF084F9D /* Pods-PebbleKit-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCEA5FD64852F4C2495E7C46D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t421D4351E0B1466691B25520 /* Pods-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t52DBC272F3D747FF886BCF3A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = B64B5FE85FFA44019BEACD42 /* Pods-PebbleKit */;\n\t\t\ttargetProxy = 00C48C508A51451E8717F467 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t0B3C41B5ECBB4E178A68EAF4 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = F84D890342D94F5EA094CC7E /* Pods-PebbleKit-Private.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDSTROOT = /tmp/xcodeproj.dst;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Pods-PebbleKit-prefix.pch\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINSTALL_PATH = \"$(BUILT_PRODUCTS_DIR)\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1905F44012744E5D9BDD570F /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = B2B8F4F2E5444619A40A40B4 /* Pods.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDSTROOT = /tmp/xcodeproj.dst;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINSTALL_PATH = \"$(BUILT_PRODUCTS_DIR)\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t438E3DDD18104DCEB67B7815 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = NO;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t69A3E1B4DB3449B7A1804E8D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = B2B8F4F2E5444619A40A40B4 /* Pods.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDSTROOT = /tmp/xcodeproj.dst;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINSTALL_PATH = \"$(BUILT_PRODUCTS_DIR)\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"-DNS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tOTHER_CPLUSPLUSFLAGS = (\n\t\t\t\t\t\"-DNS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tE0B47F44B6594F16B2C73186 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = F84D890342D94F5EA094CC7E /* Pods-PebbleKit-Private.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDSTROOT = /tmp/xcodeproj.dst;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Pods-PebbleKit-prefix.pch\";\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tINSTALL_PATH = \"$(BUILT_PRODUCTS_DIR)\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"-DNS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tOTHER_CPLUSPLUSFLAGS = (\n\t\t\t\t\t\"-DNS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tE77B464F3AC649C6897AE8D7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = NO;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t6A67E03DD1054724B7341976 /* Build configuration list for PBXNativeTarget \"Pods\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1905F44012744E5D9BDD570F /* Debug */,\n\t\t\t\t69A3E1B4DB3449B7A1804E8D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tA067CE30A872400E8880BEA2 /* Build configuration list for PBXNativeTarget \"Pods-PebbleKit\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t0B3C41B5ECBB4E178A68EAF4 /* Debug */,\n\t\t\t\tE0B47F44B6594F16B2C73186 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tA4028D118C8D48919419E572 /* Build configuration list for PBXProject \"Pods\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tE77B464F3AC649C6897AE8D7 /* Debug */,\n\t\t\t\t438E3DDD18104DCEB67B7815 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 0C3918AD1BF145BFAFF78EB6 /* Project object */;\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/WeatherDemo/WDAppDelegate.h",
    "content": "//\n//  WDAppDelegate.h\n//  WeatherDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface WDAppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate>\n\n@property (strong, nonatomic) UIWindow *window;\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/WeatherDemo/WDAppDelegate.m",
    "content": "//\n//  WDAppDelegate.m\n//  WeatherDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import \"WDAppDelegate.h\"\n#import <PebbleKit/PebbleKit.h>\n#import <CoreLocation/CoreLocation.h>\n\n@interface WDAppDelegate () <PBPebbleCentralDelegate, CLLocationManagerDelegate>\n@end\n\n@implementation WDAppDelegate {\n  PBWatch *_targetWatch;\n  CLLocationManager *_locationManager;\n}\n\n- (int)getIconFromWeatherId:(int)weatherId {\n  if (weatherId < 600) {\n    return 2;\n  } else if (weatherId < 700) {\n    return 3;\n  } else if (weatherId > 800) {\n    return 1;\n  } else {\n    return 0;\n  }\n}\n\n- (void)refreshAction:(id)sender {\n  if (_targetWatch == nil || [_targetWatch isConnected] == NO) {\n    [[[UIAlertView alloc] initWithTitle:nil message:@\"No connected watch!\" delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n    return;\n  }\n\n  // Fetch weather at current location using openweathermap.org's JSON API:\n  CLLocationCoordinate2D coordinate = _locationManager.location.coordinate;\n  NSString *apiURLString = [NSString stringWithFormat:@\"http://api.openweathermap.org/data/2.1/find/city?lat=%f&lon=%f&cnt=1\", coordinate.latitude, coordinate.longitude];\n  NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:apiURLString]];\n  NSOperationQueue *queue = [[NSOperationQueue alloc] init];\n  [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {\n    NSHTTPURLResponse *httpResponse = nil;\n    if ([response isKindOfClass:[NSHTTPURLResponse class]]) {\n      httpResponse = (NSHTTPURLResponse *) response;\n    }\n\n    // NSURLConnection's completionHandler is called on the background thread.\n    // Prepare a block to show an alert on the main thread:\n    __block NSString *message = @\"\";\n    void (^showAlert)(void) = ^{\n      [[NSOperationQueue mainQueue] addOperationWithBlock:^{\n        [[[UIAlertView alloc] initWithTitle:nil message:message delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n      }];\n    };\n\n    // Check for error or non-OK statusCode:\n    if (error || httpResponse.statusCode != 200) {\n      message = @\"Error fetching weather\";\n      showAlert();\n      return;\n    }\n\n    // Parse the JSON response:\n    NSError *jsonError = nil;\n    NSDictionary *root = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];\n    @try {\n      if (jsonError == nil && root) {\n        // TODO: type checking / validation, this is really dangerous...\n        NSDictionary *firstListItem = [root[@\"list\"] objectAtIndex:0];\n        NSDictionary *main = firstListItem[@\"main\"];\n\n        // Get the temperature:\n        NSNumber *temperatureNumber = main[@\"temp\"]; // in degrees Kelvin\n        int temperature = [temperatureNumber integerValue] - 273.15;\n\n        // Get weather icon:\n        NSNumber *weatherIconNumber = firstListItem[@\"weather\"][0][@\"icon\"];\n        uint8_t weatherIconID = [self getIconFromWeatherId:[weatherIconNumber integerValue]];\n\n        // Send data to watch:\n        // See demos/feature_app_messages/weather.c in the native watch app SDK for the same definitions on the watch's end:\n        NSNumber *iconKey = @(0); // This is our custom-defined key for the icon ID, which is of type uint8_t.\n        NSNumber *temperatureKey = @(1); // This is our custom-defined key for the temperature string.\n        NSDictionary *update = @{ iconKey:[NSNumber numberWithUint8:weatherIconID],\n                                  temperatureKey:[NSString stringWithFormat:@\"%d\\u00B0C\", temperature] };\n        [_targetWatch appMessagesPushUpdate:update onSent:^(PBWatch *watch, NSDictionary *update, NSError *error) {\n          message = error ? [error localizedDescription] : @\"Update sent!\";\n          showAlert();\n        }];\n        return;\n      }\n    }\n    @catch (NSException *exception) {\n    }\n    message = @\"Error parsing response\";\n    showAlert();\n  }];\n}\n\n- (void)setTargetWatch:(PBWatch*)watch {\n  _targetWatch = watch;\n\n  // NOTE:\n  // For demonstration purposes, we start communicating with the watch immediately upon connection,\n  // because we are calling -appMessagesGetIsSupported: here, which implicitely opens the communication session.\n  // Real world apps should communicate only if the user is actively using the app, because there\n  // is one communication session that is shared between all 3rd party iOS apps.\n\n  // Test if the Pebble's firmware supports AppMessages / Weather:\n  [watch appMessagesGetIsSupported:^(PBWatch *watch, BOOL isAppMessagesSupported) {\n    if (isAppMessagesSupported) {\n      // Configure our communications channel to target the weather app:\n      // See demos/feature_app_messages/weather.c in the native watch app SDK for the same definition on the watch's end:\n      uint8_t bytes[] = {0x28, 0xAF, 0x3D, 0xC7, 0xE4, 0x0D, 0x49, 0x0F, 0xBE, 0xF2, 0x29, 0x54, 0x8C, 0x8B, 0x06, 0x00};\n      NSData *uuid = [NSData dataWithBytes:bytes length:sizeof(bytes)];\n      [[PBPebbleCentral defaultCentral] setAppUUID:uuid];\n\n      NSString *message = [NSString stringWithFormat:@\"Yay! %@ supports AppMessages :D\", [watch name]];\n      [[[UIAlertView alloc] initWithTitle:@\"Connected!\" message:message delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n    } else {\n\n      NSString *message = [NSString stringWithFormat:@\"Blegh... %@ does NOT support AppMessages :'(\", [watch name]];\n      [[[UIAlertView alloc] initWithTitle:@\"Connected...\" message:message delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n    }\n  }];\n}\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];\n\n  _locationManager = [[CLLocationManager alloc] init];\n  _locationManager.distanceFilter = 5.0 * 1000.0; // Move at least 5km until next location event is generated\n  _locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;\n  _locationManager.delegate = self;\n  [_locationManager startUpdatingLocation];\n\n  UIButton *refreshButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];\n  [refreshButton setTitle:@\"Fetch Weather\" forState:UIControlStateNormal];\n  [refreshButton addTarget:self action:@selector(refreshAction:) forControlEvents:UIControlEventTouchUpInside];\n  [refreshButton setFrame:CGRectMake(10, 100, 300, 100)];\n  [self.window addSubview:refreshButton];\n\n  [self.window makeKeyAndVisible];\n\n  // We'd like to get called when Pebbles connect and disconnect, so become the delegate of PBPebbleCentral:\n  [[PBPebbleCentral defaultCentral] setDelegate:self];\n\n  // Initialize with the last connected watch:\n  [self setTargetWatch:[[PBPebbleCentral defaultCentral] lastConnectedWatch]];\n  return YES;\n}\n\n/*\n *  PBPebbleCentral delegate methods\n */\n\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidConnect:(PBWatch*)watch isNew:(BOOL)isNew {\n  [self setTargetWatch:watch];\n}\n\n- (void)pebbleCentral:(PBPebbleCentral*)central watchDidDisconnect:(PBWatch*)watch {\n  [[[UIAlertView alloc] initWithTitle:@\"Disconnected!\" message:[watch name] delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n  if (_targetWatch == watch || [watch isEqual:_targetWatch]) {\n    [self setTargetWatch:nil];\n  }\n}\n\n/*\n *  CLLocationManagerDelegate\n */\n\n// iOS 5 and earlier:\n- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {\n  [self reportNewLocation:newLocation];\n}\n\n// iOS 6 and later:\n- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {\n  CLLocation *lastLocation = [locations lastObject];\n  [self reportNewLocation:lastLocation];\n}\n\n- (void)reportNewLocation:(CLLocation *)newLocation {\n  NSLog(@\"New Location: %@\", newLocation);\n}\n\n@end\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/WeatherDemo/WeatherDemo-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.getpebble.${PRODUCT_NAME:rfc1034identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UIStatusBarTintParameters</key>\n\t<dict>\n\t\t<key>UINavigationBar</key>\n\t\t<dict>\n\t\t\t<key>Style</key>\n\t\t\t<string>UIBarStyleDefault</string>\n\t\t\t<key>Translucent</key>\n\t\t\t<false/>\n\t\t</dict>\n\t</dict>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedExternalAccessoryProtocols</key>\n\t<array>\n\t\t<string>com.getpebble.public</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/WeatherDemo/WeatherDemo-Prefix.pch",
    "content": "//\n// Prefix header for all source files of the 'WeatherDemo' target in the 'WeatherDemo' project\n//\n\n#import <Availability.h>\n\n#ifndef __IPHONE_4_0\n#warning \"This project uses features only available in iOS SDK 4.0 and later.\"\n#endif\n\n#ifdef __OBJC__\n  #import <UIKit/UIKit.h>\n  #import <Foundation/Foundation.h>\n#endif\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/WeatherDemo/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/WeatherDemo/main.m",
    "content": "//\n//  main.m\n//  WeatherDemo\n//\n//  Created by Martijn The on 2/7/13.\n//  Copyright (c) 2013 Pebble Technology Corp. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n#import \"WDAppDelegate.h\"\n\nint main(int argc, char *argv[])\n{\n  @autoreleasepool {\n      return UIApplicationMain(argc, argv, nil, NSStringFromClass([WDAppDelegate class]));\n  }\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/WeatherDemo.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1030EB5E16C4DB1A006F46EA /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1030EB5D16C4DB1A006F46EA /* UIKit.framework */; };\n\t\t1030EB6016C4DB1A006F46EA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1030EB5F16C4DB1A006F46EA /* Foundation.framework */; };\n\t\t1030EB6216C4DB1A006F46EA /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1030EB6116C4DB1A006F46EA /* CoreGraphics.framework */; };\n\t\t1030EB6816C4DB1A006F46EA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB6616C4DB1A006F46EA /* InfoPlist.strings */; };\n\t\t1030EB6A16C4DB1A006F46EA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1030EB6916C4DB1A006F46EA /* main.m */; };\n\t\t1030EB6E16C4DB1A006F46EA /* WDAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1030EB6D16C4DB1A006F46EA /* WDAppDelegate.m */; };\n\t\t1030EB7016C4DB1A006F46EA /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB6F16C4DB1A006F46EA /* Default.png */; };\n\t\t1030EB7216C4DB1A006F46EA /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB7116C4DB1A006F46EA /* Default@2x.png */; };\n\t\t1030EB7416C4DB1A006F46EA /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1030EB7316C4DB1A006F46EA /* Default-568h@2x.png */; };\n\t\t1030EB9616C4DECC006F46EA /* ExternalAccessory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1030EB9516C4DECC006F46EA /* ExternalAccessory.framework */; };\n\t\t104820FE16C5970F00F2AFC8 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 104820FD16C5970F00F2AFC8 /* libz.dylib */; };\n\t\t1048210016C5972E00F2AFC8 /* CoreBluetooth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 104820FF16C5972E00F2AFC8 /* CoreBluetooth.framework */; };\n\t\t1048210216C5973B00F2AFC8 /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1048210116C5973B00F2AFC8 /* CoreMotion.framework */; };\n\t\t1048210416C5974800F2AFC8 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1048210316C5974800F2AFC8 /* MessageUI.framework */; };\n\t\t1092225B1738302F001117B2 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1092225A1738302F001117B2 /* CoreLocation.framework */; };\n\t\t2ABD33291829FCD70077C1C8 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2ABD33281829FCD70077C1C8 /* CFNetwork.framework */; };\n\t\tD0701BEF404A4FCEB190B264 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C9B5EAF2968446649B3F5E52 /* libPods.a */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t1030EB5A16C4DB1A006F46EA /* WeatherDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WeatherDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1030EB5D16C4DB1A006F46EA /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };\n\t\t1030EB5F16C4DB1A006F46EA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t1030EB6116C4DB1A006F46EA /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };\n\t\t1030EB6516C4DB1A006F46EA /* WeatherDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"WeatherDemo-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t1030EB6716C4DB1A006F46EA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t1030EB6916C4DB1A006F46EA /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t1030EB6B16C4DB1A006F46EA /* WeatherDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"WeatherDemo-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t1030EB6C16C4DB1A006F46EA /* WDAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WDAppDelegate.h; sourceTree = \"<group>\"; };\n\t\t1030EB6D16C4DB1A006F46EA /* WDAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WDAppDelegate.m; sourceTree = \"<group>\"; };\n\t\t1030EB6F16C4DB1A006F46EA /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = \"<group>\"; };\n\t\t1030EB7116C4DB1A006F46EA /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Default@2x.png\"; sourceTree = \"<group>\"; };\n\t\t1030EB7316C4DB1A006F46EA /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"Default-568h@2x.png\"; sourceTree = \"<group>\"; };\n\t\t1030EB9516C4DECC006F46EA /* ExternalAccessory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ExternalAccessory.framework; path = System/Library/Frameworks/ExternalAccessory.framework; sourceTree = SDKROOT; };\n\t\t104820FD16C5970F00F2AFC8 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.dylib\"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };\n\t\t104820FF16C5972E00F2AFC8 /* CoreBluetooth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreBluetooth.framework; path = System/Library/Frameworks/CoreBluetooth.framework; sourceTree = SDKROOT; };\n\t\t1048210116C5973B00F2AFC8 /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; };\n\t\t1048210316C5974800F2AFC8 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; };\n\t\t1092225A1738302F001117B2 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; };\n\t\t2ABD33281829FCD70077C1C8 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; };\n\t\tC9B5EAF2968446649B3F5E52 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tDFA54A37FC934C7B91AC222A /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.xcconfig; path = Pods/Pods.xcconfig; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t1030EB5716C4DB1A006F46EA /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2ABD33291829FCD70077C1C8 /* CFNetwork.framework in Frameworks */,\n\t\t\t\t1092225B1738302F001117B2 /* CoreLocation.framework in Frameworks */,\n\t\t\t\t1048210416C5974800F2AFC8 /* MessageUI.framework in Frameworks */,\n\t\t\t\t1048210216C5973B00F2AFC8 /* CoreMotion.framework in Frameworks */,\n\t\t\t\t1048210016C5972E00F2AFC8 /* CoreBluetooth.framework in Frameworks */,\n\t\t\t\t104820FE16C5970F00F2AFC8 /* libz.dylib in Frameworks */,\n\t\t\t\t1030EB9616C4DECC006F46EA /* ExternalAccessory.framework in Frameworks */,\n\t\t\t\t1030EB5E16C4DB1A006F46EA /* UIKit.framework in Frameworks */,\n\t\t\t\t1030EB6016C4DB1A006F46EA /* Foundation.framework in Frameworks */,\n\t\t\t\t1030EB6216C4DB1A006F46EA /* CoreGraphics.framework in Frameworks */,\n\t\t\t\tD0701BEF404A4FCEB190B264 /* libPods.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t1030EB5116C4DB1A006F46EA = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB6316C4DB1A006F46EA /* WeatherDemo */,\n\t\t\t\t1030EB5C16C4DB1A006F46EA /* Frameworks */,\n\t\t\t\t1030EB5B16C4DB1A006F46EA /* Products */,\n\t\t\t\tDFA54A37FC934C7B91AC222A /* Pods.xcconfig */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1030EB5B16C4DB1A006F46EA /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB5A16C4DB1A006F46EA /* WeatherDemo.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1030EB5C16C4DB1A006F46EA /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2ABD33281829FCD70077C1C8 /* CFNetwork.framework */,\n\t\t\t\t1092225A1738302F001117B2 /* CoreLocation.framework */,\n\t\t\t\t1048210316C5974800F2AFC8 /* MessageUI.framework */,\n\t\t\t\t1048210116C5973B00F2AFC8 /* CoreMotion.framework */,\n\t\t\t\t104820FF16C5972E00F2AFC8 /* CoreBluetooth.framework */,\n\t\t\t\t104820FD16C5970F00F2AFC8 /* libz.dylib */,\n\t\t\t\t1030EB9516C4DECC006F46EA /* ExternalAccessory.framework */,\n\t\t\t\t1030EB5D16C4DB1A006F46EA /* UIKit.framework */,\n\t\t\t\t1030EB5F16C4DB1A006F46EA /* Foundation.framework */,\n\t\t\t\t1030EB6116C4DB1A006F46EA /* CoreGraphics.framework */,\n\t\t\t\tC9B5EAF2968446649B3F5E52 /* libPods.a */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1030EB6316C4DB1A006F46EA /* WeatherDemo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB6C16C4DB1A006F46EA /* WDAppDelegate.h */,\n\t\t\t\t1030EB6D16C4DB1A006F46EA /* WDAppDelegate.m */,\n\t\t\t\t1030EB6416C4DB1A006F46EA /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = WeatherDemo;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1030EB6416C4DB1A006F46EA /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB6516C4DB1A006F46EA /* WeatherDemo-Info.plist */,\n\t\t\t\t1030EB6616C4DB1A006F46EA /* InfoPlist.strings */,\n\t\t\t\t1030EB6916C4DB1A006F46EA /* main.m */,\n\t\t\t\t1030EB6B16C4DB1A006F46EA /* WeatherDemo-Prefix.pch */,\n\t\t\t\t1030EB6F16C4DB1A006F46EA /* Default.png */,\n\t\t\t\t1030EB7116C4DB1A006F46EA /* Default@2x.png */,\n\t\t\t\t1030EB7316C4DB1A006F46EA /* Default-568h@2x.png */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t1030EB5916C4DB1A006F46EA /* WeatherDemo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1030EB8B16C4DB1B006F46EA /* Build configuration list for PBXNativeTarget \"WeatherDemo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7AA77AF74E1342D4A8F67972 /* Check Pods Manifest.lock */,\n\t\t\t\t1030EB5616C4DB1A006F46EA /* Sources */,\n\t\t\t\t1030EB5716C4DB1A006F46EA /* Frameworks */,\n\t\t\t\t1030EB5816C4DB1A006F46EA /* Resources */,\n\t\t\t\t81DBFAF35DED4AB0A503718E /* Copy Pods Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = WeatherDemo;\n\t\t\tproductName = SportsDemo;\n\t\t\tproductReference = 1030EB5A16C4DB1A006F46EA /* WeatherDemo.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t1030EB5216C4DB1A006F46EA /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tCLASSPREFIX = WD;\n\t\t\t\tLastUpgradeCheck = 0460;\n\t\t\t\tORGANIZATIONNAME = \"Pebble Technology Corp.\";\n\t\t\t};\n\t\t\tbuildConfigurationList = 1030EB5516C4DB1A006F46EA /* Build configuration list for PBXProject \"WeatherDemo\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 1030EB5116C4DB1A006F46EA;\n\t\t\tproductRefGroup = 1030EB5B16C4DB1A006F46EA /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t1030EB5916C4DB1A006F46EA /* WeatherDemo */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t1030EB5816C4DB1A006F46EA /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1030EB6816C4DB1A006F46EA /* InfoPlist.strings in Resources */,\n\t\t\t\t1030EB7016C4DB1A006F46EA /* Default.png in Resources */,\n\t\t\t\t1030EB7216C4DB1A006F46EA /* Default@2x.png in Resources */,\n\t\t\t\t1030EB7416C4DB1A006F46EA /* Default-568h@2x.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t7AA77AF74E1342D4A8F67972 /* Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Check Pods Manifest.lock\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_ROOT}/../Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [[ $? != 0 ]] ; then\\n    cat << EOM\\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\nEOM\\n    exit 1\\nfi\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t81DBFAF35DED4AB0A503718E /* Copy Pods Resources */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Copy Pods Resources\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/Pods/Pods-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t1030EB5616C4DB1A006F46EA /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1030EB6A16C4DB1A006F46EA /* main.m in Sources */,\n\t\t\t\t1030EB6E16C4DB1A006F46EA /* WDAppDelegate.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t1030EB6616C4DB1A006F46EA /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t1030EB6716C4DB1A006F46EA /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t1030EB8916C4DB1A006F46EA /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.1;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1030EB8A16C4DB1A006F46EA /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.1;\n\t\t\t\tOTHER_CFLAGS = \"-DNS_BLOCK_ASSERTIONS=1\";\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1030EB8C16C4DB1B006F46EA /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = DFA54A37FC934C7B91AC222A /* Pods.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"WeatherDemo/WeatherDemo-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"WeatherDemo/WeatherDemo-Info.plist\";\n\t\t\t\tPRODUCT_NAME = WeatherDemo;\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1030EB8D16C4DB1B006F46EA /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = DFA54A37FC934C7B91AC222A /* Pods.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"WeatherDemo/WeatherDemo-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"WeatherDemo/WeatherDemo-Info.plist\";\n\t\t\t\tPRODUCT_NAME = WeatherDemo;\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1030EB5516C4DB1A006F46EA /* Build configuration list for PBXProject \"WeatherDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1030EB8916C4DB1A006F46EA /* Debug */,\n\t\t\t\t1030EB8A16C4DB1A006F46EA /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1030EB8B16C4DB1B006F46EA /* Build configuration list for PBXNativeTarget \"WeatherDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1030EB8C16C4DB1B006F46EA /* Debug */,\n\t\t\t\t1030EB8D16C4DB1B006F46EA /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 1030EB5216C4DB1A006F46EA /* Project object */;\n}\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/WeatherDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:WeatherDemo.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/WeatherDemo.xcodeproj/project.xcworkspace/xcshareddata/WeatherDemo.xccheckout",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDESourceControlProjectIdentifier</key>\n\t<string>BD86468C-A271-4C2C-A423-5736BB84FBE1</string>\n\t<key>IDESourceControlProjectName</key>\n\t<string>WeatherDemo</string>\n\t<key>IDESourceControlProjectOriginsDictionary</key>\n\t<dict>\n\t\t<key>3A0B87F4-437B-4F41-9F0F-BACA80C47296</key>\n\t\t<string>ssh://github.com/pebble/pebblesdk-examples.git</string>\n\t\t<key>A0D51475-1583-439F-BE7E-C821016956E2</key>\n\t\t<string>ssh://github.com/pebble/pebblekit-ios.git</string>\n\t</dict>\n\t<key>IDESourceControlProjectPath</key>\n\t<string>weather-demo/WeatherDemo-iOS/WeatherDemo.xcodeproj/project.xcworkspace</string>\n\t<key>IDESourceControlProjectRelativeInstallPathDictionary</key>\n\t<dict>\n\t\t<key>3A0B87F4-437B-4F41-9F0F-BACA80C47296</key>\n\t\t<string>../../../..</string>\n\t\t<key>A0D51475-1583-439F-BE7E-C821016956E2</key>\n\t\t<string>../../../../../pebblekit-ios</string>\n\t</dict>\n\t<key>IDESourceControlProjectURL</key>\n\t<string>ssh://github.com/pebble/pebblesdk-examples.git</string>\n\t<key>IDESourceControlProjectVersion</key>\n\t<integer>110</integer>\n\t<key>IDESourceControlProjectWCCIdentifier</key>\n\t<string>3A0B87F4-437B-4F41-9F0F-BACA80C47296</string>\n\t<key>IDESourceControlProjectWCConfigurations</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>IDESourceControlRepositoryExtensionIdentifierKey</key>\n\t\t\t<string>public.vcs.git</string>\n\t\t\t<key>IDESourceControlWCCIdentifierKey</key>\n\t\t\t<string>3A0B87F4-437B-4F41-9F0F-BACA80C47296</string>\n\t\t\t<key>IDESourceControlWCCName</key>\n\t\t\t<string>pebblesdk-examples</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>IDESourceControlRepositoryExtensionIdentifierKey</key>\n\t\t\t<string>public.vcs.git</string>\n\t\t\t<key>IDESourceControlWCCIdentifierKey</key>\n\t\t\t<string>A0D51475-1583-439F-BE7E-C821016956E2</string>\n\t\t\t<key>IDESourceControlWCCName</key>\n\t\t\t<string>pebblekit-ios</string>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "weather-demo/WeatherDemo-iOS/WeatherDemo.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version='1.0' encoding='UTF-8'?><Workspace version='1.0'><FileRef location='group:WeatherDemo.xcodeproj'/><FileRef location='group:Pods/Pods.xcodeproj'/></Workspace>"
  },
  {
    "path": "weather-demo/weather/appinfo.json",
    "content": "{\n  \"uuid\": \"28AF3DC7-E40D-490F-BEF2-29548C8B0600\",\n  \"shortName\": \"Pebble Weather\",\n  \"longName\": \"Pebble Weather\",\n  \"companyName\": \"Pebble Technology\",\n  \"versionCode\": 2,\n  \"versionLabel\": \"2.0\",\n  \"watchapp\": {\n    \"watchface\": false\n  },\n  \"appKeys\": {},\n  \"resources\": {\n    \"media\": [\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_SUN\",\n        \"file\": \"img/sun.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_RAIN\",\n        \"file\": \"img/rain.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_CLOUD\",\n        \"file\": \"img/cloud.png\"\n      },\n      {\n        \"type\": \"png\",\n        \"name\": \"IMAGE_SNOW\",\n        \"file\": \"img/snow.png\"\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "weather-demo/weather/src/weather.c",
    "content": "#include \"pebble.h\"\n\nstatic Window *window;\n\nstatic TextLayer *temperature_layer;\nstatic char temperature[16];\n\nstatic BitmapLayer *icon_layer;\nstatic GBitmap *icon_bitmap = NULL;\n\nstatic AppSync sync;\nstatic uint8_t sync_buffer[32];\n\nenum WeatherKey {\n  WEATHER_ICON_KEY = 0x0,         // TUPLE_INT\n  WEATHER_TEMPERATURE_KEY = 0x1,  // TUPLE_CSTRING\n};\n\nstatic uint32_t WEATHER_ICONS[] = {\n  RESOURCE_ID_IMAGE_SUN,\n  RESOURCE_ID_IMAGE_CLOUD,\n  RESOURCE_ID_IMAGE_RAIN,\n  RESOURCE_ID_IMAGE_SNOW\n};\n\nstatic void sync_error_callback(DictionaryResult dict_error, AppMessageResult app_message_error, void *context) {\n  APP_LOG(APP_LOG_LEVEL_DEBUG, \"App Message Sync Error: %d\", app_message_error);\n}\n\nstatic void sync_tuple_changed_callback(const uint32_t key, const Tuple* new_tuple, const Tuple* old_tuple, void* context) {\n  switch (key) {\n    case WEATHER_ICON_KEY:\n      if (icon_bitmap) {\n        gbitmap_destroy(icon_bitmap);\n      }\n\n      icon_bitmap = gbitmap_create_with_resource(WEATHER_ICONS[new_tuple->value->uint8]);\n      bitmap_layer_set_bitmap(icon_layer, icon_bitmap);\n      break;\n\n    case WEATHER_TEMPERATURE_KEY:\n      // App Sync keeps new_tuple in sync_buffer, so we may use it directly\n      text_layer_set_text(temperature_layer, new_tuple->value->cstring);\n      break;\n  }\n}\n\nstatic void window_load(Window *window) {\n  Layer *window_layer = window_get_root_layer(window);\n\n  icon_layer = bitmap_layer_create(GRect(32, 10, 80, 80));\n  layer_add_child(window_layer, bitmap_layer_get_layer(icon_layer));\n\n  temperature_layer = text_layer_create(GRect(0, 100, 144, 68));\n  text_layer_set_text_color(temperature_layer, GColorWhite);\n  text_layer_set_background_color(temperature_layer, GColorClear);\n  text_layer_set_font(temperature_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));\n  text_layer_set_text_alignment(temperature_layer, GTextAlignmentCenter);\n  text_layer_set_text(temperature_layer, temperature);\n\n  Tuplet initial_values[] = {\n    TupletInteger(WEATHER_ICON_KEY, (uint8_t) 1),\n    TupletCString(WEATHER_TEMPERATURE_KEY, \"1234\\u00B0C\"),\n  };\n  app_sync_init(&sync, sync_buffer, sizeof(sync_buffer), initial_values, ARRAY_LENGTH(initial_values),\n      sync_tuple_changed_callback, sync_error_callback, NULL);\n\n  layer_add_child(window_layer, text_layer_get_layer(temperature_layer));\n}\n\nstatic void window_unload(Window *window) {\n  app_sync_deinit(&sync);\n\n  if (icon_bitmap) {\n    gbitmap_destroy(icon_bitmap);\n  }\n\n  text_layer_destroy(temperature_layer);\n  bitmap_layer_destroy(icon_layer);\n}\n\nstatic void init() {\n  window = window_create();\n  window_set_background_color(window, GColorBlack);\n  window_set_fullscreen(window, true);\n  window_set_window_handlers(window, (WindowHandlers) {\n    .load = window_load,\n    .unload = window_unload\n  });\n\n  const int inbound_size = 64;\n  const int outbound_size = 16;\n  app_message_open(inbound_size, outbound_size);\n\n  const bool animated = true;\n  window_stack_push(window, animated);\n}\n\nstatic void deinit() {\n  window_destroy(window);\n}\n\nint main(void) {\n  init();\n  app_event_loop();\n  deinit();\n}\n"
  },
  {
    "path": "weather-demo/weather/wscript",
    "content": "\n#\n# This file is the default set of rules to compile a Pebble project.\n#\n# Feel free to customize this to your needs.\n#\n\ntop = '.'\nout = 'build'\n\ndef options(ctx):\n    ctx.load('pebble_sdk')\n\ndef configure(ctx):\n    ctx.load('pebble_sdk')\n\ndef build(ctx):\n    ctx.load('pebble_sdk')\n\n    ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'),\n                    target='pebble-app.elf')\n\n    ctx.pbl_bundle(elf='pebble-app.elf',\n                   js=ctx.path.ant_glob('src/js/**/*.js'))\n"
  }
]